Django项目开发中我们经常需要在视图中获取用户当前请求url的地址,然后进行跳转或判断操作,比如是否在url黑白名单里。Django提供了多种获取请求路径的实现方式,比如request.path, request.path_info, request.get_full_path和request.build_absolute_uri。那么这些方法有什么区别呢?
本文用户演示的完整url地址如下所示:
https://pythondjango.cn/blog/articles?page=2
request.path
request.path仅提供相对于根目录的url相对路径,不包含参数。它的输出是一个字符串,结果如下所示:
/blog/articles/
request.path_info
request.path_info也仅提供相对于根目录的url相对路径,不含参数。它的输出也是一个字符串,与request.path相同:
/blog/articles/
。
那么request.path_info和request.path有何区别呢? Django推荐使用request.path_info获取不含参数的相对urls路径。这是为什么呢?
大部分情况下request.path_info和request.path的输出结果是一样的。但是如果你的WSGI服务器设置了WSGIScriptAlias(应用程序的假名, 比如myapp), 那么request.path将输出/myapp/blog/articles/
,而request.path_info的输出结果更准确,依然为/blog/articles/
。
request.get_full_path
该方法用于获取包含完整参数的相对于根目录的相对url路径。它的直接输出内容是个WSGI请求对象。如果要获取字符串形式的完整url路径,一定要不要忘了在后面加括号。
request.get_full_path()的输出结果为:
‘blog/articles?page=2’
如果你希望在路径里忽略应用程序假名,可以使用request.get_full_path_info()。
request.build_absolute_uri()
该方法用于获取带域名的url绝对路径, 也是一个字符串,如下所示。千万别忘了加括号。
https://pythondjango.cn/blog/articles?page=2