फ्लास्क एप्लिकेशन में फॉर्म सबमिट करते समय खराब अनुरोध त्रुटि का क्या कारण है?


79

कई समान लगने वाली समस्याओं और संबंधित फ्लास्क डॉक्स को पढ़ने के बाद, मुझे यह पता नहीं लग सकता है कि निम्नलिखित जमा करने पर निम्नलिखित त्रुटि उत्पन्न हो रही है:

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। मैंने डेटाबेस की भी पुष्टि की और पुष्टि की कि फॉर्म से परिवर्धन नहीं जोड़ा गया था।

फ्लास्क ऐप में, मैं उन फॉर्म फ़ील्ड का अनुरोध कर रहा था, जिन्हें HTML फॉर्म में थोड़ा अलग लेबल किया गया था। नाम लगातार रखना एक जरूरी है। इस प्रश्न पर अधिक पढ़ा जा सकता है फॉर्म भेजने में त्रुटि, फ्लास्क



@ सीनवीरा मेरे पास है; हालांकि एक ही त्रुटि के कारण, समस्या उस पर उत्पन्न हुई जो एक ही पृष्ठ पर दो अलग-अलग बटन से एक फॉर्म सबमिट करने की कोशिश कर रही थी - समस्या दोनों के बीच अंतर करने में थी - जबकि मेरे पास केवल एक ही बटन है जिसे POST कहा जाता है।
zch

5
चकल्स क्षमा करें, अधिक स्पष्ट होना चाहिए था - "फ्लास्क एक HTTP त्रुटि उठाता है जब यह आर्ग्स में एक कुंजी खोजने में विफल रहता है और शब्दकोशों बनाता है" - जिन क्षेत्रों में आप पहुंचने का प्रयास कर रहे हैं उनमें से एक request.formवहां नहीं है (जैसे आप भेज रहे हैं name_feildऔर देख रहे हैं के लिए name_field- गलत वर्तनी पर ध्यान दें), इस प्रकार त्रुटि। (सेटिंग app.debug = Trueआपको त्रुटि खोजने में मदद करेगी)।
सीन विएरा

जवाबों:


135

समाधान सरल और टिप्पणियों में खुला था। जैसा कि इस सवाल में कहा गया है, फॉर्म भेजने में त्रुटि, फ्लास्क , और सीन विएरा द्वारा इंगित ,

... मुद्दा यह है कि फ्लास्क एक HTTP त्रुटि उठाता है जब यह आर्ग्स में एक कुंजी खोजने में विफल रहता है और शब्दकोशों बनाता है। क्या फ्लास्क डिफ़ॉल्ट रूप से मानता है कि यदि आप किसी विशेष कुंजी के लिए पूछ रहे हैं और यह वहां नहीं है, तो कुछ अनुरोध के लिए छोड़ दिया गया है और संपूर्ण अनुरोध अमान्य है।

दूसरे शब्दों में, यदि Python में आपके द्वारा अनुरोध किया गया केवल एक फ़ॉर्म तत्व HTML में नहीं मिल सकता है, तो POST अनुरोध मान्य नहीं है और त्रुटि प्रकट होती है, मेरे मामले में ट्रेसबैक में कोई अनियमितता के बिना। मेरे लिए, यह वर्तनी की निरंतरता की कमी थी: HTML में, मैंने विभिन्न फॉर्म इनपुटों को लेबल किया

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

पायथन में रहते हुए, जब एक POST कहा जाता था, तो मैं एक साथ कोई भी रूप नहीं पकड़ता

request.form['question1']

जबकि, मेरे HTML फॉर्म नामों के अनुरूप होने के लिए, यह होना चाहिए

request.form['question1_field']

आशा है कि ये आपकी मदद करेगा।


11
आप यह भी कर सकते हैंrequest.form.get('key', default_value)
OdraEncoded

1
@OdraEncoded आप समाधान समस्या का समाधान किया। मैंने इसके बारे में नहीं सोचा था, लेकिन dict.get()रिटर्न Noneजो कि सीधे कुंजी का उपयोग करने की तुलना में सुरक्षित है जो कि कारण KeyErrorऔर इसलिए ऐप को क्रैश कर सकता है ।
पाई 'ओह' पाह डे

<input name = "must_match">
jasonleonhard
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.