【问题标题】:Django redirect shortcut changes request.userDjango重定向快捷方式更改request.user
【发布时间】:2012-07-22 11:41:00
【问题描述】:

我有一个应用程序,我们将 Django 'User' 对象子分类为具有附加属性的 'AppAccount' 对象。现在我有一个视图可以执行以下操作:

appAccountObject.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, appAccountObject) 
redirect(someOtherView) 

现在根据pdbrequest.user 是在login() 调用之后的AppAccount 的一个实例,但request.usersomeOtherView 第一行中的一个Django User 实例。

为什么重定向调用将用户对象改回正常的 Django 用户?我怎样才能避免这种情况?

另外,上面的代码是否正确?添加backend 属性是否可以绕过对authenticate 的调用?如果不是,那么正确的做法应该是什么:我想自动登录用户,没有他们的凭据,然后重定向到另一个由 @login_required 装饰器包装的视图。

谢谢。

【问题讨论】:

    标签: django django-users


    【解决方案1】:

    重定向会导致来自用户浏览器的全新请求,因此必须根据会话 cookie 再次从数据库中获取用户对象并分配给request.user。这发生在身份验证中间件中。除非您编写了自己的版本,否则它将始终使用默认用户类。

    这只是子类化 User 是个坏主意的原因之一。而是使用与 User 具有 OneToOne 关系的 UserProfile 类对其进行扩展。

    【讨论】:

    • 这是一个继承的应用程序,所以子类化 User 对象是我无法控制的。我们编写了自己的身份验证中间件,它从authenticate 返回 AppAccount 对象,但它似乎仍然返回User。任何线索为什么会发生这种情况?
    • 没关系,将backend 属性更改为我们的自定义身份验证后端,确保我们能够绕过对authenticate 的调用以及正确的对象实例是重定向后request 的一部分.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2022-06-18
    • 2020-01-10
    • 2013-08-09
    • 1970-01-01
    • 2013-12-20
    • 2011-06-29
    相关资源
    最近更新 更多