पायथन + Django पृष्ठ पुनर्निर्देशित


158

मैं एक साधारण पुनर्निर्देशन (जैसे cflocationकोल्डफ़्यूज़न में, या header(location:http://)PHP के लिए) Django में कैसे करूँ?

जवाबों:


250

यह आसान है:

from django.http import HttpResponseRedirect

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

आधिकारिक Django डॉक्स में अधिक जानकारी

अपडेट: Django 1.0

जाहिर तौर पर Django में इसका उपयोग करने का एक बेहतर तरीका है generic views

उदाहरण -

from django.views.generic.simple import redirect_to

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

    #etc...
)

सामान्य विचार प्रलेखन में अधिक है । क्रेडिट - कार्ल्स बैरोबेस

अपडेट # 2: Django 1.3+

Django में 1.5 redirect_to अब मौजूद नहीं है और इसे RedirectView द्वारा बदल दिया गया है । योनतन को श्रेय

from django.views.generic import RedirectView

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

8
यह अब Django 1.0 के रूप में सबसे अच्छी विधि नहीं है। इस उत्तर को देखें: stackoverflow.com/questions/523356/python-django-page-redirect/…
जेक

2
क्यों नहीं से उपयोग कर रहा redirectहै django.shortcuts?
अफशीन मेहरबानी

4
मैं उपयोग('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey

5
यह पहले से ही Django 1.5 में शुरू किया गया है। इसके बजाय 'पुनर्निर्देशन' का उपयोग करें: docs.djangoproject.com/en/1.5/ref/class-based-views/base/…
Yonatan

इसका वास्तव में पदावनत नहीं किया गया, आप जो कह रहे हैं वह पदावनत है? रीडायरेक्ट? इस पद्धति का उपयोग करके मुझे पता नहीं है कि लैम्बडा, यानी url (r '^ (? P <location_id> \ d +) / $', लैम्ब्डा x: HttpResponseRedirect (रिवर्स ('dailyreport_location), args = के मापदंडों का मान कैसे पार करना है। ['% (
स्थान_निधान

113

आप जो चाहते हैं उसके आधार पर (यानी यदि आप कोई अतिरिक्त पूर्व-प्रसंस्करण नहीं करना चाहते हैं), तो यह केवल Django के redirect_toसामान्य दृश्य का उपयोग करने के लिए सरल है :

from django.views.generic.simple import redirect_to

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

    #etc...
)

अधिक उन्नत उदाहरणों के लिए प्रलेखन देखें ।


Django के लिए 1.3+ उपयोग:

from django.views.generic import RedirectView

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

+1 (वर्तमान में) शीर्ष मतदान जवाब के रूप में अपने खुद के (कोई फर्क नहीं पड़ता) कैसे लागू करने के बजाय एक सामान्य दृश्य का उपयोग करने के लिए।
दिन

क्या किसी के पास कोई उदाहरण है यदि आप अतिरिक्त पूर्व प्रसंस्करण करना चाहते हैं?
उत्साहपूर्ण

1
फिर मैं सुझाव देता हूं कि या तो एक कस्टम दृश्य लिखें जो प्रसंस्करण करता है और फिर जेनेरिक दृश्य कहता है, या एक डेकोरेटर लिखता है जैसे pre_process और जेनेरिक दृश्य को सजाने के लिए: (r '^ एक / $', pre_process (redirect_to), {'url ':' / a / / '})
कार्ल्स बारब्रोस

1
@niallsco: यदि आप अतिरिक्त प्रसंस्करण करना चाहते हैं, तो यहां
रेयान

1
Django 1.4 में, redirect_to आयात करने से डेप्रेशन चेतावनी मिलती है।
joctee

38

वहाँ वास्तव में एक रीडायरेक्ट के लिए एक दृश्य की तुलना में एक सरल तरीका है - आप यह कर सकते हैं सीधे में urls.py:

from django.http import HttpResponsePermanentRedirect

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

एक लक्ष्य एक कॉल करने योग्य और साथ ही एक स्ट्रिंग हो सकता है , जो कि मैं यहां उपयोग कर रहा हूं।


2
यह सच है, लेकिन redirect_toजेनजेन के साथ आने वाले सामान्य दृश्य का उपयोग करना अभी भी सरल और अधिक पठनीय है। Carles answer stackoverflow.com/questions/523356/python-django-page-redirect/…
दिन

28

Django 1.1 के बाद से, आप सरल पुनर्निर्देशित शॉर्टकट का भी उपयोग कर सकते हैं :

from django.shortcuts import redirect

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

यह एक वैकल्पिक स्थायी = सही कीवर्ड तर्क भी लेता है।


14

यदि आप एक पूरे सबफ़ोल्डर को पुनर्निर्देशित करना चाहते हैं , तो RedirectViewurl में तर्क वास्तव में प्रक्षेपित है , इसलिए आप इसमें कुछ कर सकते हैं 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)यदि आप क्वेरी स्ट्रिंग को भी कॉपी करना चाहते हैं तो आप भी कर सकते हैं ।


10

Django संस्करण 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 में रहता है


6

खबरदार। मैंने यह एक विकास सर्वर पर किया था और बाद में इसे बदलना चाहता था।

मुझे इसे बदलने के लिए अपने कैश को साफ करना पड़ा। भविष्य में इस सिर-खरोंच से बचने के लिए, मैं इसे इस तरह अस्थायी बनाने में सक्षम था:

from django.views.generic import RedirectView

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

1

आप इसे व्यवस्थापक अनुभाग में कर सकते हैं। इसे डॉक्यूमेंटेशन में बताया गया है।

https://docs.djangoproject.com/en/dev/ref/contrib/redirects/


मेरे प्रश्न के लिए काफी प्रासंगिक नहीं है, यह अभी भी जानकारी का एक दिलचस्प टुकड़ा है।
काइल हेस

1

page_path = urls.py में परिभाषित करें

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

0

यह django के अधिकांश संस्करणों में काम करना चाहिए, मैं इसे 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'),
    ....
)

आप इस समाधान के साथ हार्ड कोडित url के बजाय url पैटर्न के नाम का उपयोग कर सकते हैं। Url से location_id पैरामीटर को लैम्ब्डा फ़ंक्शन के लिए नीचे दिया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.