POST 请求冰冻瓶
POST request with Frozen Flask
在网络上查看示例后,似乎可以在使用 vanilla HTML/CSS/JS 构建的静态网站中使用带有 POST 请求的表单。但是我无法用 Flask 做到这一点。我正在使用 Frozen-Flask library.
我的主要 server.py
脚本在下方(model
和 encoder
已在文件顶部正确加载)
app = Flask(__name__)
app.config['FREEZER_RELATIVE_URLS'] = True
@app.route('/')
def main():
return render_template("index.html")
@app.route('/predict', methods=["POST"])
def predict():
if request.method == "POST":
message = request.form['submission'] # gets submission
prediction = model.predict([message]) # feeds to model
classification = encoder.inverse_transform(prediction) # decodes prediction
return render_template('index.html', message=message, classification=classification)
if __name__ == "__main__":
app.run(debug=True)
以及我的 freeze.py
脚本:
from flask_frozen import Freezer
from server import app
freezer = Freezer(app)
if __name__ == '__main__':
freezer.freeze()
最后,我index.html
的相关部分:
<form class="form-group" action="{{ url_for('predict') }}" method="POST">
<textarea class="form-control" name="submission" id="submission" rows="10"></textarea>
<button type="submit" class="btn btn-primary">Classify</button>
</form>
如果我 运行 python server.py
,也就是普通的 Flask,网站运行良好。它在 http://localhost:5000/
加载,单击分类按钮将我带到 http://localhost:5000/predict/
,屏幕上显示分类。
当我运行 python freeze.py
, aka Frozen-Flask 生成静态网站时,我运行 出错了。
$ python freeze.py
Traceback (most recent call last):
File "freeze.py", line 11, in <module>
freezer.freeze()
File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 199, in freeze
return set(page.url for page in self.freeze_yield())
File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 199, in <genexpr>
return set(page.url for page in self.freeze_yield())
File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 183, in freeze_yield
new_filename = self._build_one(url)
File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 322, in _build_one
% (response.status, url))
ValueError: Unexpected status '405 METHOD NOT ALLOWED' on URL /predict/
我为调查/尝试解决此问题所做的工作:
405 错误表示预测上调用了 POST 以外的 HTTP 请求。所以出于测试目的,我 changed methods=["POST"]
到 methods=["GET"]
。然后我让我的预测页面只呈现正常的主页。
@app.route('/predict/', methods=["GET"])
def predict():
return render_template("index.html")
运行 冻结脚本不再抛出错误。该网站位于 .../build/index.html
,单击“分类”按钮会将我带到 .../build/predict/index.html
。但是预测页面没有用,因为它和主页一样。
我猜测 Frozen-Flask 需要对页面具有 GET 访问权限才能构建它们的静态版本,但我不应该也能够使用 POST 提供的信息更新这些页面吗?或者无法执行 "static"
的那部分定义
从代码中可以看出,Frozen-Flask使用了test_client的GET方法来获取每一个要生成的页面的内容。因此,如果不破解 Frozen-Flask,您将无法使用 POST。
另一方面,GET 请求可以包含 URL 个参数:
/predict?message=123456
所以你可以这样获取你的参数:
request.args.get('message', '')
现在请记住,Forozen-Flask 不知道将什么作为参数发送。
所以我会做的是这样的:
@app.route('/predict', methods=["GET"])
def predict():
message = "some message" # hardcode a value
prediction = model.predict([message]) # feeds to model
classification = encoder.inverse_transform(prediction) # decodes prediction
return render_template('index.html', message=message, classification=classification)
在网络上查看示例后,似乎可以在使用 vanilla HTML/CSS/JS 构建的静态网站中使用带有 POST 请求的表单。但是我无法用 Flask 做到这一点。我正在使用 Frozen-Flask library.
我的主要 server.py
脚本在下方(model
和 encoder
已在文件顶部正确加载)
app = Flask(__name__)
app.config['FREEZER_RELATIVE_URLS'] = True
@app.route('/')
def main():
return render_template("index.html")
@app.route('/predict', methods=["POST"])
def predict():
if request.method == "POST":
message = request.form['submission'] # gets submission
prediction = model.predict([message]) # feeds to model
classification = encoder.inverse_transform(prediction) # decodes prediction
return render_template('index.html', message=message, classification=classification)
if __name__ == "__main__":
app.run(debug=True)
以及我的 freeze.py
脚本:
from flask_frozen import Freezer
from server import app
freezer = Freezer(app)
if __name__ == '__main__':
freezer.freeze()
最后,我index.html
的相关部分:
<form class="form-group" action="{{ url_for('predict') }}" method="POST">
<textarea class="form-control" name="submission" id="submission" rows="10"></textarea>
<button type="submit" class="btn btn-primary">Classify</button>
</form>
如果我 运行 python server.py
,也就是普通的 Flask,网站运行良好。它在 http://localhost:5000/
加载,单击分类按钮将我带到 http://localhost:5000/predict/
,屏幕上显示分类。
当我运行 python freeze.py
, aka Frozen-Flask 生成静态网站时,我运行 出错了。
$ python freeze.py
Traceback (most recent call last):
File "freeze.py", line 11, in <module>
freezer.freeze()
File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 199, in freeze
return set(page.url for page in self.freeze_yield())
File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 199, in <genexpr>
return set(page.url for page in self.freeze_yield())
File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 183, in freeze_yield
new_filename = self._build_one(url)
File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 322, in _build_one
% (response.status, url))
ValueError: Unexpected status '405 METHOD NOT ALLOWED' on URL /predict/
我为调查/尝试解决此问题所做的工作:
405 错误表示预测上调用了 POST 以外的 HTTP 请求。所以出于测试目的,我 changed methods=["POST"]
到 methods=["GET"]
。然后我让我的预测页面只呈现正常的主页。
@app.route('/predict/', methods=["GET"])
def predict():
return render_template("index.html")
运行 冻结脚本不再抛出错误。该网站位于 .../build/index.html
,单击“分类”按钮会将我带到 .../build/predict/index.html
。但是预测页面没有用,因为它和主页一样。
我猜测 Frozen-Flask 需要对页面具有 GET 访问权限才能构建它们的静态版本,但我不应该也能够使用 POST 提供的信息更新这些页面吗?或者无法执行 "static"
的那部分定义从代码中可以看出,Frozen-Flask使用了test_client的GET方法来获取每一个要生成的页面的内容。因此,如果不破解 Frozen-Flask,您将无法使用 POST。
另一方面,GET 请求可以包含 URL 个参数:
/predict?message=123456
所以你可以这样获取你的参数:
request.args.get('message', '')
现在请记住,Forozen-Flask 不知道将什么作为参数发送。 所以我会做的是这样的:
@app.route('/predict', methods=["GET"])
def predict():
message = "some message" # hardcode a value
prediction = model.predict([message]) # feeds to model
classification = encoder.inverse_transform(prediction) # decodes prediction
return render_template('index.html', message=message, classification=classification)