Django'da basit bir yönlendirmeyi (ör cflocation
. ColdFusion veya header(location:http://)
PHP için) nasıl yapabilirim ?
Django'da basit bir yönlendirmeyi (ör cflocation
. ColdFusion veya header(location:http://)
PHP için) nasıl yapabilirim ?
Yanıtlar:
Basit:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
Resmi Django dokümanlarında daha fazla bilgi
Güncelleme: Django 1.0
Görünüşe göre şimdi kullanarak Django bunu yapmanın daha iyi bir yolu var generic views
.
Misal -
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Genel görünüm belgelerinde daha fazlası var . Kredi - Carles Barrobés .
Güncelleme # 2: Django 1.3+
Django 1.5'te redirect_to artık mevcut değil ve yerini RedirectView aldı . Yonatan'a kredi
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
redirect
gelen django.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
Ne istediğinize bağlı olarak (başka bir ön işlem yapmak istemiyorsanız), Django'nun redirect_to
genel görünümünü kullanmak daha kolaydır :
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
Daha gelişmiş örnekler için belgelere bakın .
Django 1.3+ kullanımı için:
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
Her yönlendirme için bir görünüm sahip olmaktan daha basit bir yolu aslında var - bunu yapabilirsiniz doğrudan içinde urls.py
:
from django.http import HttpResponsePermanentRedirect
urlpatterns = patterns(
'',
# ...normal patterns here...
(r'^bad-old-link\.php',
lambda request: HttpResponsePermanentRedirect('/nice-link')),
)
Bir hedef burada çağrılabilir olan bir dize yanı sıra çağrılabilir olabilir .
redirect_to
django ile birlikte gelen genel görünümü kullanmak daha basit ve daha okunabilir. Bkz. Carles cevabı stackoverflow.com/questions/523356/python-django-page-redirect/…
Django 1.1'den bu yana, daha basit yönlendirme kısayolunu da kullanabilirsiniz :
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
Ayrıca isteğe bağlı bir kalıcı = True anahtar kelime bağımsız değişkeni de alır.
Tüm bir alt klasörü yeniden yönlendirmek istiyorsanız url
, RedirectView'daki argüman aslında enterpolasyonludur , böylece şu şekilde bir şey yapabilirsiniz 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>
Eğer yakalama beslenecektir RedirectView
. Bu yakalanan değişken daha sonra url
verdiğiniz argümanla değiştirilir ve /new_path/yay/mypath
orijinal yolunuzun olup olmadığını bize verir /old/yay/mypath
.
….as_view(url='…', query_string=True)
Sorgu dizesini de kopyalamak istiyorsanız da yapabilirsiniz .
Django sürüm 1.3 ile sınıf temelli yaklaşım:
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'),
)
Bu örnek urls.py içinde yaşıyor
Dikkat. Bunu bir geliştirme sunucusunda yaptım ve daha sonra değiştirmek istedim.
Değiştirmek için önbelleklerimi temizlemek zorunda kaldım. Gelecekte bu kafa çizilmesinden kaçınmak için, bu şekilde geçici hale getirebildim:
from django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
Bunu Yönetici bölümünde yapabilirsiniz. Belgelerde açıklanmıştır.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
Bu django çoğu sürümlerinde çalışması gerekir, 1.6.5 kullanıyorum:
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'),
....
)
Bu çözümle sabit kodlu URL yerine URL kalıbının adını kullanmaya devam edebilirsiniz. Url'den location_id parametresi lambda işlevine aktarılır.