Come posso ottenere le diverse parti dell'URL di una richiesta Flask?


144

Voglio rilevare se la richiesta proviene dal localhost:5000ofoo.herokuapp.com dall'host e quale percorso è stato richiesto. Come posso ottenere queste informazioni su una richiesta Flask?

Risposte:


236

Puoi esaminare l'URL attraverso diversi Requestcampi :

Un utente richiede il seguente URL:

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

In questo caso i valori degli attributi sopra menzionati sarebbero i seguenti:

    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/

È possibile estrarre facilmente la parte host con le suddivisioni appropriate.


5
Sto cercando di ottenere Request.root_urle come ritorno ottengo solo <werkzeug.utils.cached_property object>invece di ben formattato http://www.example.com/myapplication/. O questa funzione non funziona su localhost?
Vadim,

4
@Vadim Dovresti usare request.root_url, non Request.root_url.
avvio automatico

1
nuovo a Flask, non sapevo da dove provenisse l'oggetto richiesta e come funzionasse, eccolo qui: flask.pocoo.org/docs/0.12/reqcontext
Ulysse BN,

3
request.url_root funziona per me, mentre request.root_url e Request.root_url falliscono. Pertanto, osserva il tappo "R" e url_root contro root_url
zerocog

url_root restituisce ritorni http://www.example.com/non http://www.example.com/myapplication/ base_urlhttp://www.example.com/myapplication/
moto

171

un altro esempio:

richiesta:

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

poi:

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

4
Questa dovrebbe essere la risposta accettata, in quanto ha molti più dettagli.
Pfabri,

1
Questa è un'ottima risposta Molto utile e completo.
Tao Starbow,

10

dovresti provare:

request.url 

Supponiamo che funzioni sempre, anche su localhost (appena fatto).


1

Se stai usando Python, suggerirei esplorando l'oggetto richiesta:

dir(request)

Poiché l'oggetto supporta il metodo dict :

request.__dict__

Può essere stampato o salvato. Lo uso per registrare 404 codici in 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')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.