How do I get the different parts of a Flask request's url?
Solution 1
You can examine the url through several Request
fields:
Imagine your application is listening on the following application root:
http://www.example.com/myapplication
And a user requests the following URI:
http://www.example.com/myapplication/foo/page.html?x=y
In this case the values of the above mentioned attributes would be the following:
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/
You can easily extract the host part with the appropriate splits.
Solution 2
another example:
request:
curl -XGET http://127.0.0.1:5000/alert/dingding/test?x=y
then:
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
Solution 3
you should try:
request.url
It suppose to work always, even on localhost (just did it).
Solution 4
If you are using Python, I would suggest by exploring the request object:
dir(request)
Since the object support the method dict:
request.__dict__
It can be printed or saved. I use it to log 404 codes in 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')
Dogukan Tufekci
Updated on July 08, 2022Comments
-
Dogukan Tufekci almost 2 years
I want to detect if the request came from the
localhost:5000
orfoo.herokuapp.com
host and what path was requested. How do I get this information about a Flask request? -
Vadim about 8 yearsI am trying to get
Request.root_url
and as return I get only<werkzeug.utils.cached_property object>
instead of nicely formattedhttp://www.example.com/myapplication/
. Or this feature does not work on localhost? -
selfboot almost 8 years@Vadim You should use request.root_url, not Request.root_url.
-
Ulysse BN over 7 yearsnew to Flask, i didn’t know where request object come from and how it works, here it is: flask.pocoo.org/docs/0.12/reqcontext
-
zerocog almost 7 yearsrequest.url_root works for me, whereas request.root_url and Request.root_url fail. Therefore, watch for the cap 'R' and url_root versus root_url
-
moto over 5 yearsurl_root returns
http://www.example.com/
nothttp://www.example.com/myapplication/
base_url returnshttp://www.example.com/myapplication/
-
pfabri almost 5 yearsThis should be the accepted answer, as it has a lot more detail to it.
-
Tao Starbow almost 5 yearsThis is a great answer. Very useful and complete.
-
user4772933 over 4 yearsmy app route is like @app.route('/index/<int:id1>/<int:id2>') how can i guest path from request without variables. I expect /index in result. Which flask function to use?
-
Peilonrayz over 3 years@Ian
Request
is a class where you interact with them throughrequest
which is an instance. This answer doesn't talk about the instance only the class. Leaving one to wonder "how I getz instance?" -
booshong over 3 years@Peilonrayz that's a good point! The answer could be more explicit with how to use/reference those fields, though arguably the linked documentation helps with that. (and to be super pedantic,
request
is actually a proxy). But you're right; For the average user an explicit reference to plainrequest.path
etc would be easier to digest. -
AnnieFromTaiwan over 3 yearsFor people who want to use
request.full_path
, suggest to userequest.environ['RAW_URI']
instead. Because, when the actual full query path is/alert/dingding/test
,request.full_path
returns/alert/dingding/test?
, an extra question mark will be added to the result, which might not be desirable. -
Abhay Bh over 2 yearsThanks! This detailed information helped a lot. Really appreciated.
-
Anonymous12332313 over 2 yearsThis is a great and very detailed answer
-
PYK over 2 yearsrequest.remote_addr for 127.0.0.1