¿Cómo obtengo las diferentes partes de la URL de una solicitud de Flask?

144

Quiero detectar si la solicitud provino del host localhost:5000o foo.herokuapp.comqué ruta se solicitó. ¿Cómo obtengo esta información sobre una solicitud de Flask?

Dogukan Tufekci
fuente

Respuestas:

236

Puede examinar la URL a través de varios Requestcampos :

Un usuario solicita la siguiente URL:

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

En este caso, los valores de los atributos mencionados anteriormente serían los siguientes:

    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/

Puede extraer fácilmente la parte del host con las divisiones apropiadas.

crimen de hielo
fuente
55
Estoy tratando de obtener Request.root_urly, como retorno, obtengo solo en <werkzeug.utils.cached_property object>lugar de un formato agradable http://www.example.com/myapplication/. ¿O esta característica no funciona en localhost?
Vadim
44
@Vadim Debe usar request.root_url, no Request.root_url.
inicio automático
1
nuevo en Flask, no sabía de dónde provenía el objeto de solicitud y cómo funciona, aquí está: flask.pocoo.org/docs/0.12/reqcontext
Ulysse BN
3
request.url_root funciona para mí, mientras que request.root_url y Request.root_url fallan. Por lo tanto, esté atento a la tapa 'R' y url_root versus root_url
zerocog
url_root devuelve http://www.example.com/no http://www.example.com/myapplication/ base_url devuelvehttp://www.example.com/myapplication/
moto
171

otro ejemplo:

solicitud:

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

luego:

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
fuente
44
Esta debería ser la respuesta aceptada, ya que tiene muchos más detalles.
pfabri
1
Esta es una respuesta genial. Muy útil y completo.
Tao Starbow
10

Deberías intentarlo:

request.url 

Se supone que funciona siempre, incluso en localhost (solo lo hice).

Corrió
fuente
1

Si está utilizando Python, sugeriría explorando el objeto de solicitud:

dir(request)

Como el objeto admite el método dict :

request.__dict__

Se puede imprimir o guardar. Lo uso para registrar códigos 404 en 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
fuente