Bagaimana cara mendapatkan bagian berbeda dari url permintaan Flask?

157

Saya ingin mendeteksi apakah permintaan tersebut berasal dari localhost:5000atau foo.herokuapp.comhost dan jalur apa yang diminta. Bagaimana cara mendapatkan informasi tentang permintaan Flask ini?

Dogukan Tufekci
sumber

Jawaban:

256

Anda dapat memeriksa url melalui beberapa Requestbidang:

Bayangkan aplikasi Anda mendengarkan pada root aplikasi berikut:

http://www.example.com/myapplication

Dan pengguna meminta URI berikut:

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

Dalam hal ini nilai dari atribut yang disebutkan di atas adalah sebagai berikut:

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

Anda dapat dengan mudah mengekstrak bagian host dengan pembagian yang sesuai.

icecrime.dll
sumber
5
Saya mencoba untuk mendapatkan Request.root_urldan sebagai imbalannya saya hanya mendapatkan <werkzeug.utils.cached_property object>bukan diformat dengan baik http://www.example.com/myapplication/. Atau fitur ini tidak berfungsi di localhost?
Vadim
4
@Vadim Anda harus menggunakan request.rooturl, bukan Request.rooturl.
selfboot
1
baru mengenal Flask, saya tidak tahu dari mana objek request berasal dan bagaimana cara kerjanya, ini dia: flask.pocoo.org/docs/0.12/reqcontext
Ulysse BN
3
request.url_root berfungsi untuk saya, sedangkan request.root_url dan Request.root_url gagal. Oleh karena itu, perhatikan cap 'R' dan url_root versus root_url
zerocog
1
url_root mengembalikan http://www.example.com/bukan http://www.example.com/myapplication/ base_url kembalihttp://www.example.com/myapplication/
moto
202

contoh lain:

permintaan:

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

kemudian:

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
sumber
5
Ini harus menjadi jawaban yang diterima, karena memiliki lebih banyak detail.
pfabri
1
Ini jawaban yang bagus. Sangat bermanfaat dan lengkap.
Tao Starbow
10

Kamu harus mencobanya:

request.url 

Seharusnya selalu berfungsi, bahkan di localhost (baru saja melakukannya).

Ran
sumber
1

Jika Anda menggunakan Python, saya sarankan dengan menjelajahi objek permintaan:

dir(request)

Karena objek mendukung metode dikt :

request.__dict__

Itu bisa dicetak atau disimpan. Saya menggunakannya untuk mencatat kode 404 di 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
sumber