代码之家  ›  专栏  ›  技术社区  ›  Kyle Hayes

python+django页面重定向

  •  152
  • Kyle Hayes  · 技术社区  · 17 年前

    如何完成一个简单的重定向(例如 cflocation 在冷聚变中,或 header(location:http://) 对于php)在Django?

    10 回复  |  直到 8 年前
        1
  •  242
  •   Community Mohan Dere    9 年前

    很简单:

    from django.http import HttpResponseRedirect
    
    def myview(request):
        ...
        return HttpResponseRedirect("/path/")
    

    更多信息 official Django docs

    更新:Django 1.0

    很明显,在Django有更好的方法 generic views .

    示例-

    from django.views.generic.simple import redirect_to
    
    urlpatterns = patterns('',   
        (r'^one/$', redirect_to, {'url': '/another/'}),
    
        #etc...
    )
    

    里面还有更多 generic views documentation . 信用—— Carles Barrobés .

    更新2:Django 1.3+

    在Django 1.5 重定向到 已不存在,已被替换为 RedirectView . 学分 Yonatan

    from django.views.generic import RedirectView
    
    urlpatterns = patterns('',
        (r'^one/$', RedirectView.as_view(url='/another/')),
    )
    
        2
  •  113
  •   the    10 年前

    根据您的需要(即,如果您不想进行任何额外的预处理),只使用django's更简单 redirect_to 通用视图:

    from django.views.generic.simple import redirect_to
    
    urlpatterns = patterns('',
        (r'^one/$', redirect_to, {'url': '/another/'}),
    
        #etc...
    )
    

    见 documentation 更多高级示例。


    对于Django 1.3+使用:

    from django.views.generic import RedirectView
    
    urlpatterns = patterns('',
        (r'^one/$', RedirectView.as_view(url='/another/')),
    )
    
        3
  •  38
  •   Teddy    16 年前

    实际上,有一种比为每个重定向都有一个视图更简单的方法-你可以这样做。 直接地 在里面 urls.py :

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

    A target can be a callable as well as a string ,这就是我在这里使用的。

        4
  •  25
  •   Kennu    16 年前

    由于django 1.1,您还可以使用更简单的 redirect 捷径:

    from django.shortcuts import redirect
    
    def myview(request):
        return redirect('/path')
    

    它还接受可选的permanent=true关键字参数。

        5
  •  14
  •   odinho - Velmont    8 年前

    如果要重定向整个子文件夹, url 论点 RedirectView is actually interpolated ,这样你就可以在 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 . 然后将在 网址 你的论点,给了我们 /new_path/yay/mypath 如果你原来的路径是 /old/yay/mypath .

    你也可以这样做 ….as_view(url='…', query_string=True) 如果您还想复制查询字符串。

        6
  •  10
  •   Zlatko    15 年前

    对于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中。

        7
  •  6
  •   Community Mohan Dere    9 年前

    当心。我在开发服务器上完成了这项工作,并希望稍后对其进行更改。

    我必须清理我的储物柜才能改变它。为了避免将来的头疼,我可以暂时这样做:

    from django.views.generic import RedirectView
    
    url(r'^source$', RedirectView.as_view(permanent=False, 
                                          url='/dest/')),
    
        8
  •  1
  •   mcneo    14 年前

    您可以在“管理”部分中执行此操作。文件中有解释。

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

        9
  •  1
  •   Moddasir    13 年前

    page_path=在urls.py中定义

    def deletePolls(request):
        pollId = deletePool(request.GET['id'])
        return HttpResponseRedirect("/page_path/")
    
        10
  •  0
  •   radtek    12 年前

    这应该适用于大多数版本的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参数传递给lambda函数。