Làm cách nào để có được các phần khác nhau của url yêu cầu Flask?


143

Tôi muốn phát hiện nếu yêu cầu đến từ localhost:5000hoặc foo.herokuapp.commáy chủ lưu trữ và đường dẫn nào được yêu cầu. Làm cách nào để biết thông tin này về yêu cầu Flask?

Câu trả lời:


235

Bạn có thể kiểm tra url thông qua một số Requesttrường :

Một người dùng yêu cầu URL sau:

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

Trong trường hợp này, các giá trị của các thuộc tính được đề cập ở trên sẽ là như sau:

    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/

Bạn có thể dễ dàng trích xuất phần máy chủ với các phần tách thích hợp.


5
Tôi đang cố gắng để có được Request.root_urlvà khi trở về, tôi chỉ nhận được <werkzeug.utils.cached_property object>thay vì định dạng độc đáo http://www.example.com/myapplication/. Hoặc tính năng này không hoạt động trên localhost?
Vadim

4
@Vadim Bạn nên sử dụng request.root_url, không phải Request.root_url.
selfboot

1
Mới sử dụng Flask, tôi không biết đối tượng yêu cầu đến từ đâu và hoạt động như thế nào, đây là: Vase.pocoo.org/docs/0.12/reqcontext
Ulysse BN

3
request.url_root hoạt động với tôi, trong khi request.root_url và Request.root_url không thành công. Do đó, hãy xem nắp 'R' và url_root so với root_url
zerocog

url_root trả về http://www.example.com/không phải là http://www.example.com/myapplication/ return_url trả vềhttp://www.example.com/myapplication/
moto

170

một vi dụ khac:

yêu cầu:

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

sau đó:

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
Đây phải là câu trả lời được chấp nhận, vì nó có nhiều chi tiết hơn cho nó.
pfabri

1
Đây là một câu trả lời tuyệt vời. Rất hữu ích và đầy đủ.
Tao Starbow

10

bạn nên thử:

request.url 

Nó giả sử hoạt động luôn, ngay cả trên localhost (vừa mới làm).


1

Nếu bạn đang sử dụng Python, tôi sẽ đề xuất bằng cách khám phá đối tượng yêu cầu:

dir(request)

Vì đối tượng hỗ trợ phương thức dict :

request.__dict__

Nó có thể được in hoặc lưu. Tôi sử dụng nó để đăng nhập mã 404 trong 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')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.