Как получить url-параметры из объекта HttpRequest
Предположим, у нас есть путь url:
path('something/<int:some_param>/test/', views.some_view)
Когда пользователь переходит по этому url, django
создает экземпляр HttpRequest
, который будет передан в представление some_view
. Есть ли способ получить параметр some_param
url из объекта запроса вне кода some_view
? (например, для выполнения некоторой обработки, которая зависит от 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, произвести с ним вычисления, получить с его помощью данные из базы данных и т.д. Затем, когда вы закончите, вам нужно вернуть объект ответа. Обычно для этого вызывается render
или TemplateResponse
с шаблоном или возвращается HttpResponse без шаблона. Вы отображаете шаблоны, предоставляя словарь context
, в который вы можете поместить все, что вам нравится (например, some_param
), что делает его доступным для отображения в вашем HTML-шаблоне. Этот отрисованный HTML-шаблон затем возвращается в качестве ответа пользователю с помощью волшебной функции render
или класса TemplateResponse
, что завершает процесс просмотра. Например, так:
return TemplateResponse(request, 'template.html', context)
Чтобы хранить some_param
между представлениями, вам нужно сохранить его в базе данных, сохранить в сессии пользователя или использовать cookie. Или передать его следующему представлению внутри url или вне url через /?param=some_param. Не сказав, что вам нужно some_param
для дальнейшего использования, трудно решить ваш вопрос.
Одним из возможных решений здесь является использование функции resolve
из модуля django.urls
. Она очень полезна, если вы хотите получить доступ к параметрам URL из пути URL, который связан с объектом HttpRequest
вне функции представления. Например, получить параметры URL и обработать их в пользовательском промежуточном ПО или в других частях вашего кода.
Пример:
from django.urls import resolve
...
func, args, kwargs = resolve(some_request.path)