我如何“猴子补丁”或覆盖User.is_认证()? 使用Djangolazysignup时出现问题

2024-05-15 07:37:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我安装了django lazysignup,现在面临的挑战是User.is_认证()返回True,对于那些不是实际认证用户,而是惰性注册用户。我可以更新任何支票User.is_认证()在我的代码中使用我自己的函数。但是,其他包,如django allauth,检查此方法以确定用户是否已登录,并从尝试访问登录页面重定向。在

class RedirectAuthenticatedUserMixin(object):
    def dispatch(self, request, *args, **kwargs):
        self.request = request
        if request.user.is_authenticated():
            redirect_to = self.get_authenticated_redirect_url()
            response = HttpResponseRedirect(redirect_to)
            return _ajax_response(request, response)
...

在我所包含的每个软件包中,是否有不需要替换is\u authenticated()的建议?似乎他们中的大多数人都希望它能以一种特定的方式运行,而django lazysignup却恰恰相反。我可以用一个新的is\u authenticated()方法来修补用户模型吗?如果可能的话,我应该在哪里执行此操作以便将其附加到页面请求?在


Tags: todjango方法用户selftrueisresponse
2条回答

您正在使用的django-lazysignup允许您交付一个自定义的LazyUser类(here)。您需要做的就是用定义的is_authenticated方法编写lazysignup.models.LazyUser的子类,并将其设置为settings.LAZYSIGNUP_USER_MODEL。在

但你的麻烦还没有结束。很多django应用程序 假设经过身份验证的用户具有一些属性。主要是is_staffis_superuserpermissionsgroups。首先,也是最重要的,django.contrib.admin需要他们检查它是否可以让用户进入以及向他显示什么。看看^{}如何嘲弄他们并复制它。备注:看看AnonymousUser是如何不是子类化任何用户类的,也不是db.Model。提供的用户类只需要呱呱叫。在

最后不得不把所有的电话User.is_认证(). 在

为了防止django allauth从登录页面重定向lazy用户,结果如下所示:

from allauth.account.views import AjaxCapableProcessFormViewMixin

def _ajax_response(request, response, form=None):
    if request.is_ajax():
        if (isinstance(response, HttpResponseRedirect)
            or isinstance(response, HttpResponsePermanentRedirect)):
            redirect_to = response['Location']
        else:
            redirect_to = None
        response = get_adapter().ajax_response(request,
                                           response,
                                           form=form,
                                           redirect_to=redirect_to)
    return response


class RedirectUserWithAccountMixin(object):
    def dispatch(self, request, *args, **kwargs):
        self.request = request
        if user_has_account(request.user):
            redirect_to = self.get_authenticated_redirect_url()
            response = HttpResponseRedirect(redirect_to)
            return _ajax_response(request, response)
        else:
            response = super(RedirectUserWithAccountMixin,
                             self).dispatch(request,
                                            *args,
                                            **kwargs)
        return response

    def get_authenticated_redirect_url(self):
        redirect_field_name = self.redirect_field_name
        return get_login_redirect_url(self.request,
                                      url=self.get_success_url(),
                                      redirect_field_name=redirect_field_name)

class LoginView(RedirectUserWithAccountMixin,
            AjaxCapableProcessFormViewMixin,
            FormView):
...

其中user_has_account()是我自己用来检查用户是否已实际登录的方法。在

相关问题 更多 >