web-dev-qa-db-fra.com

Flacon: obtenir l'itinéraire actuel

Dans Flask, lorsque j'ai plusieurs itinéraires pour la même fonction, comment savoir quel itinéraire est actuellement utilisé?

Par exemple:

@app.route("/antitop/")
@app.route("/top/")
@requires_auth
def show_top():
    ....

Comment puis-je savoir que maintenant on m'a appelé en utilisant /top/ ou /antitop/?

MISE À JOUR

Je connais request_path Je ne veux pas l'utiliser, car la requête peut être assez complexe, et je veux répéter la logique de routage dans la fonction. Je pense que la solution avec url_rule c'est le meilleur.

45
Igor Chubin

la façon la plus "flasque" de vérifier quel itinéraire a déclenché votre vue est, par request.url_rule .

from flask import request

rule = request.url_rule

if 'antitop' in rule.rule:
    # request by '/antitop'

Elif 'top' in rule.rule:
    # request by '/top'
45
thkang

Une autre option consiste à utiliser la variable de noeud final:

@app.route("/api/v1/generate_data", methods=['POST'], endpoint='v1')
@app.route("/api/v2/generate_data", methods=['POST'], endpoint='v2')
def generate_data():
    version = request.endpoint
    return version
26
marcinkuzminski

Si vous souhaitez un comportement différent pour chaque route, la bonne chose à faire est de créer deux gestionnaires de fonctions.

@app.route("/antitop/")
@requires_auth
def top():
    ...

@app.route("/top/")
@requires_auth
def anti_top():
    ...

Dans certains cas, votre structure est logique. Vous pouvez définir des valeurs par itinéraire.

@app.route("/antitop/", defaults={'_route': 'antitop'})
@app.route("/top/", defaults={'_route': 'top'})
@requires_auth
def show_top(_route):
    # use _route here
    ...
7
iurisilvio

Il me semble que si vous avez une situation où cela importe, vous ne devriez pas utiliser la même fonction en premier lieu. Divisez-le en deux gestionnaires distincts, qui appellent chacun une fiction commune pour le code partagé.

0
Daniel Roseman