Python + Django przekierowanie strony

Jak wykonać proste przekierowanie (np. cflocation W ColdFusion lub header(location:http://) w PHP) w Django?

Author: Kyle Hayes, 2009-02-07

10 answers

To proste:

from django.http import HttpResponseRedirect

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

Więcej informacji w official Django docs

Aktualizacja: Django 1.0

Jest najwyraźniej lepszy sposób na zrobienie tego w Django używając generic views.

Przykład-

from django.views.generic.simple import redirect_to

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

    #etc...
)

Więcej jest w dokumentacji ogólnych widoków . Kredyt- Carles Barrobés .

Update #2: Django 1.3+

W Django 1.5 redirect_to już nie istnieje i został zastąpiony przez RedirectView . Kredyt na Yonatan

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)
 240
Author: Baishampayan Ghose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:09

W zależności od tego, czego chcesz (tj. jeśli nie chcesz wykonywać żadnego dodatkowego wstępnego przetwarzania), prostsze jest użycie widoku Generic redirect_to Django:

from django.views.generic.simple import redirect_to

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

    #etc...
)

Zobacz dokumentacja dla bardziej zaawansowanych przykładów.


Dla Django 1.3 + użyj:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)
 112
Author: Carles Barrobés,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-08 15:22:15

Istnieje prostszy sposób niż posiadanie widoku dla każdego przekierowania - możesz to zrobić bezpośrednio w urls.py:

from django.http import HttpResponsePermanentRedirect

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

Cel może być zarówno wywoływalny, jak i łańcuch , którego tutaj używam.

 38
Author: Teddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-17 08:07:32

Od Django 1.1 możesz również użyć prostszego skrótu redirect:

from django.shortcuts import redirect

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

Pobiera również opcjonalny argument permanent = True.

 25
Author: Kennu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-05 11:09:03

Jeśli chcesz przekierować cały podfolder, argument url w RedirectView jest interpolowany , więc możesz zrobić coś takiego w 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')),
]

The ?P<path> you capture will be fed into RedirectView. Ta przechwycona zmienna zostanie następnie zastąpiona w argumencie url, który podałeś, dając nam /new_path/yay/mypath jeśli oryginalną ścieżką była /old/yay/mypath.

Możesz również wykonać ….as_view(url='…', query_string=True), jeśli chcesz skopiować łańcuch zapytania.

 12
Author: odinho - Velmont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 08:39:54

W wersji Django 1.3 podejście oparte na klasach jest następujące:

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'),
)

Ten przykład mieszka w urls.py

 10
Author: Zlatko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-14 12:55:33

Uważaj. Zrobiłem to na serwerze deweloperskim i chciałem to zmienić później.

Musiałem wyczyścić pamięć podręczną, żeby ją zmienić. Aby uniknąć tego drapania głowy w przyszłości, udało mi się uczynić go tymczasowym w ten sposób: {]}
from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),
 6
Author: Gringo Suave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:09

Możesz to zrobić w sekcji Admin. Zostało to wyjaśnione w dokumentacji.

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

 1
Author: mcneo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-20 21:19:33

Page_path = define in urls.py

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")
 1
Author: Moddasir Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-12 12:45:36

To powinno działać w większości wersji django, używam go w 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'),
    ....
)

Nadal możesz używać nazwy wzorca url zamiast mocno zakodowanego adresu url w tym rozwiązaniu. Parametr location_id z adresu url jest przekazywany do funkcji lambda.

 0
Author: radtek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-12 18:23:52