web-dev-qa-db-fra.com

Faire une demande POST lors de la redirection dans flask

Je travaille avec un flacon. Je suis dans une situation où je dois rediriger une demande de publication vers une autre URL en préservant la méthode de demande, c'est-à-dire la méthode "POST". Lorsque j'ai redirigé une demande "GET" vers une autre URL qui accepte la méthode de demande "GET", c'est bien. Voici un exemple de code avec lequel j'essaie ce qui précède ..

@app.route('/start',methods=['POST'])
def start():
    flask.redirect(flask.url_for('operation'))

@app.route('/operation',methods=['POST'])
def operation():
    return "My Response"

Je veux faire une requête "POST" à "/ start" url qui en interne fait également une requête "POST" à "/ operation" url. Si je modifie le code comme ceci,

@app.route('/operation',methods=['GET'])
def operation():
    return "My Response"

le code fonctionne très bien pour la requête "GET". Mais je veux pouvoir faire une demande POST aussi.

42
ln2khanal

La fonction redirect fournie dans Flask envoie un code d'état 302 au client par défaut, et comme mentionné sur Wikipedia :

De nombreux navigateurs Web ont implémenté ce code d'une manière qui ne respectait pas cette norme, en changeant le type de demande de la nouvelle demande en GET, quel que soit le type utilisé dans la demande d'origine (par exemple POST). [1] Pour cette raison, HTTP/1.1 (RFC 2616) a ajouté les nouveaux codes d'état 303 et 307 pour lever l'ambiguïté entre les deux comportements, 303 rendant obligatoire le changement de type de demande en GET et 307 préservant le type de demande tel qu'il a été envoyé à l'origine.

Ainsi, l'envoi d'un code d'état 307 au lieu de 302 devrait indiquer au navigateur de conserver la méthode HTTP utilisée et donc d'avoir le comportement que vous attendez. Votre appel à redirect ressemblerait alors à ceci:

flask.redirect(flask.url_for('operation'), code=307)
87
mdeous