django框架学习(token鉴权、增删查改、请求信息、跨域)
MVC
MVC,是模型(Model)-视图(View)-控制器(Controller)的缩写。其具体定义如下:
M:模型(Model),数据存取层,负责业务对象和数据库对象。
V:视图(View),与用户的交互,负责显示与怎样显示。
C:控制器(Controller),接受用户动作,调用模型,输出相应视图。
MTV
Django的MTV设计模式是借鉴和遵循MVC的。
MTV具体定义如下:
M:模型(Model),负责业务对象和数据库的关系映射。
T:模板(Template),负责如何把页面展示给用户。
V:视图(View),负责业务逻辑,并在适当时候调用模型和模板。
=====================================================
本章参考来源于csdn曲鸟的自动化测试平台二、三章
https://quniao.blog.csdn.net/article/details/121558074
如果不使用本篇封装的增删查改接口,按原本的增删查改,可以参考
https://www.cnblogs.com/zuichuyouren/p/11094673.html
获取请求相关信息参考
https://www.cnblogs.com/yblackd/p/12008536.html https://www.cnblogs.com/liudinglong/p/12543733.html
跨域问题参考
https://blog.csdn.net/aiyulove201314/article/details/101166137
一、创建项目的管理员
python manage.py createsuperuser
根据提示输入用户名密码邮件,创建成功后会在auth_user表
二、开发登录接口
1、创建应用user
django-admin startapp user
2、注册到setting文件
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'user', 'rest_framework', 'rest_framework.authtoken' ]
3、安装依赖
django-cors-headers==3.10.1 djangorestframework==3.10.0
4、定义post接口 /user/login
{ "username":"admin", "password":"whitewall" }
5、view文件
from django.contrib.auth import authenticate from rest_framework import status from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework.authtoken.models import Token @api_view(['POST']) def login(request): # 验证用户帐号密码的内置方法 user = authenticate(username=request.data['username'], password=request.data['password']) if user: Token.objects.filter(user_id=user.id).delete() # 删除原来的token token = Token.objects.create(user=user) # 创建新的token return Response(data={'msg': '登录成功!', 'token': token.key}) # 返回token return Response(data={'msg': '用户名或错误!'}, status=status.HTTP_401_UNAUTHORIZED)
5、user应用下新建urls.py文件
from django.urls import path from user.views import login app_name = "accounts" urlpatterns = [ path('login', login), # 代表请求接口路径 ]
6、主配置urls.py文件配置如下,目的是将user应用下的url注册到这里,并增加前缀user/
from django.contrib import admin from django.urls import path from django.urls import include urlpatterns = [ path('admin/', admin.site.urls), path('user/', include('user.urls', namespace='user')), ]
7、验证,token是存在authtoken_token表

三、验证token
1、sitting文件配置校验
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', ] }
2、在view文件引用
from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated
3、在view中需要鉴权的接口添加装饰器,2个装饰器缺一不可
@api_view(['POST']) @permission_classes((IsAuthenticated,)) def check_token(request): return Response(data={'msg': 'token有效!'})
4、请求该接口时,请求头配置
Authorization:Token 登录返回的token
四、通过DRF视图快速实现增删查改
对于用户的增删改查,我们不需要写4个接口,通过restframework可以很方便开发通用的功能接口
1、根目录创建一个公共方法的文件夹comFuc,并创建文件comViews.py
from rest_framework import mixins from rest_framework.generics import GenericAPIView class ComAllAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.RetrieveModelMixin, GenericAPIView): # 查询 def get(self, request, *args, **kwargs): if request.parser_context['kwargs']: # 如果有id,则查单个值 return self.retrieve(request, *args, **kwargs) return self.list(request, *args, **kwargs) # 创建 def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) # 更新部分字段 def patch(self, request, *args, **kwargs): return self.partial_update(request, *args, **kwargs) # 删除 def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)
2、在user应用下创建序列化文件serializers.py
class UserSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) class Meta: model = User fields = '__all__'
配置密码只写,不可读
3、view文件写入用户操作的方法
from comFunc.comViews import ComAllAPIView from user.serializers import UserSerializer from django.contrib.auth.models import User class UserView(ComAllAPIView): serializer_class = UserSerializer permission_classes = (IsAuthenticated,) queryset = User.objects.all()
4、user下的urls文件更新如下
from django.urls import path from user.views import login,UserView,token_veri app_name = "user" urlpatterns = [ path('login/', login), path('all', UserView.as_view()), path('all<int:pk>', UserView.as_view()), path('token/', token_veri), ]
5、查询所有用户,因为屏蔽了密码,所以接口返回没有密码

2、修改用户id为2的用户
请求地址:http://127.0.0.1:8000/user/all/2
请求方法:PATCH
{ "email":"123@qn.com" }
3、删除用户id为2的用户
请求地址: http://127.0.0.1:8000/user/all/2
请求方法:DELETE
请求体:无
4、创建用户,重写post方法
class UserView(ComAllAPIView): serializer_class = UserSerializer permission_classes = (IsAuthenticated,) queryset = User.objects.all() def post(self, request, *args, **kwargs): # 如果传递了password字段就用password的字段,没有则默认密码为123456 pwd = request.data.get('password', '123456') request.data['password'] = make_password(pwd) # 调用内置生成密码方法进行加密 return self.create(request, *args, **kwargs)
请求地址: http://127.0.0.1:8000/user/all
请求方法:POST
{ "username":"quniao", "email":"quniao@qn.com" }

浙公网安备 33010602011771号