python - 自定义适配器和 django-allauth 的问题

标签 python django adapter django-allauth

我正在为我的项目使用 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.account.adapter.DefaultAccountAdapter 不提供名为“get_login_redirect_url”的方法,因此自定义适配器中的方法永远不会被调用。

该方法位于allauth.utils.py

两种可能的解决方案:

  • 重定向两次:重定向到某个 View ,您可以在其中对网址进行处理,然后再次重定向。在我看来,这是一种“易于实现”的解决方案,但人们可能会发现它是一个糟糕的解决方案。

或者

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

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

代码摘要(所提供的代码未在小型 stackoverflow 窗口中进行测试和编写,因此它肯定无法复制粘贴,它只是一个用于阐明目标的小型“操作指南”)

url.py:

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

表单.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)

View .py

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

关于python - 自定义适配器和 django-allauth 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14575071/

相关文章:

python - 未找到变量。将其声明为 envvar 或定义一个默认值

Android RecyclerView 将项目移动到 View 的末尾

python - numpy 数组 <=> python DB-API 适配器?

python - 将字典列表的字典转换为 Pandas 数据框

python - 如何使用 SQLAlchemy 将 pandas DataFrame 更新到 MySQL

python - Django 作为 Tornado 应用程序中的中间件

android - 如何处理 android 中的空 ListView?

python - 由于使用 PyArray_ENABLEFLAGS 导致 Jupyter 崩溃

Python 从嵌套列表中最小数量的重复值创建列表

python - 如何克服“"Package '白噪声”需要不同的Python : 2. 7.16“错误?