簡體   English   中英

如何“猴子補丁”或覆蓋User.is_authenticated()? 使用django-lazysignup產生問題

[英]How do I 'monkey patch' or override User.is_authenticated()? Creates issues with using django-lazysignup

我安裝了django-lazysignup,現在面臨的挑戰是User.is_authenticated()返回True,這不是真正經過身份驗證的用戶,而是延遲注冊的用戶。 我可以使用自己的函數更新代碼中對User.is_authenticated()的所有檢查。 但是,其他軟件包(如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_authenticated()? 他們中的大多數人似乎希望它以一種特定的方式起作用,而django-lazysignup則將其變為現實。 我可以用新的is_authenticated()方法修補用戶模型嗎? 如果可能的話,我應該在哪里做,以便將其附加到頁面請求中?

您正在使用的django-lazysignup允許您交付自定義LazyUser類( 此處 )。 您需要做的就是編寫一個帶有定義的is_authenticated方法的lazysignup.models.LazyUser子類, lazysignup.models.LazyUser其設置為settings.LAZYSIGNUP_USER_MODEL

但這並沒有結束您的麻煩。 許多django應用程序都假定經過身份驗證的用戶具有某些屬性。 主要是is_staffis_superuserpermissionsgroups 首先, django.contrib.admin需要他們檢查是否可以讓用戶進入以及向用戶顯示什么。 查看django.contrib.auth.models.AnonymousUser如何django.contrib.auth.models.AnonymousUser它們並將其復制。 備注:看看AnonymousUser如何繼承任何用戶類或db.Model 提供的用戶類別僅需發出嘎嘎聲。

最終只需要替換對User.is_authenticated()的所有調用。

為了防止django-allauth從登錄頁面重定向惰性用戶,最終看起來像這樣:

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()是我自己的用於檢查用戶是否實際登錄的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM