Jak wykonać proste przekierowanie (np. cflocation
W ColdFusion lub header(location:http://)
PHP) w Django?
158
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
fromdjango.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 :Zobacz dokumentację, aby uzyskać bardziej zaawansowane przykłady.
Do użycia Django 1.3+:
źródło
W rzeczywistości istnieje prostszy sposób niż posiadanie widoku dla każdego przekierowania - możesz to zrobić bezpośrednio w
urls.py
:Cel może być wywoływalny, jak również ciąg , którego tutaj używam.
źródło
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ń :
Pobiera również opcjonalny stały argument słowa kluczowego = True.
źródło
Jeśli chcesz przekierować cały podfolder,
url
argument w RedirectView jest w rzeczywistości interpolowany , więc możesz zrobić coś takiego wurls.py
:?P<path>
Przechwytywania ty zostaną uwzględnioneRedirectView
. Ta przechwycona zmienna zostanie następnie zastąpiona wurl
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.źródło
W przypadku Django w wersji 1.3 podejście oparte na klasach jest następujące:
Ten przykład znajduje się w urls.py
źródło
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:
źródło
Możesz to zrobić w sekcji Administracja. Jest to wyjaśnione w dokumentacji.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
źródło
page_path = zdefiniuj w urls.py
źródło
To powinno działać w większości wersji django, używam go w 1.6.5:
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.
źródło