2017-03-08 4 views
2

Die Dokumentation besagt, dass der bevorzugte Weg, um eine Route zu definieren, ist ein Schrägstrich enthalten:Flask POSTs mit nachgestellten Schrägstrich

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

Auf diese Weise kann ein Client GET /foo oder GET /foo/ und das gleiche Ergebnis erhalten.

POSTed-Methoden haben jedoch nicht das gleiche Verhalten.

 
from flask import Flask 
app = Flask(__name__) 

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

app.run(port=5000) 

hier, wenn Sie POST /foo, wird es mit method not allowed fehlschlagen, wenn Sie nicht im Debug-Modus ausgeführt werden, oder es wird mit dem folgenden Hinweis fehlschlagen, wenn Sie im Debug-Modus sind:

Eine Anfrage wurde an diese URL gesendet (http://localhost:5000/foo), aber eine Weiterleitung wurde automatisch vom Routing-System an " http://localhost:5000/foo/". Die URL wurde mit einem nachgestellten Schrägstrich definiert, sodass Flask automatisch auf die URL mit dem nachfolgenden Schrägstrich umleitet, wenn auf sie zugegriffen wurde. Achten Sie darauf, direkt Ihre POST-Anfrage an diese URL zu senden, da wir nicht Browser machen kann oder HTTP-Clients umleiten mit Formulardaten zuverlässig oder ohne Zutun des Benutzers


Darüber hinaus scheint es, dass Sie nicht einmal das tun kann :

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

Oder diese:

 
@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" 

Gibt es eine Möglichkeit, POST mit nicht-nachlaufenden und nachfolgenden Schrägstrichen arbeiten zu lassen?

Antwort

0

können Sie prüfen, request.path ob /foo/ oder nicht, dann umleiten, wo Sie wollen:

@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 
0

Bitte auf dieses Thema beziehen: Trailing slash triggers 404 in Flask path rule

Sie strenge Schrägstriche deaktivieren können Ihre Bedürfnisse zu unterstützen

Weltweit:

app = Flask(__name__) 
app.url_map.strict_slashes = False 

... oder pro Strecke

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

Sie können auch diese Verbindung überprüfen. Es gibt eine separate Diskussion über Github zu diesem Thema. https://github.com/pallets/flask/issues/1783

Verwandte Themen