Flask 애플리케이션에서 양식을 제출할 때 잘못된 요청 오류의 원인은 무엇입니까?


79

비슷한 소리가 나는 문제와 관련 Flask 문서를 읽은 후 양식을 제출할 때 다음 오류가 발생하는 원인을 파악할 수없는 것 같습니다.

400 잘못된 요청

브라우저 (또는 프록시)가이 서버가 이해할 수없는 요청을 보냈습니다.

양식은 항상 제대로 표시되지만 다음 함수 중 하나에 연결된 HTML 양식을 제출하면 잘못된 요청이 발생합니다.

@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")

HTML의 관련 부분은

<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">
    ...

대부분의 사람들에게 문제가 호출되지 않았 GET거나 POST,하지만 두 기능에 그냥 뭐하는 거지, 내가 두 번 같은, 확실히 내가 가져 모든 필요하게 확인 from flask import request. 또한 데이터베이스를 쿼리하여 양식의 추가 사항이 추가되지 않았 음을 확인했습니다.

Flask 앱에서 HTML 양식에서 약간 다른 레이블이 지정된 양식 필드를 요청했습니다. 이름을 일관되게 유지하는 것은 필수입니다. 이 질문 양식 전송 오류, Flask 에서 더 많은 내용을 읽을 수 있습니다.



@SeanVieira 내가 가지고있다; 동일한 오류가 발생했지만 문제는 동일한 페이지에있는 두 개의 다른 버튼에서 양식을 제출하려고 할 때 발생하는 것처럼 보였습니다. 문제는 둘을 구분하는 데 있었지만 POST를 호출하는 버튼은 하나뿐이었습니다.
zch

5
ㅎ ㅎ 죄송합니다, 더 명확 했어야 - "는 인수 및 양식 사전의 키 찾기 위해 실패 할 때 플라스크는 HTTP 오류가 발생"-에 액세스하려고하는 분야 중 하나 request.form가없는 (예를 들어, 당신이 보내는 name_feild찾고 대한 name_field- 잘못된 맞춤법), 따라서 오류를 확인합니다. (설정 app.debug = True하면 오류를 찾는 데 도움이됩니다.)
Sean Vieira

답변:


135

해결책은 간단했고 의견에서 밝혀졌습니다. 이 질문에서 언급했듯이 양식 전송 오류 Flask , Sean Vieira가 지적했습니다 .

... 문제는 Flask가 args에서 키를 찾지 못하고 사전을 형성하지 못할 때 HTTP 오류를 발생 시킨다는 것입니다. Flask가 기본적으로 가정하는 것은 특정 키를 요청하는 경우 해당 키가 없으면 요청에서 누락 된 부분이 있고 전체 요청이 유효하지 않다는 것입니다.

즉, Python에서 요청한 양식 요소 중 하나만 HTML에서 찾을 수없는 경우 POST 요청이 유효하지 않고 오류가 나타납니다. 제 경우에는 역 추적에 이상이 없습니다. 저에게는 철자와 일관성이 부족했습니다. HTML에서 다양한 양식 입력에 레이블을 지정했습니다.

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

Python에서 POST가 호출되었을 때 존재하지 않는 양식을 가져옵니다.

request.form['question1']

반면 내 HTML 양식 이름과 일치하려면

request.form['question1_field']

이게 도움이 되길 바란다.


11
당신도 할 수 있습니다request.form.get('key', default_value)
OdraEncoded

1
@OdraEncoded 솔루션이 문제를 해결했습니다. 나는 그것을 생각하지 않았지만 키를 직접 사용하여 액세스하는 것보다 더 안전한 dict.get()결과 None를 반환 KeyError하여 앱을 충돌 시킬 수 있습니다 .
Pie 'Oh'Pah

<input name = "must_match">
jasonleonhard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.