要使用Django Rest Auth创建一个自定义的登录视图,首先需要确保已经安装了Django Rest Auth库。如果没有安装,可以通过以下命令进行安装:
```bash
pip install djangorestframework-simplejwt
pip install djangorestframework-social-oauth2
```
然后,需要在`INSTALLED_APPS`设置中添加`rest_framework_simplejwt`, `rest_framework_social_oauth2`和`rest_auth`。
接下来,创建一个新的应用,并在该应用中定义一个登录视图。在应用的`views.py`文件中,加入以下代码:
```python
from django.contrib.auth import get_user_model
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_auth.serializers import UserDetailsSerializer
@api_view(['POST'])
@permission_classes([AllowAny])
def custom_login(request):
username = request.data.get('username')
password = request.data.get('password')
UserModel = get_user_model()
try:
# 尝试获取用户
user = UserModel.objects.get(username=username)
if user.check_password(password):
# 检查密码是否正确
serializer = UserDetailsSerializer(user)
return Response(serializer.data, status=status.HTTP_200_OK)
except UserModel.DoesNotExist:
pass
# 如果用户名或密码不正确,返回错误信息
return Response({'detail': 'Invalid credentials'}, status=status.HTTP_400_BAD_REQUEST)
```
在应用的`urls.py`文件中,添加如下代码:
```python
from django.urls import path
from .views import custom_login
urlpatterns = [
path('login/', custom_login, name='custom-login'),
]
```
以上代码创建了一个简单的登录视图,它接受用户名和密码作为参数,尝试获取对应的用户。如果用户存在并且密码正确,则返回用户的详细信息;如果用户名或密码不正确,则返回错误信息。
测试用例可以如下编写:
```python
import requests
def test_custom_login():
data = {
'username': 'my_user',
'password': 'my_password',
}
response = requests.post('http://localhost:8000/api/v1/accounts/login/', data=data)
assert response.status_code == 200
assert 'username' in response.json()
assert 'email' in response.json()
data['password'] = 'wrong_password'
response = requests.post('http://localhost:8000/api/v1/accounts/login/', data=data)
assert response.status_code == 400
assert 'detail' in response.json()
test_custom_login()
```
如果使用的是Social OAuth,可以在创建自定义登录视图时添加如下代码:
```python
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_auth.social_views import SocialLoginView
from allAuthSocialBackends import FacebookOAuth2
@api_view(['POST'])
@permission_classes([AllowAny])
def custom_login(request):
backend = request.data.get('backend')
token = request.data.get('token')
if backend == 'facebook':
backend = FacebookOAuth2()
else:
return Response({'detail': 'Invalid backend'}, status=status.HTTP_400_BAD_REQUEST)
try:
# 使用backend和token登录用户
user = backend.do_auth(token)
if user is not None and user.is_active:
return Response({'detail': 'Login successful', 'user_id': user.pk}, status=status.HTTP_200_OK)
except Exception as e:
pass
# 如果登录失败,返回错误信息
return Response({'detail': 'Invalid credentials'}, status=status.HTTP_400_BAD_REQUEST)
```
在这个版本的自定义登录视图中,我们接受一个额外的参数`backend`和一个token。根据这个参数,我们可以使用相应的后端(比如Facebook)进行登录。如果登录成功,则返回用户ID;如果登录失败,则返回错误信息。