2012-08-19 12 views
10

के साथ असामान्य प्रारंभिक व्यवहार के साथ खराब अनुरोध त्रुटि मैं फ्लास्क, पायथन और एचटीएमएल का उपयोग कर एक वेब ऐप लिख रहा हूं। मेरे मुद्दा यह है कि पहली बार मैं किसी वेबपृष्ठ को लोड है, मैं निम्न त्रुटिफ्लास्क, पायथन, एचटीएमएल, flask.request.form

गलत अनुरोध ब्राउज़र (या प्रॉक्सी) एक अनुरोध है कि इस सर्वर नहीं समझ सकता भेजा मिलता है।

मैं "धोखा देना" पहले किसी भी flask.request.form कॉल के बिना यह चल रहा है, और उसके बाद (विवरण नीचे) में उन्हें वापस रख कर अंत में लोड करने के लिए पेज प्राप्त करने में सक्षम हूँ। मेरे प्रारंभ में कुछ गलत होना चाहिए। मैं flask पर नया हूं और HTML के साथ उपयोग कर रहा हूं।

मान लें कि मैं example नामक निर्देशिका से काम कर रहा हूं। मैं एक अजगर स्क्रिप्ट test.py कहा जाता है और निम्न निर्देशिका संरचना के साथ test.html कहा जाता है एक HTML टेम्पलेट है:

\example\test.py 
\example\templates\test.html 

मेरे अजगर स्क्रिप्ट test.py है:

import sys 
import flask, flask.views 
app = flask.Flask(__name__) 
app.secret_key = "bacon" 

class View(flask.views.MethodView): 
    def get(self): 
     result = flask.request.form['result'] 
     return flask.render_template('test.html', result=result) 
#  return flask.render_template('test.html') 
    def post(self): 
     return self.get() 

app.add_url_rule('/', view_func=View.as_view('main'), methods=['GET', 'POST']) 
app.debug = True 
app.run() 

और test.html में मेरी एचटीएमएल

<html> 
    <head> 
    </head> 
    <body> 
     <form action="/" method="post"> 
      Enter something into the box: 
      <input type="text" name="result"/><br> 
      <input type="submit" value="Execute!"/> 
     </form> 
    </body> 
</html> 
है

त्रुटि को पुन: उत्पन्न करने के चरण

1: test.py स्क्रिप्ट चलाएँ, और एक ब्राउज़र में URL को खोलने

Running on http://127.0.0.1:5000/ 

आपको निम्न त्रुटि

गलत अनुरोध देखना चाहिए ब्राउज़र (या प्रॉक्सी) एक अनुरोध भेजा कि यह सर्वर समझ में नहीं आया।

2: def get(self) समारोह के पहले 2 लाइनों बाहर टिप्पणी और def get(self) समारोह के 3 लाइन uncomment ताकि test.py इस

import sys 
import flask, flask.views 
app = flask.Flask(__name__) 
app.secret_key = "bacon" 

class View(flask.views.MethodView): 
    def get(self): 
#  result = flask.request.form['result'] 
#  return flask.render_template('test.html', result=result) 
     return flask.render_template('test.html') 
    def post(self): 
     return self.get() 

app.add_url_rule('/', view_func=View.as_view('main'), methods=['GET', 'POST']) 
app.debug = True 
app.run() 

3 की तरह दिखता है: यूआरएल ताज़ा, और आप देखेंगे वह चीजें काम करती हैं (हालांकि मैं अंततः result

4: अब उन पंक्तियों को स्विच करें जिन्हें दोबारा टिप्पणी की गई है। Ie, def get(self) फ़ंक्शन और कमेन की पहली 2 पंक्तियों को अनदेखा करना चाहते हैं def get(self) समारोह के 3 लाइन बाहर टी ताकि test.py इस

import sys 
import flask, flask.views 
app = flask.Flask(__name__) 
app.secret_key = "bacon" 

class View(flask.views.MethodView): 
    def get(self): 
     result = flask.request.form['result'] 
     return flask.render_template('test.html', result=result) 
#  return flask.render_template('test.html') 
    def post(self): 
     return self.get() 

app.add_url_rule('/', view_func=View.as_view('main'), methods=['GET', 'POST']) 
app.debug = True 
app.run() 

5 की तरह दिखता है: यूआरएल ताज़ा और अब आप देख बातें इच्छानुसार काम हो जाएगा।

यह एक खिलौना उदाहरण है जो इस अजीब व्यवहार को प्रदर्शित करने वाली असली समस्या का वर्णन करता है कि मुझे अपने ब्राउज़र को मुझे इस वेबपृष्ठ को दिखाने में "चाल" कैसे करना है।

उत्तर

27

यहां मुद्दा यह है कि आप POST एड वेरिएबल्स को उस विधि में एक्सेस करने का प्रयास कर रहे हैं जो केवल GET अनुरोधों को संभालेगा। जब आप एक क्वेरी स्ट्रिंग या POST पैरामीटर तक पहुंचने का प्रयास करते हैं जो Flask will, by default, raise a BadRequest error सेट नहीं है (क्योंकि आप कुछ ऐसा मांग रहे हैं जो पृष्ठ को मारने वाले व्यक्ति को आपूर्ति नहीं करता है)।

क्या होता है यदि कुंजी विशेषता विशेषता में मौजूद नहीं है? उस मामले में एक विशेष कीरर उठाया जाता है। आप इसे मानक कीररर की तरह पकड़ सकते हैं लेकिन यदि आप ऐसा नहीं करते हैं, तो इसके बजाय एक HTTP 400 खराब अनुरोध त्रुटि पृष्ठ दिखाया गया है। तो कई स्थितियों के लिए आपको उस समस्या से निपटने की ज़रूरत नहीं है।

आप या तो request.args (जीईटी) या request.form (बाद का) से एक चर का उपयोग करने की जरूरत है और आप जरूरत यह अगर यह नहीं है get विधि का उपयोग मूल्य प्राप्त करने के लिए सेट किया जा करने के लिए नहीं है (या तो । महान विवरण के लिए

import sys 
import flask, flask.views 

app = flask.Flask(__name__) 

app.secret_key = "bacon" 
app.debug = True 


class View(flask.views.MethodView): 
    def get(self): 
     """Enable user to provide us with input""" 
     return self._default_actions() 

    def post(self): 
     """Map user input to our program's inputs - display errors if required""" 
     result = flask.request.form['result'] 
     # Alternately, if `result` is not *required* 
     # result = flask.request.form.get("result") 
     return self._default_actions(result=result) 

    def _default_actions(self, result=None): 
     """Deal with the meat of the matter, taking in whatever params we need 
     to get or process our information""" 
     if result is None: 
      return flask.render_template("test.html") 
     else: 
      return flask.render_template("test.html", result=result) 

app.add_url_rule('/', view_func=View.as_view('main'), methods=['GET', 'POST']) 

if __name__ == "__main__": 
    app.run() 
+0

भयानक धन्यवाद: None यह सेट नहीं है

# Will default to None your_var = request.form.get("some_key") # Alternately: your_var = request.form.get("some_key", "alternate_default_value") 

अपने कोड की संरचना का एक वैकल्पिक तरीका है ! – erin

+0

यह फ्लास्क में डिफ़ॉल्ट अनुरोध मानों को कार्यान्वित करने के तरीके पर एक महान स्पष्टीकरण है। धन्यवाद। – earthmeLon

+0

मैं एक अपाचे सर्वर पर फ्लास्क ऐप चला रहा हूं। कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, मुझे एक बुरा अनुरोध त्रुटि मिलती है। 'ब्राउज़र ने एक प्रतिक्रिया भेजी' आदि क्या यह मेरे सर्वर के साथ कुछ करना है? –