Django项目开发中经常需要在视图中获取用户当前请求url的地址,然后进行跳转或判断操作,比如是否在url黑白名单里。Django提供了多种获取请求路径的实现方式,比如request.path, request.path_info, request.get_full_path和request.build_absolute_uri。
请求URL示例:http://localhost/v1/articles_cbv/?page=2&size=3
request.path
request.path仅提供相对于根目录的url相对路径,不包含域名和参数。它的输出是一个字符串,结果如下所示:
`/v1/articles_cbv/`
request.path_info
request.path_info也仅提供相对于根目录的url相对路径,不含参数。它的输出也是一个字符串,与request.path相同:
`/v1/articles_cbv/`
request.path_info和request.path的区别:
Django推荐使用request.path_info获取不含参数的相对urls路径。
大部分情况下request.path_info和request.path的输出结果是一样的。但是如果WSGI服务器设置了WSGIScriptAlias(应用程序的假名, 比如myapp), 那么request.path将输出`/myapp/v1/articles_cbv/`,而request.path_info的输出结果更准确,依然为`/v1/articles_cbv/`。
request.get_full_path
用于获取包含完整参数的相对于根目录的相对url路径,包含域名和查询参数。它的直接输出内容是个WSGI请求对象。
<bound method HttpRequest.get_full_path of <WSGIRequest: GET '/v1/articles_cbv/?page=2&size=3'>>
如果要获取字符串形式的完整url路径,一定要不要忘了在后面加括号。
request.get_full_path()的输出结果为:
‘/v1/articles_cbv/?page=2&size=3’
如果希望在路径里忽略应用程序假名,可以使用request.get_full_path_info()。
‘/v1/articles_cbv/?page=2&size=3’
request.build_absolute_uri()
该方法用于获取带域名的url绝对路径, 也是一个字符串,包含协议、域名、端口和路径以及查询参数。如下所示。需要加括号。
`http://localhost/v1/articles_cbv/?page=2&size=3`
输入才有输出,吸收才能吐纳。——码字不易