Como obtenho as diferentes partes do URL de uma solicitação do Flask?

143

Quero detectar se a solicitação veio do host localhost:5000ou foo.herokuapp.come qual caminho foi solicitado. Como obtenho essas informações sobre uma solicitação do Flask?

Dogukan Tufekci
fonte

Respostas:

235

Você pode examinar o URL através de vários Requestcampos :

Um usuário solicita o seguinte URL:

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

Nesse caso, os valores dos atributos acima mencionados seriam os seguintes:

    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/

Você pode extrair facilmente a parte do host com as divisões apropriadas.

icecrime
fonte
5
Estou tentando obter Request.root_urle, como retorno, recebo apenas em <werkzeug.utils.cached_property object>vez de ser bem formatado http://www.example.com/myapplication/. Ou esse recurso não funciona no host local?
Vadim
4
@Vadim Você deve usar request.root_url, não Request.root_url.
Auto
1
novo no Flask, eu não sabia de onde veio o objeto de solicitação e como ele funciona, aqui está: flask.pocoo.org/docs/0.12/reqcontext
Ulysse BN
3
request.url_root funciona para mim, enquanto request.root_url e Request.root_url falham. Portanto, preste atenção no limite 'R' e no url_root versus root_url
zerocog
retorna url_root http://www.example.com/não retorna http://www.example.com/myapplication/ base_urlhttp://www.example.com/myapplication/
moto
170

outro exemplo:

solicitação:

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

então:

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
fonte
4
Essa deve ser a resposta aceita, pois possui muito mais detalhes.
pfabri 14/06/19
1
Esta é uma ótima resposta. Muito útil e completo.
Tao Starbow 28/06/19
10

Você deveria tentar:

request.url 

Supõe-se que funcione sempre, mesmo no host local (apenas o fiz).

Correu
fonte
1

Se você estiver usando Python, sugiro explorar o objeto request:

dir(request)

Como o objeto suporta o dict do método :

request.__dict__

Pode ser impresso ou salvo. Eu o uso para registrar códigos 404 no 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
fonte