Python + Django sayfa yönlendirmesi


158

Django'da basit bir yönlendirmeyi (ör cflocation. ColdFusion veya header(location:http://)PHP için) nasıl yapabilirim ?

Yanıtlar:


250

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

8
Bu artık Django 1.0 itibariyle en iyi yöntem değil. Şu yanıta bakın: stackoverflow.com/questions/523356/python-django-page-redirect/…
Jake

2
Neden kullanmıyorsunuz redirectgelen django.shortcuts?
Afshin Mehrabani

4
Ben kullanıyorum('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey

5
Bu, Django 1.5'ten başlayarak kullanımdan kaldırılmıştır. Bunun yerine 'RedirectView' kullanın: docs.djangoproject.com/en/1.5/ref/class-based-views/base/…
Yonatan

Aslında itiraz edilmiyor, ne diyorsunuz itiraz ediliyor? yönlendirme? Bu yöntemi kullanarak lambda, yani url (r '^ (? P <location_id> \ d +) / $', lambda x: HttpResponseRedirect (reverse ('dailyreport_location', args = ['% (location_id)',]))) çalışmıyor
radtek

113

Ne istediğinize bağlı olarak (başka bir ön işlem yapmak istemiyorsanız), Django'nun redirect_togenel 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/')),
)

(Şu anki) en çok oy alan cevapta olduğu gibi kendi (ne kadar basit olursa olsun) uygulamak yerine genel bir görünüm kullanmak için +1.
Gün

Ek ön işlem yapmak istiyorsanız bunun için herhangi bir örneği var mı ?
eageranalyst

1
Sonra ya işleme yapan özel bir görünüm yazmak ve daha sonra genel görünüm çağırır, ya da bir dekoratör, örneğin pre_process yazmak ve genel görünümü süslemek: (r '^ one / $', pre_process (redirect_to), {'url ':' / another / '})
Carles Barrobés

1
@niallsco: ek işleme yapmak istiyorsanız, burada
Lie Ryan

1
Django 1.4 sürümünde, redirect_to öğesine içe aktarma bir yoksunluk uyarısı verir.
joctee

38

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 .


2
Doğru, ancak redirect_todjango 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/…
günü

28

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.


14

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 urlverdiğiniz argümanla değiştirilir ve /new_path/yay/mypathorijinal yolunuzun olup olmadığını bize verir /old/yay/mypath.

….as_view(url='…', query_string=True)Sorgu dizesini de kopyalamak istiyorsanız da yapabilirsiniz .


10

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


6

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


1

page_path = urls.py dosyasında tanımla

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.