如何在 Flask 中处理来自浏览器的放置请求?
How to handle a put request from the browser in Flask?
来自 express.js 背景,我非常习惯方法覆盖中间件,它使您能够通过隐藏的输入标记处理非浏览器支持的 HTTP 动词(例如 PUT、DELETE 等)。
例如)
<input type="hidden" name="_method" value="PUT">
如何在 Flask 中模拟这个中间件? Flask 不会自动处理这些隐藏的输入,所以我无法处理 GET 或 POST 以外的请求。可以在下面找到我的代码的摘录。
@blueprint.route('/news/<int:article_id>', methods=['GET','PUT','DELETE'])
def article(article_id):
if is_logged_in() and is_admin():
if request.method == 'PUT':
#do something
<form action="/news/{{ post.id }}" method="post">
{{ form.hidden_tag() }}
<input type="hidden" name="_method" value="PUT">
{{ form.title.label }} {{ form.title }}
{{ form.body.label }} {{ form.body }}
{{ form.submit }}
</form>
编辑:找到解决方案:
http://flask.pocoo.org/snippets/38/
这与 Flask 没有任何关系(除了你的模板引擎,我想)——你仍然需要生成一个 HTML 页面,告诉浏览器使用 PUT.
HTML form
元素只能用于 POST 或 GET,因此对其他方法的任何支持都应通过 javascript 中的 XMLHttpRequest
完成。
也可以通过 POST "tunnel" 其他请求方法,方法是设置一个隐藏字段(如上所示)并设置服务器为您进行转换,但效率不是特别高。您可以在 previous SO question 中看到这方面的示例,但我不建议在 XMLHttpRequest
中使用它,因为它需要您可能不应该依赖的服务器支持。
我认为flask-restful对你来说是个不错的选择,这里有一个简单的例子:
from flask import Flask, request
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
todos = {}
class TodoSimple(Resource):
def get(self, todo_id):
return {todo_id: todos[todo_id]}
def put(self, todo_id):
todos[todo_id] = request.form['data']
return {todo_id: todos[todo_id]}
api.add_resource(TodoSimple, '/<string:todo_id>')
if __name__ == '__main__':
app.run(debug=True)
我建议你使用一些支持 (PUT,DELETE) 方法的 js 库(例如,jquery.rest)
来自 express.js 背景,我非常习惯方法覆盖中间件,它使您能够通过隐藏的输入标记处理非浏览器支持的 HTTP 动词(例如 PUT、DELETE 等)。
例如)
<input type="hidden" name="_method" value="PUT">
如何在 Flask 中模拟这个中间件? Flask 不会自动处理这些隐藏的输入,所以我无法处理 GET 或 POST 以外的请求。可以在下面找到我的代码的摘录。
@blueprint.route('/news/<int:article_id>', methods=['GET','PUT','DELETE'])
def article(article_id):
if is_logged_in() and is_admin():
if request.method == 'PUT':
#do something
<form action="/news/{{ post.id }}" method="post">
{{ form.hidden_tag() }}
<input type="hidden" name="_method" value="PUT">
{{ form.title.label }} {{ form.title }}
{{ form.body.label }} {{ form.body }}
{{ form.submit }}
</form>
编辑:找到解决方案: http://flask.pocoo.org/snippets/38/
这与 Flask 没有任何关系(除了你的模板引擎,我想)——你仍然需要生成一个 HTML 页面,告诉浏览器使用 PUT.
HTML form
元素只能用于 POST 或 GET,因此对其他方法的任何支持都应通过 javascript 中的 XMLHttpRequest
完成。
也可以通过 POST "tunnel" 其他请求方法,方法是设置一个隐藏字段(如上所示)并设置服务器为您进行转换,但效率不是特别高。您可以在 previous SO question 中看到这方面的示例,但我不建议在 XMLHttpRequest
中使用它,因为它需要您可能不应该依赖的服务器支持。
我认为flask-restful对你来说是个不错的选择,这里有一个简单的例子:
from flask import Flask, request
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
todos = {}
class TodoSimple(Resource):
def get(self, todo_id):
return {todo_id: todos[todo_id]}
def put(self, todo_id):
todos[todo_id] = request.form['data']
return {todo_id: todos[todo_id]}
api.add_resource(TodoSimple, '/<string:todo_id>')
if __name__ == '__main__':
app.run(debug=True)
我建议你使用一些支持 (PUT,DELETE) 方法的 js 库(例如,jquery.rest)