ฉันจะรับส่วนต่าง ๆ ของ URL คำขอของ Flask ได้อย่างไร


144

ฉันต้องการตรวจสอบว่าคำขอมาจากlocalhost:5000หรือfoo.herokuapp.comโฮสต์และขอเส้นทางใด ฉันจะรับข้อมูลเกี่ยวกับคำขอขวดได้อย่างไร

คำตอบ:


235

คุณสามารถตรวจสอบ URL ผ่านหลายRequestช่อง :

ผู้ใช้ร้องขอ URL ต่อไปนี้:

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

ในกรณีนี้ค่าของคุณสมบัติที่กล่าวถึงข้างต้นจะเป็นดังนี้:

    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/

คุณสามารถแยกส่วนโฮสต์ได้อย่างง่ายดายด้วยการแยกที่เหมาะสม


5
ฉันพยายามที่จะได้รับRequest.root_urlและเป็นผลตอบแทนที่ฉันได้รับเพียงการจัดรูปแบบแทนที่จะเป็นอย่างดี<werkzeug.utils.cached_property object> http://www.example.com/myapplication/หรือคุณสมบัตินี้ไม่ทำงานบน localhost?
Vadim

4
@Vadim คุณควรใช้ request.root_url ไม่ใช่ Request.root_url
selfboot

1
ใหม่สำหรับ Flask ฉันไม่ทราบว่าวัตถุคำขอมาจากที่ใดและทำงานอย่างไรนี่คือ: flask.pocoo.org/docs/0.12/reqcontext
Ulysse BN

3
request.url_root ใช้งานได้สำหรับฉันในขณะที่ request.root_url และ Request.root_url ล้มเหลว ดังนั้นให้มองหาหมวก 'R' และ url_root กับ root_url
zerocog

url_root ส่งคืนhttp://www.example.com/ไม่ใช่http://www.example.com/myapplication/ base_url ส่งคืนhttp://www.example.com/myapplication/
moto

171

ตัวอย่างอื่น:

คำขอ:

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

แล้ว:

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
นี่ควรเป็นคำตอบที่ยอมรับเนื่องจากมีรายละเอียดมากขึ้น
pfabri

1
นี่คือคำตอบที่ดี มีประโยชน์มากและสมบูรณ์
Tao Starbow

10

คุณควรลอง:

request.url 

มันน่าจะทำงานได้ตลอดเวลาแม้กระทั่งบน localhost (เพิ่งทำได้)


1

หากคุณใช้ Python ฉันจะแนะนำโดยสำรวจวัตถุคำขอ:

dir(request)

เนื่องจากวัตถุรองรับเมธอดdict :

request.__dict__

มันสามารถพิมพ์หรือบันทึก ฉันใช้เพื่อบันทึกรหัส 404 ใน 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')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.