2

ユーザー名とパスワードの情報だけを含む投稿要求をサーバーに送信するカスタム django 認証バックエンドを作成しています。サーバーは、ログイン/パスワードの組み合わせが正しい場合、ユーザーに関するいくつかのデータを返します (それ以外の場合は 403 応答)。

コードは正常に動作し、ユーザーがまだ存在しない場合は作成し、ユーザーを返します (合格している単体テストを作成します)。ただし、デフォルトのログイン ビューではユーザーはログインしません。
バックエンドのコードは次のとおりです。

from django.contrib.auth import get_user_model
import requests

User = get_user_model()


class CustomAuthBackend():
    def authenticate(self, username, password):
        response = requests.post(
            LOGIN_SERVER_URL,
            data={'username': username, 'password': password}
        )
        if response.status_code == 200:
            try:
                return User.objects.get(username=username)
            except User.DoesNotExist:
                user = User.objects.create_user(
                    username=username,
                    password=password
                )
                user_data = response.json()['user']
                user.last_name = user_data['last_name']
                user.first_name = user_data['first_name']
                user.email = user_data['email']
                user.save()
                return user

    def get_user(self, username):
        try:
            return User.objects.get(username=username)
        except User.DoesNotExist:
            return None

そして、ログイン ビューの呼び出し (カスタム フォームは、フォーム上にプレースホルダーを配置するだけです):

from django.conf.urls import url
from django.contrib.auth.views import logout, login
from accounts.forms import CustomAuthenticationForm

url(
        r'^login$',
        login,
        {
            'template_name': 'login.html',
            'authentication_form': CustomAuthenticationForm
        },
        name='login'
    ),

ユーザーがログインしていない理由を追跡するのにかなりの時間を費やしましたが、成功しませんでした。
この問題について教えてくれる人はいますか? ありがとう !

4

1 に答える 1

1

docsによると、get_userメソッドはモデルの主キーを引数として受け取る必要があります。

def get_user(self, user_id):
    try:
        return User.objects.get(pk=user_id)
    except User.DoesNotExist:
        return None
于 2016-05-16T14:14:35.823 に答える