2

私は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

4

3 に答える 3

2

allauth.account.adapter.DefaultAccountAdapter には「get_login_redirect_url」というメソッドが用意されていないため、カスタム アダプタのメソッドが呼び出されることはありません。

このメソッドは allauth.utils.py にあります

考えられる解決策は次の 2 つです。

  • 2 回リダイレクト: URL の作業を行うビューにリダイレクトしてから、もう一度リダイレクトします。これは「実装が簡単な」ソリューションですが、pplはそれが悪いと感じるかもしれません。

また

  • allauth.account.forms.LoginFormから派生したカスタム ログイン フォームを作成し、ログイン メソッドを上書きします。このメソッドは、最終的な応答オブジェクトを返します。

このソリューションでは、カスタム ログイン ビューを使用する必要があります。カスタム ログイン ビューで、ログイン フォーム クラスを「form_class」パラメータに設定して、allauth ログイン ビューを呼び出します。詳細については、 allauth.account.views.loginを参照してください。

コードの要約 (提供されたコードはテストされておらず、小さなスタック オーバーフロー ウィンドウで記述されているため、コピー アンド ペーストは確実に機能しません。目標を明確にするための小さな「ハウツー」ガイドです)

urls.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)

ビュー.py

from allauth.account.views import login as allauth_login
def my_login_view(request):
    return allauth_login(request, form_class=MyCustomLoginForm)
于 2013-01-29T14:13:04.913 に答える
1

まだサポートされていない 0.8.3 を使用していますget_login_redirect_url-- この機能のサポートは 0.8.3 の後に追加されました。

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

この機能が必要な場合は、github で開発版を使用することをお勧めします。

于 2013-01-29T19:30:57.650 に答える