自定义 django 身份验证后端不使用基本登录视图记录用户
Custom django auth backend not logging the user with base login view
我正在编写一个自定义的 django 身份验证后端,它向服务器发送一个仅包含用户名和密码信息的 post 请求,如果 login/password 对,服务器会回复一些关于用户的数据是正确的(否则为 403 响应)
代码运行良好,如果用户不存在则创建用户,然后 returns 用户(进行单元测试并通过)。但是,默认登录视图不会让用户登录。
这是后端代码:
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'
),
我花了相当多的时间来追踪用户未登录的原因,但没有成功。
在这个问题上有人可以启发我吗?谢谢!
根据the docs,get_user
方法应该以模型的主键作为参数:
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
我正在编写一个自定义的 django 身份验证后端,它向服务器发送一个仅包含用户名和密码信息的 post 请求,如果 login/password 对,服务器会回复一些关于用户的数据是正确的(否则为 403 响应)
代码运行良好,如果用户不存在则创建用户,然后 returns 用户(进行单元测试并通过)。但是,默认登录视图不会让用户登录。
这是后端代码:
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'
),
我花了相当多的时间来追踪用户未登录的原因,但没有成功。
在这个问题上有人可以启发我吗?谢谢!
根据the docs,get_user
方法应该以模型的主键作为参数:
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None