django.core.urlresolvers служебные функции
reverse()
Если вам нужно использовать что-то похожее на тег шаблона url в вашем коде, Django предоставляет следующую функцию:
-
reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)[source]
viewname может быть строкой, содержащей путь по Python к объекту представления, именем шаблона URL или вызываемым объектом представления. Например, при следующих url:
from news import views url(r'^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.core.urlresolvers 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 — это модуль URLconf, содержащий шаблоны URL, которые необходимо использовать для обратной генерации. По умолчанию используется корневой URLconf для текущей нити.
Устарело начиная с версии 1.8: Возможность обратной генерации с использованием пути Python, например reverse('news.views.archive'), устарела.
Убедитесь, что все ваши представления корректны.
В рамках определения соответствия имен URL шаблонам функция reverse() должна импортировать все ваши файлы URLconf и проверить имя каждого представления. Это включает импорт каждой функции представления. Если при импорте любой из ваших функций представления возникнут любые ошибки, это приведёт к тому, что reverse() выдаст ошибку, даже если эта функция представления не та, которую вы пытаетесь обращать.
Убедитесь, что все представления, на которые вы ссылаетесь в своих файлах URLconf, существуют и могут быть импортированы правильно. Не включайте строки, которые ссылаются на представления, которые вы ещё не написали, потому что эти представления не будут импортируемы.
Примечание
Возвращаемая строкой функция reverse() уже кодирована в URL. Например:
>>> reverse('cities', args=['Orléans'])
'.../Orl%C3%A9ans/'
Применение дополнительного кодирования (например, urlquote() или urllib.quote) к результату работы функции reverse() может привести к нежелательным результатам.
reverse_lazy()
Ленивая версия функции reverse().
-
reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
Это полезно, когда вам нужно использовать обратную генерацию URL до загрузки URLconf вашего проекта. Некоторые распространённые случаи, когда необходима эта функция:
- предоставление обращённого URL в качестве атрибута
urlобобщённого представления на основе класса. - предоставление обращённого URL декоратору (например, аргументу
login_urlдля декоратораdjango.contrib.auth.decorators.permission_required()). - предоставление обращённого URL в качестве значения по умолчанию для параметра в сигнатуре функции.
resolve()
Функция resolve() может использоваться для разрешения путей URL до соответствующих функций представления. Её сигнатура следующая:
-
resolve(path, urlconf=None)[source]
path — это путь URL, который вы хотите разрешить. Как и в случае с reverse(), вам не нужно беспокоиться о параметре urlconf. Функция возвращает объект ResolverMatch, который позволяет получить доступ к различным метаданным о разрешённом URL.
Если URL не разрешается, функция генерирует исключение Resolver404 (подкласс Http404) .
-
class ResolverMatch[source] -
-
func -
Функция представления, которая будет использоваться для обработки URL
-
args -
Аргументы, которые будут переданы функции представления, полученные из URL.
-
kwargs -
Ключевые аргументы, которые будут переданы функции представления, полученные из URL.
-
url_name -
Имя шаблона URL, соответствующего URL.
-
app_name -
Пространство имён приложения для шаблона URL, соответствующего URL.
-
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/')
Одно из возможных применений функции resolve() — проверка, вызовет ли представление ошибку Http404 перед переадресацией к нему:
from django.core.urlresolvers import resolve
from django.http import HttpResponseRedirect, Http404
from django.utils.six.moves.urllib.parse import urlparse
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()[source]
Обычно вы всегда должны использовать функцию reverse() для определения URL в своём приложении. Однако, если ваше приложение само создаёт часть иерархии URL, вам иногда может потребоваться сгенерировать URL. В этом случае вам нужно будет найти базовый URL проекта Django в веб-сервере (обычно reverse() заботится об этом за вас). В этом случае вы можете вызвать get_script_prefix(), которая вернёт часть URL-префикса скрипта для вашего проекта Django. Если ваш проект Django находится в корневом каталоге веб-сервера, это всегда "/".
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/ref/urlresolvers/