首页 > 其他分享 >【2022-10-08】 DRF从入门到入土(六)

【2022-10-08】 DRF从入门到入土(六)

时间:2022-10-08 19:55:15浏览次数:61  
标签:10 models 08 token book user 2022 import class

drf之路由组件

自动生成路由

# drf提供了两个路由类,只要继承了ViewSetMixin及其子类的视图类,就可以使用这两个路由类来自动生成路由

# 使用步骤如下:
    1 导入模块:from rest_framework.routers import SimpleRouter, DefaultRouter
    2 实例化对象:router = SimpleRouter()
    3 注册路由:router.register('user',views.UserView,'user')    # 第一个参数是路径,第二个参数是视图类,第三个参数是别名,可以注册多个哦
    4 添加到urlpatterns中(有两种方式)
        urlpatterns+=router.urls
        path('', include(router.urls)),

    
# SimpleRouter和DefaultRouter
	DefaultRouter比SimpleRouter多一个根路径,显示所有注册过的路由

action装饰器

# 在视图函数中,会有一些其它名字的方法,必须要使用action装饰器做映射
    # methods:支持的请求方式,列表
    # detail:默认是False 控制生成的路由是 /user/login/ 还是 /user/pk/login  如果值是True则带pk,反之则不带
    # url_path: 控制生成的/user/后面的路径是什么,如果不写,默认以方法名命名   /user/login/,一般跟函数名同名即可
    # url_name:别名,用于反向解析
    	
    @action(methods=['GET','POST'], detail=True, url_path='login')
    def login(self, request,pk):

# 这样写了以后可以:自动生成路由

drf之认证组件

创建认证类

# 通过认证类完成用户登录认证,使用步骤如下:
	1 写一个认证类,继承BaseAuthentication
    2 重写authenticate方法,在内部做认证
    3 如果认证通过,返回2个值
    4 认证不通过抛AuthenticationFailed异常
    5 只要返回了两个值,在后续的request.user 就是当前登录用户
    6 如果想让某个视图类登录后才能访问
    	-方式一:局部配置
        	class BookView(ModelViewSet):
    			authentication_classes = [LoginAuth,]
                
        -方式二:全局配置
        	REST_FRAMEWORK={
            'DEFAULT_AUTHENTICATION_CLASSES':['app01.auth.LoginAuth',]
        }
            
         -局部禁用:
        	authentication_classes = []

代码示例

from rest_framework.authentication import BaseAuthentication
from .models import BookToken
from rest_framework.exceptions import AuthenticationFailed


class LoginAuth(BaseAuthentication):
    def authenticate(self, request):
        token = request.GET.get('token')
        book_token = BookToken.objects.filter(token=token).first()
        if book_token:
            return book_token.book, token
        else:
            raise AuthenticationFailed('您还没有进行认证,请认证后进行登录')

自主练习

登录接口编写

urls.py
from django.contrib import admin
from django.urls import path, include
from app01 import views
from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register('user', views.UserView, 'user')

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(router.urls)),
]

models.py
from django.db import models


# Create your models here.


class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)

    def __str__(self):
        return self.username


class UserToken(models.Model):
    user = models.OneToOneField(to='User', on_delete=models.CASCADE)
    token = models.CharField(max_length=32, null=True)

views.py
from django.shortcuts import render
from rest_framework.viewsets import ViewSet
from rest_framework.decorators import action
from .models import User, UserToken
import uuid
from rest_framework.response import Response


# Create your views here.


class UserView(ViewSet):

    @action(methods=['POST', ], detail=False, url_path='login')
    def login(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user = User.objects.filter(username=username, password=password).first()
        if user:
            token = str(uuid.uuid4())  
            UserToken.objects.update_or_create(defaults={'token': token}, user=user)
            return Response({'code': 100, 'msg': '登录成功', 'token': token})
        else:
            return Response({'code': 101, 'msg': '用户名或密码错误'})

验证

图书和出版社接口编写

urls.py
from django.contrib import admin
from django.urls import path, include
from app01 import views


urlpatterns = [
    path('admin/', admin.site.urls),
    path('books/', views.BookView.as_view()),
    path('books/<int:pk>', views.BookDetailView.as_view()),
    path('publish/', views.PublishView.as_view()),
    path('publish/<int:pk>', views.PublishDetailView.as_view()),
]

models.py
from django.db import models


class Book(models.Model):
    "书籍表"
    book_name = models.CharField(max_length=32)
    book_price = models.CharField(max_length=32)
    book_publish = models.CharField(max_length=32)

    def __str__(self):
        return self.book_name


class Publish(models.Model):
    "出版社表"
    publish_name = models.CharField(max_length=32)
    publish_address = models.CharField(max_length=128)
    book = models.ForeignKey(to='Book', on_delete=models.CASCADE)

    def __str__(self):
        return self.publish_name


class BookToken(models.Model):
    book = models.ForeignKey(to='Book', on_delete=models.CASCADE)
    token = models.CharField(max_length=32, null=True)

serializer.py
from rest_framework import serializers
from .models import Book, Publish


class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'

views.py
from django.shortcuts import render

from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .models import Book, Publish
from .serializer import BookModelSerializer, PublishModelSerializer
from rest_framework.viewsets import ViewSet


class BookView(ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer


class BookDetailView(RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer


class PublishView(ListCreateAPIView):

    authentication_classes = []
    queryset = Publish.objects.all()
    serializer_class = PublishModelSerializer


class PublishDetailView(RetrieveUpdateDestroyAPIView):
    authentication_classes = []
    queryset = Publish.objects.all()
    serializer_class = PublishModelSerializer

auth.py
from rest_framework.authentication import BaseAuthentication
from .models import BookToken
from rest_framework.exceptions import AuthenticationFailed


class LoginAuth(BaseAuthentication):
    def authenticate(self, request):
        token = request.GET.get('token')
        book_token = BookToken.objects.filter(token=token).first()
        if book_token:
            return book_token.book, token
        else:
            raise AuthenticationFailed('您还没有进行认证,请认证后进行登录')

settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.LoginAuth', ]
}
验证

级联删除的其他字段参数

1、models.CASCADE
    级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
2、models.SET_NULL
    当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空
3、models.PROTECT
    当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
4、models.SET_DEFAULT
    当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值
5、models.SET()
    当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
6、models.DO_NOTHING
    什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似

标签:10,models,08,token,book,user,2022,import,class
From: https://www.cnblogs.com/dy12138/p/16770030.html

相关文章

  • 钡铼技术工业物联网网关BL110网口如何采集PLC三菱Q03UDE
    钡铼技术工业物联网网关BL110网口如何采集PLC三菱Q03UDE钡铼技术工业物联网网关BL110网口支持采集三菱Q系列(Q03UDE,Q04UDEH,Q06UDEH,Q10UDEH,Q13UDEH,Q20UDEH,Q26U......
  • Dytechlab Cup 2022 (A - C)
    DytechlabCup2022(A-C)A-ElaSortingBooks分析:贪心,将字符串每一位都存在map里,从前往后尽量让每一个\(n/k\)的段\(mex\)值尽量大,模拟mex即可。voidsolve(){ ......
  • 【闲话】2022.10.08
    今日考试又寄了怎么凡是Accoders上的考试我都会寄啊今天Winter'SRain先生搞魔改猪国杀然后\(\color{red}{\查\抄\正\着\}\)实在是……太巨了今天挂一张......
  • 随身WIFI刷机记录 UF1003
    设备说明拿到手的设备是UF1003的设备,入手价格23元。视频会同步到BIlibili,感谢大家的支持,点个三连吧,谢谢。刷机过程拆机,按住主板上的按钮,连接电脑USB接口,发现可以使用9......
  • 2022洛阳师范学院ACM实验室招新竞赛题解
    A萌新签到题目描述欢迎大家来参加2022洛阳师范学院ACM实验室新生赛,我们实验室全体学长学姐从暑假一直期盼着你们的到来。我们的小萌新那么可爱,学长学姐肯定不会为难大......
  • 110、120、119 的警铃有何区别?
    这是有国家标准的,GB8108-1999。常用的就前四种。主要就是声调变换的周期不一样。消防车的最长,高低转换要三到五秒。警车的最短,一秒变两三次。至于频率上的不同,不做......
  • win10:你需要来自XXXX的权限才能对此文件夹进行更改
    转载请注明来源:https://www.cnblogs.com/Sherlock-L/p/16769720.html起因软件运行失败,看报错信息是删除某个文件夹失败了,行吧,我自己来删。找到目标文件夹后,发现管理员的......
  • Ele_0008:electron 锁屏恢复事件 resume unlock-screen once事件响应一次
    1,有的时候需要监听Electron的系统恢复事件(从睡眠、休眠中恢复,或者从锁屏状态恢复),这个时候我们会使用Electron主进程powerMonitor模块的resume事件或者unlock-screen事件......
  • 10月css 学习记录
    1.滚动条css样式:html{box-sizing:border-box;scrollbar-width:thin;}*,*:before,*:after{box-sizing:inherit;scrollbar-width:inherit;}//伪元素无法继承*::-w......
  • 2022-2023-1 20221423 《计算机基础与程序设计》第六周学习总结
    学期2022-2023-1学号20221423《计算机基础与程序设计》第六周学习总结作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计)这个作业要求在哪里20......