Nguyên nhân của Lỗi yêu cầu không hợp lệ khi gửi biểu mẫu trong ứng dụng Flask là gì?


79

Sau khi đọc nhiều vấn đề về âm thanh tương tự và các tài liệu liên quan về Flask, tôi dường như không thể tìm ra điều gì đang tạo ra lỗi sau khi gửi biểu mẫu:

400 Yêu cầu Không hợp lệ

Trình duyệt (hoặc proxy) đã gửi một yêu cầu mà máy chủ này không thể hiểu được.

Mặc dù biểu mẫu luôn hiển thị đúng cách, nhưng yêu cầu không hợp lệ xảy ra khi tôi gửi biểu mẫu HTML liên quan đến một trong các chức năng sau:

@app.route('/app/business', methods=['GET', 'POST'])
def apply_business():
    if request.method == 'POST':    
        new_account = Business(name=request.form['name_field'], email=request.form['email_field'], account_type="business", 
            q1=request.form['q1_field'], q2=request.form['q2_field'], q3=request.form['q3_field'], q4=request.form['q4_field'], 
            q5=request.form['q5_field'], q6=request.form['q6_field'], q7=request.form['q7_field'],
            account_status="pending", time=datetime.datetime.utcnow())
        db.session.add(new_account)
        db.session.commit()
        session['name'] = request.form['name_field']    
        return redirect(url_for('success'))
    return render_template('application.html', accounttype="business")          

@app.route('/app/student', methods=['GET', 'POST'])
def apply_student():    
    if request.method == 'POST':    
        new_account = Student(name=request.form['name_field'], email=request.form['email_field'], account_type="student", 
            q1=request.form['q1_field'], q2=request.form['q2_field'], q3=request.form['q3_field'], q4=request.form['q4_field'], 
            q5=request.form['q5_field'], q6=request.form['q6_field'], q7=request.form['q7_field'], q8=request.form['q8_field'], 
            q9=request.form['q9_field'], q10=request.form['q10_field'],
            account_status="pending", time=datetime.datetime.utcnow())
        db.session.add(new_account)
        db.session.commit()
        session['name'] = request.form['name_field']    
        return redirect(url_for('success')) 
    return render_template('application.html', accounttype="student")

Phần có liên quan của HTML là

<html>
<head>
    <title>apply</title>
</head>
<body>
    {% if accounttype=="business" %}
    <form action="{{ url_for('apply_business') }}" method=post class="application_form">
    {% elif accounttype=="student" %}
    <form action="{{ url_for('apply_student') }}" method=post class="application_form">     
    {% endif %} 
    <p>Full Name:</p>
    <input name="name_field" placeholder="First and Last">
    <p>Email Address:</p>
    <input name="email_field" placeholder="your@email.com">
    ...

Vấn đề đối với hầu hết mọi người không phải là gọi GEThoặc POST, nhưng tôi chỉ đang làm điều đó trong cả hai chức năng và tôi đã kiểm tra kỹ để đảm bảo rằng tôi đã nhập mọi thứ cần thiết, chẳng hạn như from flask import request. Tôi cũng đã truy vấn cơ sở dữ liệu và xác nhận rằng các bổ sung từ biểu mẫu không được thêm vào.

Trong ứng dụng Flask, tôi đã yêu cầu các trường biểu mẫu được gắn nhãn hơi khác trong biểu mẫu HTML. Giữ tên nhất quán là điều bắt buộc. Có thể đọc thêm tại câu hỏi này Lỗi gửi biểu mẫu, Bình



@SeanVieira Tôi có; mặc dù gây ra cùng một lỗi, vấn đề dường như phát sinh từ việc anh ta cố gắng gửi một biểu mẫu từ hai nút khác nhau trên cùng một trang - vấn đề là ở chỗ phân biệt giữa hai nút - trong khi tôi chỉ có một nút duy nhất gọi ĐĂNG.
zch

5
Chuckles Xin lỗi, lẽ ra phải rõ ràng hơn - "Flask phát sinh lỗi HTTP khi không tìm thấy khóa trong từ điển args và biểu mẫu" - một trong những trường bạn đang cố gắng truy cập request.formkhông có ở đó (ví dụ: bạn đang gửi name_feildvà tìm kiếm cho name_field- lưu ý lỗi chính tả), do đó lỗi. (Cài đặt app.debug = Truesẽ giúp bạn tìm ra lỗi).
Sean Vieira

Câu trả lời:


135

Giải pháp rất đơn giản và được phát hiện trong các bình luận. Như đã giải quyết trong câu hỏi này, lỗi gửi biểu mẫu, Flask , và được chỉ ra bởi Sean Vieira ,

... vấn đề là Flask gây ra lỗi HTTP khi không tìm thấy khóa trong từ điển args và biểu mẫu. Điều mà Flask giả định theo mặc định là nếu bạn đang yêu cầu một khóa cụ thể và nó không có ở đó thì thứ gì đó đã bị loại khỏi yêu cầu và toàn bộ yêu cầu không hợp lệ.

Nói cách khác, nếu chỉ một phần tử biểu mẫu mà bạn yêu cầu bằng Python không được tìm thấy trong HTML, thì yêu cầu POST không hợp lệ và lỗi xuất hiện, trong trường hợp của tôi mà không có bất kỳ bất thường nào trong quá trình truy xuất. Đối với tôi, đó là sự thiếu nhất quán về chính tả: trong HTML, tôi gắn nhãn các đầu vào biểu mẫu khác nhau

<input name="question1_field" placeholder="question one">

trong khi bằng Python, khi có một POST được gọi, tôi lấy một biểu mẫu không tồn tại với

request.form['question1']

trong khi, để nhất quán với tên biểu mẫu HTML của tôi, nó cần phải

request.form['question1_field']

Tôi hi vọng cái này giúp được.


11
Bạn cũng có thểrequest.form.get('key', default_value)
OdraEncoded

1
@OdraEncoded bạn giải pháp đã khắc phục sự cố. Tôi không nghĩ đến điều đó, nhưng dict.get()trả về Nonean toàn hơn so với việc truy cập trực tiếp bằng khóa có thể gây ra KeyErrorvà do đó làm hỏng ứng dụng.
Pie 'Oh' Pah

<input name = "must_match">
jasonleonhard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.