Django中如何从HttpRequest对象获取URL路径参数
Django 视图外获取URL路径参数的预置方法
有官方预置的实现方式,不需要手动解析HttpRequest.path属性,核心依赖Django的路由解析结果,具体用法如下:
方法1:通过request.resolver_match属性获取
Django完成URL路由匹配后,会将所有解析结果存入HttpRequest对象的resolver_match属性(类型为ResolverMatch),其中kwargs字段存储所有命名URL参数,args字段存储位置URL参数。
获取some_param的代码示例:
some_param = request.resolver_match.kwargs.get("some_param")
注意:
resolver_match仅在路由匹配完成后才会被赋值,如果你的代码执行时机早于路由匹配(比如中间件的__call__方法中调用get_response(request)之前),该属性为空。
方法2:在中间件process_view钩子中直接获取
如果是在自定义中间件中处理逻辑,更简单的方式是使用process_view钩子,该钩子执行时机是路由匹配完成后、视图函数调用前,入参直接携带解析好的参数:
class YourCustomMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) return response def process_view(self, request, view_func, view_args, view_kwargs): # 直接从入参view_kwargs中取参数 some_param = view_kwargs.get("some_param") if some_param: # 执行你的自定义逻辑 pass
方法3:提前手动调用路由解析
如果需要在路由匹配完成前就获取参数(比如中间件process_request阶段),可以手动调用Django内置的resolve方法解析路径:
from django.urls import resolve class YourCustomMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): try: resolver = resolve(request.path) some_param = resolver.kwargs.get("some_param") if some_param: # 执行自定义逻辑 pass except: # 路径匹配不到的异常处理 pass response = self.get_response(request) return response
内容的提问来源于stack exchange,提问作者Dmytro
相关产品推荐
相关产品推荐

