Вопрос

Как выполнить простое перенаправление (например. cflocation в ColdFusion или header(location:http://) для PHP) в Django?

Это было полезно?

Решение

Это просто:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")

Больше информации в официальная документация Django

Обновлять:Джанго 1.0

Очевидно, теперь в Django есть лучший способ сделать это, используя generic views.

Пример -

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',   
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

Есть еще в документация по общим представлениям.Кредит - Карлес Барробес.

Обновление №2:Джанго 1.3+

В Джанго 1.5 перенаправление_то больше не существует и был заменен ПеренаправлениеView.Кредит Йонатан

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

Другие советы

В зависимости от того, что вы хотите (т.если вы не хотите выполнять дополнительную предварительную обработку), проще использовать Django. redirect_to общий вид:

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

Видеть документация для более сложных примеров.


Для Django 1.3+ используйте:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

На самом деле есть более простой способ, чем просматривать каждое перенаправление — вы можете это сделать. напрямую в urls.py:

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)

Целью может быть вызываемый объект, а также строка., что я и использую здесь.

Начиная с Django 1.1, вы также можете использовать более простой перенаправить ярлык:

from django.shortcuts import redirect

def myview(request):
    return redirect('/path')

Он также принимает необязательный аргумент ключевого слова Permanent=True.

Если вы хотите перенаправить всю подпапку, url аргумент в RedirectView фактически интерполируется, поэтому вы можете сделать что-то подобное в urls.py:

from django.conf.urls.defaults import url
from django.views.generic import RedirectView

urlpatterns = [
    url(r'^old/(?P<path>.*)$', RedirectView.as_view(url='/new_path/%(path)s')),
]

А ?P<path> вы захватите, будет передано в RedirectView.Эта захваченная переменная затем будет заменена в url аргумент, который вы дали, давая нам /new_path/yay/mypath если ваш первоначальный путь был /old/yay/mypath.

Вы также можете сделать ….as_view(url='…', query_string=True) если вы хотите также скопировать строку запроса.

В Django версии 1.3 подход на основе классов выглядит следующим образом:

from django.conf.urls.defaults import patterns, url
from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-url/$', RedirectView.as_view(url='/redirect-url/'), name='some_redirect'),
)

Этот пример находится в urls.py.

Остерегаться.Я сделал это на сервере разработки и хотел изменить это позже.

Мне пришлось очистить кэш, чтобы изменить его.Чтобы избежать этой головной боли в будущем, я смог сделать это временным, вот так:

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),

Вы можете сделать это в разделе Администратор.Это объяснено в документации.

https://docs.djangoproject.com/en/dev/ref/contrib/redirects/

page_path = определить в urls.py

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")

Это должно работать в большинстве версий Django, я использую его в 1.6.5:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
urlpatterns = patterns('',
    ....
    url(r'^(?P<location_id>\d+)/$', lambda x, location_id: HttpResponseRedirect(reverse('dailyreport_location', args=[location_id])), name='location_stats_redirect'),
    ....
)

В этом решении вы все равно можете использовать имя шаблона URL-адреса вместо жестко запрограммированного URL-адреса.Параметр location_id из URL-адреса передается в лямбда-функцию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top