前期学习准备

drf整体内容

1.入门规范
    -web开发模式
    -api接口
    -接口测试工具
    -restful规范
    -序列化反序列化
    -drf快速使用
    -APIView,Request类
    -drf把django的好多东西都重写了
    
2.序列化组件(重要)
    -基本序列化类
    -模型类序列化类
    -如何序列化
    -如何反序列化
    -反序列化的数据校验功能
    
3.请求与响应
	-drf的request已经不是原来django的request
    -drf的response已经不是原来的django的response
    -指定可以接受请求的编码方式
    -指定响应格式
    
4.视图组件
	-两个视图基类
    -5个视图扩展类
    -9个视图子类
    -视图集
    
 5.路由
	-自动生成路由
    
 6.认证(登录认证),权限,频率(重点)

 7.过滤,排序,分页(次重点)
    
 8.自动生成接口文档
-----------------------------------------
9.JWT登录认证,区别于cookie于session,主流
10.后台管理美化(django原生的很丑,simpleui二次开发)
11.基于角色的访问控制,权限的控制

学习资料

 个人博客:https,证书过期,忽略
	https://www.liuqingzheng.top/
cnblogs博客(后期迁移到这里,高级部分的内容)
	https://www.cnblogs.com/liuqingzheng 
知乎
	https://www.zhihu.com/people/justin_liu

今日内容

1.web应用模式

django web框架,专门用来写web项目

前后端混合项目:
    -后端人员,写后端,也要写【模板语法】---》xx.html的python代码
    -全栈开发-->前后端混合时代,比较多

前后端分离项目:
    -后端人员,一点前端都不需要动,只需要写接口即可
    -全栈开发---》web后端,前端框架(vue,react)

image

image

2.API接口

	为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本【前后端】
    通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介
    http://127.0.0.1/books/   
	点赞,点踩  就是API接口
    
API接口:就是前后端交互的媒介
	 -url地址:https://api.map.baidu.com/place/v2/search
    -请求方式:get,post,delete,put。。。。
    -请求参数:json格式的key-value类型数据
    	-早些年 前后端交互使用xml格式----》ajax:异步JavaScript和XML
        -后来,随着json格式的出现,成了主流,直到现在
        -以后:一定会出现,比json更高效的交互格式,更安全
    -响应结果:json格式的数据
 
API接口案例
	https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295&region=上海&query=肯德基&output=xml
    
	https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295&region=上海&query=肯德基&output=json

3.接口测试工具postman

作为后端,写好了接口,我们自己要测试通过,再给别人用

写的接口,需要有个工具测试

	浏览器只能自动发送get请求,不能自动发送post,delete请求
  	postman开源软件,指示谷歌浏览器的插件,越做越好,后来可以安装到操作系统中,最后收费
    -postwoman
    -很多很多其他的,不同公司用的也可能不一样,你只需要明白一个点,这个工具只是用来发送http请求
    
    postman的使用
	-1 官方下载:https://www.postman.com/downloads/?utm_source=postman-home----》Postman-win64-Setup.exe
    -2 按照,双击即可

image

image

image

restful规范

# 概念
REST全称是Representational State Transfer,中文意思是表述:表征性状态转移,它首次出现在2000年Roy Fielding的博士论文中。
RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中

# 10个规范
        -1 数据的安全保障,通常使用https(http+ssl/tsl)协议
            -url连接一般采用https协议进行传输
            -采用https协议,可以提高数据交互过程中的安全性

        -2 接口中带api标识
            -https://api.lqz.com/books
            -https://www.lqz.com/api/books    一般我们使用这个

        -3 多版本共存,路径中带版本信息
            -https://api.lqz.com/v1/login
            -https://www.lqz.com/api/v2/login  这是两个不同的登录版本

        -4 数据即是资源,均使用名词,尽量不出现动词(最核心的)
            -接口一般都是完成前后台数据的交互,交互的数据我们称之为资源
            -接口的形式如下
            https://api.baidu.com/users
            https://api.baidu.com/books   这些都是名词,加了复数
            -特殊的接口可以出现东西,因为这些接口一般没有一个明确的资源,或是动词就是接口的核心		含义,如登录接口:https://api.baidu.com/login

        -5 资源才做由请求方式决定(method)
            -操作资源一般都会涉及到增删改查,我们提供请求方式来标识增删改查动作
            https://api.baidu.com/books    -get请求:获取所有书
            https://api.baidu.com/books/1  -get请求:获取主键为1的书
            https://api.baidu.com/books    -post请求:新增一本书书
            https://api.baidu.com/books/1  -put请求:修改主键为1的书
            https://api.baidu.com/books/1  -delete请求:删除主键为1的书

        -6 在请求地址中带过滤条件
            https://api.baidu.com/books?name=红&price=99   ?后面携带条件,也就是get请		求的数据

        -7 响应状态码:两套
            -http响应状态码:1xx:请求正在处理,2xx:成功响应,3xx:重定向,4xx:客户端错					误,5xx:服务端错误
            -https://blog.csdn.net/li_chunlong/article/details/120787872
            -公司内部规定的响应状态码,放在响应体中
            {code:0}   咱们后期一般使用100  101 102这种	

        -8 返回数据中带错误信息
            {
                code:0
                msg: "ok/用户名错误"
            }

        -9 返回的结果应该符合以下规范--->好多公司不遵循这个
            GET 获取所有数据:返回资源对象的列表(数组)[{name:红楼梦,price:99},{name: 				红楼梦,price:99},{name:红楼梦,price:99}]
            GET 单个对象:返回单个资源对象:{name:红楼梦,price:99}
            POST 新增对象:返回新生成的资源对象:{name:西游记,price:99}
            PUT 修改对象:返回完整的资源对象 :{name:西游记,price:100}
            DELETE 删除:返回一个空文档 

        -10 响应数据中带链接

序列化与反序列化

# API接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把【数据转换格式】,序列化可以分两个阶段:

# 序列化:把我们识别的数据转成指定的格式提供给别人
	-字典、列表------》json格式存到文件中
    -例如: 我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前段或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人
    -序列化也可以理解为读数据库的过程,read,我们将从数据库中读取的东西序列化提供给别人
    
# 反序列化:把别人提供的数据转化/还原成我们需要的格式
	-例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中
     -反序列化也可以理解为写入数据库的过程,write,我们将别人发过来的数据反序列化转为模型类,然后写入我们的数据库中

基于django原生编写5个接口

# 以后写的接口,基本上都是5个接口及其变形
	-查询所有
     -查询单个
     -新增一个
     -修改一个
     -删除一个

 # 基于books单标为例,写5个接口
        -创建book表
        -表迁移
        -录入假数据:直接录
        -写查询所有接口---》遵循restful规范,使用cbv
        -新增一个数据---
        -查询一个
        -修改一个:put提交的数据,不能从requets.POST中取
        -删除一个
        
代码展示:
    class BooksView(views.View):
        # 查询所有的书籍
        def get(self, request):

            books = Books.objects.all()
            # 获取到的是queryset对象,里面是列表包对象,所以要把对象拿出来
            book_list = []
            for book in books:
                book_list.append({'name': book.name, 'price': book.price, 'publish': book.publish})
            print(book_list)
            # 返回到前段
            return JsonResponse(book_list, safe=False)

        # 创建书籍
        def post(self, request):
            name = request.POST.get('name')
            price = request.POST.get('price')
            publish = request.POST.get('publish')
            book = Books.objects.create(name=name, price=price, publish=publish)
            return JsonResponse({'name': book.name, 'price': book.price, 'publish': book.publish})



     代码展示:

    class BookView(views.View):

        # 获取单条数据
        def get(self, request, id):
            book = Books.objects.filter(id=id).first()
            return JsonResponse({'name': book.name, 'price': book.price, 'publish': book.publish})

        # 修改单条数据
        def put(self, request, id):
            book = Books.objects.filter(id=id).first()
            new_book = json.loads(request.body)
            book.name = new_book.get('name')
            book.price = new_book.get('price')
            book.publish = new_book.get('publish')
            book.save()
            return JsonResponse({'name': book.name, 'price': book.price, 'publish': book.publish})

        # 删除某条数据
        def delete(self, request, id):
            Books.objects.filter(id=id).delete()
            return JsonResponse(data={})

drf介绍和快速使用

# djangorestframework:  drf 帮助我们快速的实现符合restful规范的接口

# django心醉4.x,一般都会使用最新版的上一版3.x
# drf最新支持到django 3.x,最新不支持2.x
# 安装drf
 pip3 install djangorestframework -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com/simple/
# 由于你是django2.x 它发现它不支持,它会自动写在dajgno,安装最新的django 4.x

# views中
from .serializer import BookSerializer
from rest_framework.viewsets import ModelViewSet
class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

# serializer
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
        
# urls中
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('books', views.BookView, 'books')

urlpatterns = [
    path('admin/', admin.site.urls),
]
# 两个列表相加  [1,2,4] +  [6,7,8]=
urlpatterns += router.urls

cbv源码剖析

# 1 路由中写的:path('api/v1/books/', views.BookView.as_view()),第二个参数无论是fbv还是cbv放的都是函数内存地址
	-当请求来了,匹配成功会执行,views.BookView.as_view()(request)
    -views.BookView.as_view()执行结果是View的类方法as_view返回的结果是内层函数view,是个函数内层地址
    -本身请求来了,匹配成功,会执行view(request)
    def view(request, *args, **kwargs):
        return self.dispatch(request, *args, **kwargs)
    
    -self.dispatch  View类的方法
   	def dispatch(self, request, *args, **kwargs):
        # request.method请求方式转成小写,必须在列表中才能往下走
        if request.method.lower() in self.http_method_names:
            # 反射,去self【
            
            视图类的对象:BookView】,去通过get字符串,反射出属性或方法
            # BookView的get方法
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        # BookView的get方法,加括号,传入request
        return handler(request, *args, **kwargs)

语言和时间的修改

LANGUAGE_CODE = 'zh-hans'  # 中文

TIME_ZONE = 'Asia/Shanghai' # 时区是亚洲上海

USE_I18N = True # 国际化

USE_L10N = True # 本地化

USE_TZ = True # 数据库是否使用TIME_ZONE,True表示使用上海的时区,False表示不使用,使用UTC时间,然后转成上海,会差8个小时

posted @ 2023-01-30 18:36  雪语  阅读(45)  评论(0)    收藏  举报