Làm cách nào để thực hiện chuyển hướng đơn giản (ví dụ: cflocation
trong ColdFusion hoặc header(location:http://)
cho PHP) trong Django?
Làm cách nào để thực hiện chuyển hướng đơn giản (ví dụ: cflocation
trong ColdFusion hoặc header(location:http://)
cho PHP) trong Django?
Câu trả lời:
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/')),
)
redirect
từ django.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
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_to
chế độ 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/')),
)
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.
redirect_to
chế độ 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/
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.
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/mypath
nế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.
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
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/')),
Bạn có thể làm điều này trong phần Quản trị. Nó được giải thích trong tài liệu.
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
Đ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.