【问题标题】:How to handle a put request from the browser in Flask? [duplicate]如何在 Flask 中处理来自浏览器的 put 请求? [复制]
【发布时间】:2015-12-24 03:28:50
【问题描述】:

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

【问题讨论】:

    标签: python flask hidden-field


    【解决方案1】:

    这与 Flask 没有任何关系(我想除了你的模板引擎附带了它)——你仍然需要生成一个 HTML 页面来告诉浏览器使用 PUT.

    HTML form 元素不能直接用于 POSTGET 以外的任何内容,因此对其他方法的任何支持都应通过 javascript 中的 XMLHttpRequest 完成.

    也可以通过 POST 通过隐藏字段(如上所示)并让服务器为您进行转换来“隧道”其他请求方法,但这并不是特别有效.你可以在 previous SO question 中看到一个这样的例子,虽然我不推荐这个而不是 XMLHttpRequest,因为它需要你可能不应该依赖的服务器支持。

    【讨论】:

      【解决方案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 库(例如,jquery.rest

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-30
        • 2020-07-28
        • 2019-06-14
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多