如何从 HttpRequest 对象获取 url 参数

How to get url params from the HttpRequest object

假设,我们有一个 url 路径:

path('something/<int:some_param>/test/', views.some_view)

当用户点击此 url 时,django 生成 HttpRequest 的实例,该实例将被传递到 some_view 视图。有没有办法从some_view代码之外的请求对象中获取some_paramurl参数? (例如,在自定义中间件中做一些依赖于 some_param 的处理)。


一种可能的解决方案是解析 HttpRequest.path 属性,但是是否有任何预构建的方法来执行此操作?

Django 使用请求对象和 some_param 调用您的视图,您可以在 views.some_view 中访问它。您的函数将具有以下签名:

def some_view(request, some_param):
    ....

或:

def some_view(request, **kwargs):
    some_param=kwargs.get('some_param', None)

然后您可以在您的视图中使用 some_param 来做任何您需要做的事情,将它保存在数据库中,将它放入 cookie 中,用它进行计算,用它获取一些数据库数据等。完成后,您需要 return 一个响应对象。通常通过使用模板调用 renderTemplateResponse 或不使用模板调用 HttpResponse return。您呈现的模板提供了一个 context 字典,您可以自由地将任何您喜欢的东西放入其中(例如 some_param),这使得它可以在您的 HTML 模板中呈现。呈现的 HTML 模板然后通过 render 函数或 TemplateResponse class 的魔力 returned 作为对用户的响应,这结束了查看过程。 IE。像这样:

return TemplateResponse(request, 'template.html', context)

要在视图之间存储 some_param,您需要将其保存在数据库中、存储在用户会话中或使用 cookie。或者通过 /?param=some_param 将其传递到 url 内部或 url 外部的下一个视图。不说你以后需要什么some_param,很难解决你的问题。

此处一种可能的解决方案是使用 django.urls 模块中的 resolve 函数。如果您想从与视图函数外部的 HttpRequest 对象相关的 URL 路径访问 URL 参数,这将非常有用。例如,获取 URL 参数并在自定义中间件或代码的其他部分中处理它们。

示例:

from django.urls import resolve

...

func, args, kwargs = resolve(some_request.path)