سؤال

كيف يمكنني إنجاز عملية إعادة توجيه بسيطة (على سبيل المثال: 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 الهدف يمكن يكون للاستدعاء، فضلا عن سلسلة ، وهو ما أنا باستخدام هنا.

إذا كنت ترغب في إعادة توجيه مجلد فرعي كله، وحجة 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 من رابط وصولا الى وظيفة امدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top