2012-08-19 10 views
10

フラスコ、Python、HTMLを使用してWebアプリケーションを作成しています。私の問題は、このサーバー が理解できないという要求を送信し、私は、Webページをロードする最初の時間は、私は次のようなエラーにフラスコ、python、HTML、flask.request.formの異常な初期化動作でエラーが発生しました

不正な要求ブラウザ(またはプロキシ)を取得することです。

私が最初にどのflask.request.form呼び出しなしでそれを実行し、その後、(詳細は以下)でそれらをバック入れて「だまし」で最終的にロードするためのページを取得することができますよ。私の初期設定で何かが間違っているはずです。私はflaskに新しく、pythonHTMLを使っています。

私はexampleというディレクトリから作業しているとします。私はPythonスクリプトtest.pyと呼ばれ、次のディレクトリ構造でtest.htmlと呼ばれるHTMLテンプレートがあります。

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

私のPythonスクリプトを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は

<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スクリプトを実行し、ブラウザで

Running on http://127.0.0.1:5000/ 

をURLを開くには、その要求を送信しこのサーバ は理解できませんでした。

2:def get(self)関数の最初の2行をコメントアウトして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のように見えるようにdef get(self)関数の3番目の行のコメントを解除:URLを更新し、あなたが表示されます(私は最終的にはresultの値を返すことができますが、def get(self)関数の最初の2行のコメントを外してcommenを取り消してください。 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のように見えるようにdef get(self)機能の3行目をT:URLを更新し、今あなたが望むようなものが働くことになります参照してください。

これは、このウェブページを私に表示するためにブラウザを "トリック"しなければならないというこの奇妙な振る舞いを示す本当の問題を示すおもちゃの例です。The

答えて

27

GETリクエストのみを処理する方法でPOST ed変数にアクセスしようとしているという問題があります。 Flask will, by default, raise a BadRequest errorに設定されていないクエリ文字列またはPOSTパラメータにアクセスしようとすると(ページに当たった人が提供しなかったものを要求しているため)。

キーがフォーム属性に存在しない場合はどうなりますか?その場合、特別なKeyErrorが発生します。標準のKeyErrorのようにキャッチできますが、そうしないと、代わりにHTTP 400 Bad Requestエラーページが表示されます。だから、多くの状況で、あなたはその問題に対処する必要はありません。

あなたはrequest.args(GET)またはrequest.form(POST)のいずれかから変数にアクセスする必要がある、あなたはは(ある場合は、値を取得するためにgetメソッドを使用設定するを必要としない場合、またはNoneそれが設定されていない場合

# Will default to None 
your_var = request.form.get("some_key") 

# Alternately: 
your_var = request.form.get("some_key", "alternate_default_value") 

をここにあなたのコードを構造化する別の方法です:。!

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

素晴らしい偉大な説明をしてくれてありがとう! – erin

+0

これは、Flaskにデフォルトのリクエスト値を実装する方法の素晴らしい説明です。ありがとうございました。 – earthmeLon

+0

私はApacheサーバー上でFlaskアプリケーションを実行しています。私が何をしても、私は間違ったリクエストエラーを受け取ります。 'ブラウザから応答が送られました'など。私のサーバーと何か関係がありますか? –

関連する問題