Chuyển hướng trang Python + Django


158

Làm cách nào để thực hiện chuyển hướng đơn giản (ví dụ: cflocationtrong ColdFusion hoặc header(location:http://)cho PHP) trong Django?

Câu trả lời:


250

Thật đơn giản:

from django.http import HttpResponseRedirect

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

Thông tin thêm trong các tài liệu chính thức của Django

Cập nhật: Django 1.0

Rõ ràng có một cách tốt hơn để làm điều này trong Django hiện đang sử dụng generic views.

Thí dụ -

from django.views.generic.simple import redirect_to

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

    #etc...
)

Có nhiều hơn trong các tài liệu quan điểm chung . Tín dụng - Carles Barrobés .

Cập nhật # 2: Django 1.3+

Trong Django 1.5 redirect_to không còn tồn tại và đã được thay thế bởi RedirectView . Tín dụng cho Yonatan

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

8
Đây không còn là phương pháp tốt nhất như Django 1.0. Xem câu trả lời này: stackoverflow.com/questions/523356/python-django-page-redirect/ mẹo
Jake

2
Tại sao không sử dụng redirecttừ django.shortcuts?
Afshin Mehrabani

4
Tôi sử dụng('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey

5
Điều này đã bị phản đối bắt đầu từ Django 1.5. Sử dụng 'RedirectView' thay vì: docs.djangoproject.com/en/1.5/ref/class-based-views/base/...
Yonatan

Nó thực sự không được phản đối, những gì bạn đang nói là phản đối? chuyển hướng? Sử dụng phương pháp này, tôi không biết cách truyền giá trị của tham số cho lambda, tức là url (r '^ (? P <location_id> \ d +) / $', lambda x: HttpResponseRedirect (đảo ngược ('Dailyreport_location', args = ['% (location_id)',]))) không hoạt động
radtek

113

Tùy thuộc vào những gì bạn muốn (nghĩa là nếu bạn không muốn thực hiện bất kỳ quá trình tiền xử lý bổ sung nào), việc sử dụng redirect_tochế độ xem chung của Django sẽ đơn giản hơn :

from django.views.generic.simple import redirect_to

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

    #etc...
)

Xem tài liệu cho các ví dụ nâng cao hơn.


Đối với Django 1.3+ sử dụng:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

+1 để sử dụng chế độ xem chung thay vì thực hiện theo cách riêng của bạn (dù đơn giản như thế nào) như trong câu trả lời được bình chọn hàng đầu (hiện tại).
Ngày

Có ai có bất kỳ ví dụ vì nếu bạn làm muốn làm thêm tiền xử lý?
háo hức

1
Sau đó, tôi khuyên bạn nên viết chế độ xem tùy chỉnh thực hiện xử lý và sau đó gọi chế độ xem chung hoặc viết trình trang trí, ví dụ: pre_ process và trang trí chế độ xem chung: (r '^ one / $', pre_ process (redirect_to), {'url ':' /
other

1
@niallsco: nếu bạn muốn xử lý bổ sung, tốt nhất nên sử dụng lối tắt chuyển hướng như được mô tả bởi Kennu tại đây
Lie Ryan

1
Trong django 1.4, nhập redirect_to sẽ đưa ra cảnh báo khử.
joctee

38

Thực sự có một cách đơn giản hơn là có một chế độ xem cho mỗi chuyển hướng - bạn có thể thực hiện trực tiếp trong urls.py:

from django.http import HttpResponsePermanentRedirect

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

Một mục tiêu có thể là một cuộc gọi cũng như một chuỗi , đó là những gì tôi đang sử dụng ở đây.


2
Đúng, nhưng sử dụng redirect_tochế độ xem chung đi kèm với django thì đơn giản hơn và dễ đọc hơn. Xem câu trả lời của Carles stackoverflow.com/questions/523356/python-django-page-redirect/
Ngày

28

Kể từ Django 1.1, bạn cũng có thể sử dụng phím tắt chuyển hướng đơn giản hơn :

from django.shortcuts import redirect

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

Nó cũng có một đối số từ khóa vĩnh viễn = True.


14

Nếu bạn muốn chuyển hướng toàn bộ thư mục con, urlđối số trong RedirectView thực sự được nội suy , vì vậy bạn có thể làm một cái gì đó như thế này trongurls.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')),
]

Các ?P<path>chụp bạn sẽ được đưa vàoRedirectView . Biến bị bắt này sau đó sẽ được thay thế trong urlđối số bạn đã đưa ra, cho chúng tôi /new_path/yay/mypathnếu đường dẫn ban đầu của bạn là /old/yay/mypath.

Bạn cũng có thể làm ….as_view(url='…', query_string=True)nếu bạn muốn sao chép chuỗi truy vấn.


10

Với Django phiên bản 1.3, cách tiếp cận dựa trên lớp là:

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

Ví dụ này sống trong urls.py


6

Coi chừng. Tôi đã làm điều này trên một máy chủ phát triển và muốn thay đổi nó sau này.

Tôi đã phải xóa bộ nhớ cache của tôi để thay đổi nó. Để tránh bị trầy xước trong tương lai, tôi đã có thể làm cho nó tạm thời như vậy:

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),


1

page_path = xác định trong urls.py

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

0

Điều này sẽ hoạt động trong hầu hết các phiên bản của django, tôi đang sử dụng nó trong 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'),
    ....
)

Bạn vẫn có thể sử dụng tên của mẫu url thay vì url được mã hóa cứng với giải pháp này. Tham số location_id từ url được truyền xuống hàm lambda.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.