如何在Flask中处理来自浏览器的put请求?

时间:2015-12-24 03:28:51

标签: python flask hidden-field

来自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/

2 个答案:

答案 0 :(得分:4)

这与Flask没有任何关系(我想你的模板引擎除了它之外) - 你还需要生成一个HTML页面,告诉浏览器使用 PUT < /强>

HTML form元素不能直接用于 POST GET 以外的任何内容,因此任何对其他方法的支持都应该通过{{1在javascript中。

也可以&#34;隧道&#34;其他请求方法通过 POST 通过隐藏字段(如上所示)并让服务器为您进行转换,但它不是特别有效。您可以在previous SO question中看到此示例,但我不建议XMLHttpRequest,因为它需要您可能不应该依赖的服务器支持。

答案 1 :(得分:-2)

我认为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 libs(例如,jquery.rest