Comment obtenir les différentes parties de l'URL d'une requête Flask?

144

Je souhaite détecter si la demande provient du localhost:5000foo.herokuapp.com hôte ou et quel chemin a été demandé. Comment obtenir ces informations sur une demande Flask?

Dogukan Tufekci
la source

Réponses:

236

Vous pouvez examiner l'url à travers plusieurs Requestchamps :

Un utilisateur demande l'URL suivante:

    http://www.example.com/myapplication/page.html?x=y

Dans ce cas, les valeurs des attributs mentionnés ci-dessus seraient les suivantes:

    path             /page.html
    script_root      /myapplication
    base_url         http://www.example.com/myapplication/page.html
    url              http://www.example.com/myapplication/page.html?x=y
    url_root         http://www.example.com/myapplication/

Vous pouvez facilement extraire la partie hôte avec les divisions appropriées.

la glace
la source
5
J'essaye d'obtenir Request.root_urlet comme retour je reçois seulement <werkzeug.utils.cached_property object>au lieu de joliment formaté http://www.example.com/myapplication/. Ou cette fonctionnalité ne fonctionne pas sur localhost?
Vadim
4
@Vadim Vous devez utiliser request.root_url, pas Request.root_url.
selfboot
1
nouveau sur Flask, je ne savais pas d'où vient l'objet de requête et comment il fonctionne, le voici: flask.pocoo.org/docs/0.12/reqcontext
Ulysse BN
3
request.url_root fonctionne pour moi, alors que request.root_url et Request.root_url échouent. Par conséquent, surveillez le cap 'R' et url_root contre root_url
zerocog
url_root renvoie http://www.example.com/non http://www.example.com/myapplication/ base_url renvoiehttp://www.example.com/myapplication/
moto
171

un autre exemple:

demande:

curl -XGET http://127.0.0.1:5000/alert/dingding/test?x=y

puis:

request.method:              GET
request.url:                 http://127.0.0.1:5000/alert/dingding/test?x=y
request.base_url:            http://127.0.0.1:5000/alert/dingding/test
request.url_charset:         utf-8
request.url_root:            http://127.0.0.1:5000/
str(request.url_rule):       /alert/dingding/test
request.host_url:            http://127.0.0.1:5000/
request.host:                127.0.0.1:5000
request.script_root:
request.path:                /alert/dingding/test
request.full_path:           /alert/dingding/test?x=y

request.args:                ImmutableMultiDict([('x', 'y')])
request.args.get('x'):       y
Chason
la source
4
Cela devrait être la réponse acceptée, car elle contient beaucoup plus de détails.
pfabri le
1
C'est une excellente réponse. Très utile et complet.
Tao Starbow
10

tu devrais essayer:

request.url 

Cela suppose de toujours fonctionner, même sur localhost (vient de le faire).

Ran
la source
1

Si vous utilisez Python, je suggérerais d'explorer l'objet de requête:

dir(request)

Puisque l'objet prend en charge la méthode dict :

request.__dict__

Il peut être imprimé ou enregistré. Je l'utilise pour enregistrer 404 codes dans Flask:

@app.errorhandler(404)
def not_found(e):
    with open("./404.csv", "a") as f:
        f.write(f'{datetime.datetime.now()},{request.__dict__}\n')
    return send_file('static/images/Darknet-404-Page-Concept.png', mimetype='image/png')
Antonio
la source