Перенаправление страницы Python + Django

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

вопрос задан 7.02.2009
Kyle Hayes
1982 репутация

10 ответов


  • 240 рейтинг

    Все просто:

    from django.http import HttpResponseRedirect
    
    def myview(request):
        ...
        return HttpResponseRedirect("/path/")
    

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

    Обновление: Django 1. 0

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

    Пример -

    from django.views.generic.simple import redirect_to
    
    urlpatterns = patterns('',   
        (r'^one/$', redirect_to, {'url': '/another/'}),
    
        #etc...
    )
    

    В документации общего вида содержится более . Кредит - Carles Barrobés .

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

    В Джанго 1. 5 redirect_to больше не существует и был заменен на RedirectView . Кредит Йонатан

    from django.views.generic import RedirectView
    
    urlpatterns = patterns('',
        (r'^one/$', RedirectView.as_view(url='/another/')),
    )
    
    ответ дан Baishampayan Ghose, с репутацией 13329, 7.02.2009
  • 112 рейтинг

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

    from django.views.generic.simple import redirect_to
    
    urlpatterns = patterns('',
        (r'^one/$', redirect_to, {'url': '/another/'}),
    
        #etc...
    )
    

    См. документацию для более продвинутых примеров.


    Для Джанго 1. 3+ использование:

    from django.views.generic import RedirectView
    
    urlpatterns = patterns('',
        (r'^one/$', RedirectView.as_view(url='/another/')),
    )
    
    ответ дан Carles Barrobés, с репутацией 9133, 1.10.2010
  • 38 рейтинг

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

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

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

    ответ дан Teddy, с репутацией 4799, 17.01.2010
  • 25 рейтинг

    С Джанго 1. 1, вы также можете использовать более простой ярлык перенаправления :

    from django.shortcuts import redirect
    
    def myview(request):
        return redirect('/path')
    

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

    ответ дан Kennu, с репутацией 806, 5.09.2010
  • 12 рейтинг

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

    from django.conf.urls.defaults import url
    from django.views.generic import RedirectView
    
    urlpatterns = [
        url(r'^old/(?P.*)$', RedirectView.as_view(url='/new_path/%(path)s')),
    ]
    

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

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

    ответ дан odinho - Velmont, с репутацией 13558, 10.03.2014
  • 10 рейтинг

    С Джанго версия 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'),
    )
    

    Этот пример живет в URL. пи

    ответ дан Zlatko, с репутацией 106, 14.09.2011
  • 6 рейтинг

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

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

    from django.views.generic import RedirectView
    
    url(r'^source$', RedirectView.as_view(permanent=False, 
                                          url='/dest/')),
    
    ответ дан Gringo Suave, с репутацией 16831, 6.11.2012
  • 1 рейтинг

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

    def deletePolls(request):
        pollId = deletePool(request.GET['id'])
        return HttpResponseRedirect("/page_path/")
    
    ответ дан Moddasir Khan, с репутацией 624, 12.07.2013
  • 1 рейтинг

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

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

    ответ дан mcneo, с репутацией 149, 20.02.2012
  • 0 рейтинг

    Это должно работать в большинстве версий django, я использую его в 1. 6. 5:

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

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

    ответ дан radtek, с репутацией 14060, 12.06.2014