Jak wykonać proste przekierowanie (np. cflocation
W ColdFusion lub header(location:http://)
PHP) w Django?
Jak wykonać proste przekierowanie (np. cflocation
W ColdFusion lub header(location:http://)
PHP) w Django?
Odpowiedzi:
To proste:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
Więcej informacji w oficjalnej dokumentacji Django
Aktualizacja: Django 1.0
Najwyraźniej istnieje lepszy sposób na zrobienie tego w Django teraz, 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 informacji można znaleźć w dokumentacji widoków ogólnych . Kredyt - Carles Barrobés .
Aktualizacja # 2: Django 1.3+
W Django 1.5 redirect_to już nie istnieje i zostało zastąpione przez RedirectView . Kredyt dla Yonatan
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
redirect
from django.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
W zależności od tego, czego chcesz (tj. Jeśli nie chcesz wykonywać żadnego dodatkowego przetwarzania wstępnego), łatwiej jest po prostu użyć redirect_to
ogólnego widoku Django :
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Zobacz dokumentację, aby uzyskać bardziej zaawansowane przykłady.
Do użycia Django 1.3+:
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
W rzeczywistości 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ć wywoływalny, jak również ciąg , którego tutaj używam.
redirect_to
ogólnego widoku dołączonego do django jest jeszcze prostsze i bardziej czytelne. Zobacz odpowiedź Carles stackoverflow.com/questions/523356/python-django-page-redirect/…
Od wersji Django 1.1 możesz także użyć prostszego skrótu do przekierowań :
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
Pobiera również opcjonalny stały argument słowa kluczowego = True.
Jeśli chcesz przekierować cały podfolder, url
argument w RedirectView jest w rzeczywistości 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')),
]
?P<path>
Przechwytywania ty zostaną uwzględnione RedirectView
. Ta przechwycona zmienna zostanie następnie zastąpiona w url
argumencie, który podałeś, podając nam, /new_path/yay/mypath
czy oryginalna ścieżka była /old/yay/mypath
.
Możesz również zrobić, ….as_view(url='…', query_string=True)
jeśli chcesz również skopiować ciąg zapytania.
W przypadku Django w wersji 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 znajduje się w urls.py
Strzec się. Zrobiłem to na serwerze deweloperskim i chciałem to później zmienić.
Musiałem wyczyścić moje pamięci podręczne, aby to zmienić. Aby uniknąć tego drapania głowy w przyszłości, udało mi się zrobić to tymczasowo w następujący sposób:
from django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
Możesz to zrobić w sekcji Administracja. Jest to wyjaśnione w dokumentacji.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
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'),
....
)
W tym rozwiązaniu nadal możesz używać nazwy wzorca adresu URL zamiast adresu URL zakodowanego na stałe. Parametr location_id z adresu URL jest przekazywany do funkcji lambda.