إعادة توجيه صفحة بايثون + جانغو
سؤال
كيف يمكنني إنجاز عملية إعادة توجيه بسيطة (على سبيل المثال: cflocation
في كولد فيوجن، أو header(location:http://)
لـ PHP) في جانغو؟
المحلول
انه سهل:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
مزيد من المعلومات في مستندات جانغو الرسمية
تحديث:جانغو 1.0
يبدو أن هناك طريقة أفضل للقيام بذلك باستخدام Django الآن generic views
.
مثال -
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
وهناك المزيد في وثائق وجهات النظر العامة.ائتمان - كارليس باروبيه.
التحديث رقم 2:جانغو 1.3+
في جانغو 1.5 إعادة توجيه ل لم يعد موجودا وتم استبداله إعادة توجيه العرض.الائتمان ل يوناتان
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
نصائح أخرى
اعتمادا على ما تريد (أي.إذا كنت لا تريد إجراء أي معالجة مسبقة إضافية)، فمن الأسهل استخدام Django فقط redirect_to
عرض عام:
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
يرى توثيق لمزيد من الأمثلة المتقدمة.
لاستخدام جانغو 1.3+:
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
وهناك في الواقع وسيلة أبسط من وجود عرض لكل إعادة توجيه - يمكنك أن تفعل ذلك <م> مباشرة في urls.py
:
from django.http import HttpResponsePermanentRedirect
urlpatterns = patterns(
'',
# ...normal patterns here...
(r'^bad-old-link\.php',
lambda request: HttpResponsePermanentRedirect('/nice-link')),
)
A الهدف يمكن يكون للاستدعاء، فضلا عن سلسلة ، وهو ما أنا باستخدام هنا.
ومنذ جانغو 1.1، يمكنك أيضا استخدام أبسط إعادة توجيه و> الاختصار:
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
ويستغرق أيضا دائمة = صحيح حجة الكلمة اختياري.
إذا كنت ترغب في إعادة توجيه مجلد فرعي كله، وحجة url
في <لأ href = "https://docs.djangoproject.com/en/1.8/ref/class-based-views/base/#redirectview" يختلط = "نوفولو noreferrer"> RedirectView هو في الواقع محرف ، حتى تتمكن من القيام بشيء من هذا القبيل في 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>
يمكنك التقاط إلى RedirectView
. وبعد ذلك يتم استبدال هذا المتغير المأسورة في حجة url
ما قدمتموه، وهذا يعطينا /new_path/yay/mypath
إذا كان المسار الأصلي الخاص بك /old/yay/mypath
.
ويمكنك أيضا لا ….as_view(url='…', query_string=True)
إذا كنت تريد نسخ سلسلة استعلام عبر كذلك.
ومع جانغو الإصدار 1.3، النهج فئة استنادا هو:
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'),
)
وهذا المثال يعيش في في urls.py
احذر.لقد فعلت ذلك على خادم تطوير وأردت تغييره لاحقًا.
اضطررت إلى مسح ذاكرة التخزين المؤقت الخاصة بي لتغييرها.ومن أجل تجنب هذه الحيرة في المستقبل، تمكنت من جعلها مؤقتة على النحو التالي:
from django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
ويمكنك القيام بذلك في القسم المسؤول. لقد أوضح ذلك في الوثائق.
https://docs.djangoproject.com/en/dev/ref / contrib / الموجهات /
وpage_path = تعريف في urls.py
def deletePolls(request):
pollId = deletePool(request.GET['id'])
return HttpResponseRedirect("/page_path/")
وهذا يجب أن تعمل في معظم إصدارات جانغو، وأنا استخدامه في 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'),
....
)
ويمكنك الاستمرار في استخدام اسم نمط رابط بدلا من رابط الثابت ترميز مع هذا الحل. يتم تمرير المعلمة location_id من رابط وصولا الى وظيفة امدا.