【问题标题】:django redirect url containing id包含 id 的 django 重定向 url
【发布时间】:2011-02-27 06:19:15
【问题描述】:

我想在我的 settings.py 中添加如下声明:

LOGIN_REDIRECT_URL='^private_profile/(?P<id>\d+)/$'
#or 
LOGIN_REDIRECT_URL='/accounts/private_profile/id/'

这样当 id 为 1 的用户登录时,他将被重定向到

LOGIN_REDIRECT_URL='/accounts/private_profile/1/'

但两种选择,

LOGIN_REDIRECT_URL='^private_profile/(?P<id>\d+)/$'
#or 
LOGIN_REDIRECT_URL='/accounts/private_profile/id/'

错了,因为在我的浏览器中我看不到当前的用户 ID,我哪里错了? 谢谢

【问题讨论】:

  • 也许您可以详细说明您要完成的工作,因为这并不容易。但是,登录后,您始终可以从请求上下文中获取用户 ID。那么为什么在 URL 中需要它呢?
  • 你是对的。我的 url 中不需要 id。我现在知道为什么了。谢谢!

标签: django url redirect


【解决方案1】:

当用户登录时,作为视图的第一个参数传递的请求有一个用户字段。因此,在您看来,您将知道登录了哪个用户:

def userProfile(request):
    print request.user

在我的项目中,我从不在 URL 中指定用户名,因为用户在您的代码中已经知道。

【讨论】:

  • 是的,现在我知道你是对的。我刚刚删除了 id 参数,并且工作正常。谢谢!
【解决方案2】:

您可以将 LOGIN_REDIRECT_URL 设置为检查当前登录用户 ID 的视图。然后,此视图可以将用户重定向到正确的位置。

登录 -> 查看检查当前用户 ID -> 使用用户 ID 重定向到正确的页面

【讨论】:

    【解决方案3】:

    实现这一点的一个技巧是为每个人定义一个通用视图并将它们链接到该视图,然后该视图可能如下所示:

    from django.http import HttpResponseRedirect
    from django.contrib.auth.decorators import login_required
    
    @login_required
    def after_login(request):
        return HttpResponseRedirect('/accounts/private_profile/%d/'%request.user.id)
    

    但正如我在评论中所说,这只是当你真的想要 url 中的用户 ID 时,这在大多数情况下根本没有必要。正如您在我看来,您可以从请求上下文中获取用户 ID,前提是 django.contrib.auth.context_processors.auth 被添加到 settings.py 中的 TEMPLATE_CONTEXT_PROCESSORS 设置中

    【讨论】:

      【解决方案4】:

      我是这样做的。

      #========== Login View ==========#
      def login(request):
         #==login stuff==#
         return HttpResponseRedirect('/accounts/private_profile/'+user.id+'/')
      
      #========== PROJECT urls.py ==========#
      urlpatterns = patterns('',
         (r'^accounts/', include('my_project.accounts.urls')),
         (r'^login/', login),
      )
      
      #========== ACCOUNTS APP urls.py ==========#
      urlpatterns = patterns('',
         (r'^private_profile/(?P<id>\d+)/', private_profile),
      )
      

      【讨论】:

      • 非常感谢!这可能是正确的,但是如果您将 id 放在 url 中,您的应用程序就很容易受到攻击。如果它是一个公共应用程序,任何人都可以访问任何 id,只需更改 url。无论如何,要使其安全变得更加困难。阅读以上答案。他们帮了我很多。
      • 您可以使用装饰器来检查用户是否已通过身份验证。我也有同样的问题:stackoverflow.com/questions/2958597/…
      • 什么是user.id?它没有在您的示例中的任何地方定义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多