Служебные функции django.urls
¶
reverse()
¶
Если вам нужно использовать что-то похожее на тег шаблона url
в вашем коде, Django предоставляет следующую функцию:
-
reverse
( viewname , urlconf = None , args = None , kwargs = None , current_app = None ) ¶
viewname
может быть именем шаблона URL или самим объектом представления. Например, учитывая url
следующее:
from news import views
path('archive/', views.archive, name='news-archive')
вы можете использовать любой из следующих вызовов, чтобы получить URL:
# using the named URL
reverse('news-archive')
# passing a callable object
# (This is discouraged because you can't reverse namespaced views this way.)
from news import views
reverse(views.archive)
Если URL-адрес принимает параметры, вы можете передать их args
. например :
from django.urls import reverse
def myview(request):
return HttpResponseRedirect(reverse('arch-summary', args=[1945]))
Вы также можете пересылать kwargs
вместо args
. Например :
>>> reverse('admin:app_list', kwargs={'app_label': 'auth'})
'/admin/auth/'
Невозможно перейти в оба args
и kwargs
в reverse()
.
Если совпадений не найдено, reverse()
выдается исключение NoReverseMatch
.
Эта функция reverse()
может разрешать широкий спектр шаблонов регулярных выражений, соответствующих URL-адресам, но не все. Основное ограничение в настоящее время заключается в том, что шаблон не может содержать различные возможные варианты, обозначенные вертикальной чертой ( "|"
). Такие шаблоны можно легко использовать для разрешения входящих URL-адресов и вызова соответствующего представления, но их нельзя использовать для выполнения обратных разрешений.
Параметр current_app
позволяет вам дать подсказку преобразователю, чтобы сообщить приложению, которому принадлежит запущенное представление. Этот параметр current_app
используется в качестве ориентира для преобразования пространств имен приложений в URL-адреса конкретных экземпляров приложения в соответствии с разрешением URL-адресов с политикой пространства имен .
Параметр urlconf
- это модуль конфигурации URL-адреса, содержащий шаблоны URL-адресов, используемые для разрешения. По умолчанию используется конфигурация корневого URL-адреса текущего потока.
Заметка
Строка URL, возвращаемая пользователем reverse()
, уже экранирована . Например :
>>> reverse('cities', args=['Orléans'])
'.../Orl%C3%A9ans/'
Если вы примените другие кодировки (например, urllib.parse.quote()
) к значению, возвращаемому функцией reverse()
, это может привести к нежелательным результатам.
reverse_lazy()
¶
Ленивая версия reverse () .
-
reverse_lazy
( viewname , urlconf = None , args = None , kwargs = None , current_app = None ) ¶
Эта функция полезна, когда вам нужно выполнить разрешение URL перед загрузкой конфигурации URL. Вот несколько распространенных случаев использования этой функции:
- Назначение обратного URL-адреса в качестве атрибута
url
общего представления на основе классов. - присвоение обратного URL-адреса декоратору (как для параметра
login_url
декоратораdjango.contrib.auth.decorators.permission_required()
). - назначение обратного URL-адреса в качестве значения по умолчанию параметра в сигнатуре функции.
resolve()
¶
Функцию resolve()
можно использовать для разрешения пути URL к соответствующей функции просмотра. Его подпись следующая:
-
resolve
( путь , urlconf = Нет ) ¶
path
- это URL-адрес для разрешения. Как и в случае с reverse()
настройками, беспокоиться не о чем urlconf
. Фокус возвращает объект, ResolverMatch
позволяющий получить доступ к различным метаданным о разрешенном URL.
Если URL-адрес не разрешен, функция генерирует исключение Resolver404
(которое является подклассом Http404
).
-
класс
ResolverMatch
¶ -
func
¶ Функция просмотра, которая использовалась бы для обслуживания URL.
-
args
¶ Параметры, которые были бы переданы функции просмотра, поскольку они были взяты из URL-адреса.
-
kwargs
¶ Именованные параметры, которые были бы переданы функции просмотра, поскольку они были взяты из URL-адреса.
-
url_name
¶ Имя шаблона URL-адреса, соответствующего URL-адресу.
-
route
¶ Маршрут соответствующего шаблона URL.
Например, если установить шаблон соответствия, будет содержать .
path('users/<id>/', ...)
route
'users/<id>/'
-
app_name
¶ Пространство имен приложения для шаблона URL, соответствующего URL.
-
app_names
¶ Список отдельных компонентов пространства имен в полном пространстве имен приложения шаблона URL-адреса, соответствующего URL-адресу. Если например
app_name
содержитfoo:bar
, тоapp_names
будет содержать .['foo', 'bar']
-
namespace
¶ Пространство имен экземпляра для шаблона URL, соответствующего URL.
-
namespaces
¶ Список отдельных компонентов пространства имен в полном пространстве имен экземпляра шаблона URL, соответствующего URL. Если, например, пространство имен
foo:bar
,namespaces
будет содержать .['foo', 'bar']
-
view_name
¶ Имя представления, соответствующего URL-адресу, включая пространство имен, если оно есть.
-
ResolverMatch
Затем можно запросить объект, чтобы предоставить информацию о шаблоне URL, соответствующем URL:
# Resolve a URL
match = resolve('/some/path/')
# Print the URL pattern that matches the URL
print(match.url_name)
Также объект ResolverMatch
может быть отнесен к триплету:
func, args, kwargs = resolve('/some/path/')
Одним из возможных вариантов использования for resolve()
может быть проверка того, выдает ли представление ошибку, Http404
прежде чем использовать его в качестве цели перенаправления:
from urllib.parse import urlparse
from django.urls import resolve
from django.http import Http404, HttpResponseRedirect
def myview(request):
next = request.META.get('HTTP_REFERER', None) or '/'
response = HttpResponseRedirect(next)
# modify the request and response as required, e.g. change locale
# and set corresponding locale cookie
view, args, kwargs = resolve(urlparse(next)[2])
kwargs['request'] = request
try:
view(*args, **kwargs)
except Http404:
return HttpResponseRedirect('/')
return response
get_script_prefix()
¶
-
get_script_prefix
() ¶
Обычно вы всегда должны использовать это reverse()
для определения URL-адресов в вашем приложении. Однако, если приложение самостоятельно строит часть иерархии URL-адресов, иногда может быть полезно сгенерировать сами URL-адреса. В этом случае необходимо знать базовый URL-адрес проекта Django в контексте веб-сервера ( reverse()
обычно это делается за вас). В этом случае вы можете вызвать get_script_prefix()
, который возвращает часть префикса скрипта URL-адресов проекта Django. Если этот проект размещен в корне своего веб-сервера, значение всегда будет "/"
.