2017-03-08 111 views
2

文檔狀態來定義路由的首選方法是,包括一個尾隨斜線:與尾隨瓶的POST斜線

@app.route('/foo/', methods=['GET']) 
def get_foo(): 
    pass 

這種方式,客戶端可以GET /fooGET /foo/和接收相同的結果。

但是,POST方法不具有相同的行爲。

 
from flask import Flask 
app = Flask(__name__) 

@app.route('/foo/', methods=['POST']) 
def post_foo(): 
    return "bar" 

app.run(port=5000) 

在這裏,如果你POST /foo,它將如果你是不是在調試模式下運行失敗,method not allowed,或者如果你是在調試模式下,它會用以下通知失敗:

請求被髮送到這個URL(http://localhost:5000/foo),但重定向由路由系統自動發佈到" http://localhost:5000/foo/"。 URL是使用尾部斜線定義的,因此如果沒有訪問它,Flask將自動重定向到帶有斜槓的URL。請務必直接發送您的POST請求到這個網址,因爲我們不能讓瀏覽器或HTTP客戶端表單數據重定向可靠或沒有用戶交互


而且,看來,你甚至不能做到這一點:

@app.route('/foo', methods=['POST']) 
@app.route('/foo/', methods=['POST']) 
def post_foo(): 
    return "bar" 

或者這樣:

 
@app.route('/foo', methods=['POST']) 
def post_foo_no_slash(): 
    return redirect(url_for('post_foo'), code=302) 

@app.route('/foo/', methods=['POST']) 
def post_foo(): 
    return "bar" 

有沒有辦法讓POST在非尾隨斜線和尾隨斜線上工作?

回答

0

您可以檢查request.path是否/foo/與否然後重定向它到你想去的地方:

@app.before_request 
def before_request(): 
    if request.path == '/foo': 
     return redirect(url_for('foo'), code=123) 

@app.route('/foo/', methods=['POST']) 
def foo(): 
    return 'foo' 

$ http post localhost:5000/foo 
127.0.0.1 - - [08/Mar/2017 13:06:48] "POST /foo HTTP/1.1" 123