【问题标题】:Python + Django page redirectPython + Django 页面重定向
【发布时间】:2010-10-06 02:52:03
【问题描述】:

如何在 Django 中完成简单的重定向(例如,ColdFusion 中的 cflocation 或 PHP 中的 header(location:http://))?

【问题讨论】:

    标签: python django redirect location


    【解决方案1】:

    很简单:

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

    更多信息在official Django docs

    更新:Django 1.0

    现在使用 generic views 在 Django 中显然有更好的方法。

    例子-

    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 中 redirect_to 不再存在,已被 RedirectView 取代。感谢Yonatan

    from django.views.generic import RedirectView
    
    urlpatterns = patterns('',
        (r'^one/$', RedirectView.as_view(url='/another/')),
    )
    

    【讨论】:

    • 这不再是 Django 1.0 的最佳方法。看到这个答案:stackoverflow.com/questions/523356/python-django-page-redirect/…
    • 为什么不使用来自django.shortcutsredirect
    • 我用('^pattern/$', lambda x: redirect('/redirect/url/'))
    • 从 Django 1.5 开始,这已经被弃用了。改用“RedirectView”:docs.djangoproject.com/en/1.5/ref/class-based-views/base/…
    • 它实际上并没有被弃用,你说什么被弃用了?重定向?使用这种方法我不知道如何将参数的值传递给 lambda,即 url(r'^(?P\d+)/$', lambda x: HttpResponseRedirect(reverse('dailyreport_location', args= ['%(location_id)', ]))) 不起作用
    【解决方案2】:

    根据你想要的(即如果你不想做任何额外的预处理),使用 Django 的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/')),
    )
    

    【讨论】:

    • +1 用于使用通用视图,而不是在(当前)投票最多的答案中实现您自己的(无论多么简单)。
    • 如果您确实想要进行额外的预处理,有没有人有任何示例?
    • 然后我建议要么编写一个自定义视图来进行处理,然后调用通用视图,要么编写一个装饰器,例如pre_process 并装饰通用视图: (r'^one/$', pre_process(redirect_to), {'url': '/another/'})
    • @niallsco:如果你想做额外的处理,那么最好使用Kennu在here中描述的重定向快捷方式
    • 在 django 1.4 中,导入 redirect_to 会给出弃用警告。
    【解决方案3】:

    实际上有一种比为每个重定向查看视图更简单的方法 - 您可以在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】:

    从 Django 1.1 开始,你也可以使用更简单的redirect 快捷方式:

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

    它还需要一个可选的 Permanent=True 关键字参数。

    【讨论】:

      【解决方案5】:

      如果你想重定向整个子文件夹,RedirectView is actually interpolated 中的 url 参数,那么你可以在 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&lt;path&gt; 将被输入到RedirectView。然后,此捕获的变量将在您提供的 url 参数中替换,如果您的原始路径是 /old/yay/mypath,则为我们提供 /new_path/yay/mypath

      如果您还想复制查询字符串,也可以使用….as_view(url='…', query_string=True)

      【讨论】:

        【解决方案6】:

        对于 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】:

          小心。我在开发服务器上做了这个,以后想改变它。

          我必须清除我的缓存才能更改它。为了避免以后这种令人头疼的事情,我可以像这样暂时将其设置为:

          from django.views.generic import RedirectView
          
          url(r'^source$', RedirectView.as_view(permanent=False, 
                                                url='/dest/')),
          

          【讨论】:

            【解决方案8】:

            您可以在“管理”部分执行此操作。文档中对此进行了解释。

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

            【讨论】:

            • 虽然与我的问题不太相关,但这仍然是一条有趣的信息。
            【解决方案9】:

            page_path = 在 urls.py 中定义

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 2010-12-10
                • 1970-01-01
                • 2021-12-25
                • 2011-05-26
                • 2015-08-12
                • 1970-01-01
                • 2018-03-17
                相关资源
                最近更新 更多