Редирект, переадресация или перенаправление Django
Дата и время: 14 сентября 2014 г. 12:56 | Категория: Веб-разработка, Django
Рассмотрим способ, как можно сделать простейшую переадресацию на Django сайте, а также переадресацию с параметрами.
Начнём с самой простейшей переадресации без параметров. Для этого нам потребуется базовое представление RedirectView из модуля django.views.generic.base.
В urls.py необходимо указать шаблон переадресации подобным образом:
from django.views.generic.base import RedirectView
urlpatterns = patterns('',
url(r'^$', RedirectView.as_view(url='posts/')), #1
url(r'^blog/$', RedirectView.as_view(url='/posts/')), #2
url(r'^google/$', RedirectView.as_view(url='http://google.com')), #3
)
Шаблон номер 1 выполняет переадресацию с site.com на site.com/posts/, номер 2 с site.com/blog/ на site.com/posts/, номер 3 с site.com/google/ на google.com, где site.com адрес вашего сайта.
Теперь рассмотри переадресацию с параметром. Для этого придётся писать своё представление, наследуя его от всё того же RedirectView. Пример представления (views.py):
from django.views.generic.base import RedirectView
from django.core.urlresolvers import reverse
class BlogToPostRedirectView(RedirectView):
def get_redirect_url(self, pk):
return reverse('detail_view', args=(pk,))
Данное представление выполняет переадресацию с site.com/blog/10/ на site.com/posts/10/, где число 10 может быть любым числом и передаётся в качестве параметра.
Urls.py в данном случае принимает следующий вид:
from yourprojectname import views
urlpatterns = patterns('',
url(r'^blog/(?P\d+)/$', views.BlogToPostRedirectView.as_view()), #1
url(r'^posts/(?P\d+)/$', views.PostDetailView.as_view(), name='detail_view'), #2
)
Работает это следующим образом:
- Пользователь переходит по ссылке, удовлетворяющей шаблону 1, например site.com/blog/10/;
- Вызывается метод BlogToPostRedirectView.as_view, а после чего BlogToPostRedirectView.get_redirect_url, в который в качестве аргумента передаётся pk, т.е. для данного примера 10;
- В методе get_redirect_url вызывается функция reverse, которая находит шаблон ссылки с именем detail_view и перенаправляет на него, подставляя в шаблон параметры из кортежа args.