2015-12-24 36 views
1

來自express.js背景,我非常習慣使用方法重寫中間件,它使您能夠通過隱藏的輸入標記處理非瀏覽器支持的HTTP動詞(例如,PUT,DELETE等)。如何在Flask中處理來自瀏覽器的放入請求?

前)

<input type="hidden" name="_method" value="PUT"> 

如何模仿這種中間件瓶? 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/

回答

3

這並不真的有什麼關係瓶(除了你的模板引擎來了吧,我想) - 你仍然有生成HTML頁面會告訴瀏覽器使用PUT

的HTML元素form不能用於除POST直接拿到其他任何東西,所以對於其他方法的任何支持應通過XMLHttpRequest在JavaScript來完成。

也可以通過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) 

而且我建議你使用的是支持一些JS庫(PUT,DELETE)方法(例如,jquery.rest

相關問題