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"
}

 

posted @ 2019-11-10 18:40  whitewall  阅读(906)  评论(0)    收藏  举报