我如何 'monkey patch' 或覆盖 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() 方法猴子修补 User 模型吗?如果可能的话,我应该在哪里执行此操作以便将其附加到页面请求?
您正在使用的 django-lazysignup
允许您提供自定义 LazyUser class (here)。您需要做的就是使用定义的 is_authenticated
方法编写 lazysignup.models.LazyUser
的 subclass 并将其设置为 settings.LAZYSIGNUP_USER_MODEL
.
但这不是你的麻烦的结束。很多 django 应用程序
假设经过身份验证的用户具有某些属性。主要是is_staff
、is_superuser
、permissions
、groups
。首先,django.contrib.admin
需要他们检查它是否可以让用户进入以及向他展示什么。看看django.contrib.auth.models.AnonymousUser
如何嘲笑他们并复制它。备注:看看 AnonymousUser
如何 而不是 subclass 任何用户 class 或 db.Model
。提供用户class只需要嘎嘎
最后只需要替换对 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() 是我自己检查用户是否实际登录的方法。
我安装了 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() 方法猴子修补 User 模型吗?如果可能的话,我应该在哪里执行此操作以便将其附加到页面请求?
django-lazysignup
允许您提供自定义 LazyUser class (here)。您需要做的就是使用定义的 is_authenticated
方法编写 lazysignup.models.LazyUser
的 subclass 并将其设置为 settings.LAZYSIGNUP_USER_MODEL
.
但这不是你的麻烦的结束。很多 django 应用程序
假设经过身份验证的用户具有某些属性。主要是is_staff
、is_superuser
、permissions
、groups
。首先,django.contrib.admin
需要他们检查它是否可以让用户进入以及向他展示什么。看看django.contrib.auth.models.AnonymousUser
如何嘲笑他们并复制它。备注:看看 AnonymousUser
如何 而不是 subclass 任何用户 class 或 db.Model
。提供用户class只需要嘎嘎
最后只需要替换对 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() 是我自己检查用户是否实际登录的方法。