【问题标题】:issue with custom adapter and django-allauth自定义适配器和 django-allauth 的问题
【发布时间】:2013-01-29 03:13:37
【问题描述】:

我在我的项目中使用django-allauth,我正在尝试使用自定义适配器在登录后重定向用户之前对settings.LOGIN_REDIRECT_URL 做一些工作,相关代码:

from allauth.account.adapter import DefaultAccountAdapter
from django.conf import settings

class DispersionAccountAdapter(DefaultAccountAdapter):

    def get_login_redirect_url(self, request):
        """ Retorna la URL por defecto para redirecciónar,

        esta lo hace formateando la cadena con el nombre del usuario.
        """
        if request.user.is_authenticated():
            return settings.LOGIN_REDIRECT_URL.format(
                username=request.user.username)
        else:
            return "/"

所以,我按照文档说明对我的 settings.py 进行了更改:

LOGIN_REDIRECT_URL = "/{username}/all"
ADAPTER = "dispersion.apps.adapter.DispersionAccountAdapter"
ACCOUNT_ADAPTER = "dispersion.apps.adapter.DispersionAccountAdapter"
ACCOUNT_AUTHENTICATION_METHOD = "username_email"
LOGIN_URL = "/main/login"

因此,当我运行服务器并尝试登录时,我被重定向到 http://127.0.0.1:8000/{username}/all 而不是 http://127.0.0.1:8000/jorge/all(如果那是我的用户名)。我不确定我的设置有什么问题。我尝试了以下没有任何问题:

$ python2 manage.py shell

In [1]: from dispersion.apps.adapter import DispersionAccountAdapter

In [2]: adapter = DispersionAccountAdapter()

非常感谢任何建议或修复! :D

【问题讨论】:

  • 您使用的是哪个版本的allauth?只有最新的开发版本支持get_login_redirect_url
  • 先生,我正在使用您的0.8.3 版本!使用那个版本是不是我做错了什么?

标签: python django adapter django-allauth


【解决方案1】:

allauth.account.adapter.DefaultAccountAdapter 不提供名为“get_login_redirect_url”的方法,因此您的自定义适配器中的方法永远不会被调用。

此方法位于 allauth.utils.py

两种可能的解决方案:

  • 重定向两次:重定向到您在 url 上执行工作的某个视图,然后再次重定向。 imo 这是“易于实施”的解决方案,但人们可能会觉得它很糟糕。

  • 创建一个从 allauth.account.forms.LoginForm 派生的自定义登录表单并覆盖登录方法。此方法返回最终的响应对象

对于此解决方案,您需要使用自定义登录视图。在您的自定义登录视图中,使用“form_class”参数中设置的登录表单类调用 allauth 登录视图。有关详细信息,请参阅 allauth.account.views.login

代码摘要(所提供的代码未经测试并在小 stackoverflow 窗口中编写,因此它绝对不能复制'n'paste,它只是一个小的“howto”指南以阐明目标)

urls.py:

urlpatterns = patterns('',
...
(r'^accounts/login/', my_login_view),
(r'^accounts/', include('allauth.urls')),
...
)

forms.py

from allauth.account.forms import LoginForm as AllauthLoginForm
class MyCustomLoginForm(AllauthLoginForm)
    def login(self, request, redirect_url=None):
        # the original response
        response = super(MyCustomLoginForm, self).login(request, redirect_ur)
        if self.user.is_authenticated():
            r = settings.LOGIN_REDIRECT_URL.format(
                username=self.user.username)
        else:
            r = "/"
        return HttpResponseRedirect(r)

views.py

from allauth.account.views import login as allauth_login
def my_login_view(request):
    return allauth_login(request, form_class=MyCustomLoginForm)

【讨论】:

  • 好吧,我刚刚用easy_install django-allauth安装了它,它不支持它
  • 这是我的观点——最新版本不支持它,github 上的最新开发版本支持。
  • 那你为什么不赞成我的回答?它适用于所有不想依赖开发版本的开发人员......如果他们的软件必须稳定,我强烈建议开发人员不要使用任何库的任何开发版本。
  • @Jakob 太酷了。感谢您的回答,但如果主要开发人员@pennersr 是正确的,我最好等到他发布django-allauth 的新版本,或者无论如何使用github上的开发版本(毕竟我的软件不稳定然而)
【解决方案2】:

您使用的 0.8.3 尚不支持 get_login_redirect_url -- 对此功能的支持是在 0.8.3 之后添加的。

见:https://github.com/pennersr/django-allauth/blob/11ee262c9b9ec4923e8f3a34c71a05dad1dbccbb/ChangeLog#L1-L9

如果您需要此功能,我建议您使用 github 上的开发版本。

【讨论】:

    【解决方案3】:
    <input type="hidden" name="next" value="{{ request.get_full_path }}" />
    

    您需要将以下行添加到表单中。

    【讨论】:

    • 嗨!欢迎来到堆栈溢出。您正在回答一个已有 8 年历史的帖子,并且有一个公认的解决方案——版本控制问题。您能否就您的答案添加一些新信息的原因添加一些上下文?
    猜你喜欢
    • 2015-01-13
    • 1970-01-01
    • 2014-06-09
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2018-02-06
    相关资源
    最近更新 更多