drf入门规范

Resful的十条规范

什么是 resful:

resfu全称为:REST全称是Representational State Transfer,表征性状态转移

Web API接口的设计风格,尤其适用于前后端分离的应用模式中。

规范:

  1. 数据的安全保障:URL连接一般采用https协议进行传输,https是http+ssl的安全超文本的传输方式
  2. 接口特征表现:在api地址中带有接口标识一般放在地址栏(域)中例如:
  • https://api.baidu.com 和 https://www.baidu.com/api
  1. 多版本共存,在url中带有版本标识

-Weibo API

-https://api.weibo.com/v2/

-新浪微博开放平台-首页

-https://api.weibo.com/v1/login --->需要的参数name和pwd

-https://api.weibo.com/v2/login --->需要的参数name和pwd和code

  1. 数据其实就是资源,可以使用名词和复数,前后端交互的数据称之为资源,资源名都是名词,避免使用动词

-https://127.0.0.1/api/v1/users

  1. 资源的操作方式,以请求方式决定的(method)
  • 获取资源:get
  • 新增资源:post
  • 修改资源:put
  • 删除资源:delete
    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    - patch请求:局部修改主键为1的书
    https://api.baidu.com/books/1    -delete请求:删除主键为1的书

  1. url 中附带搜素或过滤条件
  2. 响应状态码,http:100,200,300,400,500,其他的状态码一般都是自定义的状态码,根据公司的需求决定
  3. 返回中携带错误信息
{'code':100,'msg':成功}

  "Message": "send success",

  1. 返回结果符合一下规范


GET /collection:返回资源对象的列表(数组)       [{name:xx,age:19},{name:xx,age:19},{}]
  
GET /collection/resource:返回单个资源对象        {name:xx,age:19}
 
POST /collection:返回新生成的资源对象             {name:yy,age:19}
 
PUT /collection/resource:返回完整的资源对象       {name:xx,age:20}

PATCH /collection/resource:返回完整的资源对象     {name:xx,age:20}
   
DELETE /collection/resource:返回一个空文档        

  1. 返回数据携带url连接
"url": "http://blog.sina.com.cn/zaku",

序列化与反序列化

json pickle 序列化和反序列化

序列化

序列化:把我们熟知的数据结构(python中的dict, list str int float bool,None},转化为其他语言能识别的数据结构

JSON

python

object

dict

array

list

number(int)

int

ture,false

true,false

null

None

number(real)

float

string

str

在前后端混合交互时,使用的就是json格式的字符串交互

在前后端分离的场景下,使用的是

  • 前端发送请求数据
  • 后端去数据库查询
  • 返回一个queryset对象
  • 把queryset对象转为json字符串格式的数据
  • 最终返回给前端

反序列化

把别的语言的数据转化为我们语言能够识别的数据结构

前端给我们的json数据,转化为字典,列表等数据例如{'name':'kk','age':19}

在前后端分离情况下指的是

  • 前端携带json格式数据返回给后端
  • 后端拿到json格式的数据
  • 把拿到的数据转为对象保存到数据库中

Django REST framework安装和快速使用

安装

DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。(若没有Django环境,需要先创建环境安装Django)

pip install djangorestframework #安装框架

添加rest_framework应用

我们利用在Django框架学习中创建的demo工程,在settings.pyINSTALLED_APPS中添加'rest_framework'。必须注册

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'testapp',
    'testrestapi',
    'rest_framework', #配置 rest_framework app
]

使用

创建序列化器

序列化器是DRF中的一个核心概念。它们负责将Django模型转换为JSON、XML或其他格式的数据,并反之亦然。下面是一个简单的序列化器示例,用于将Django的User模型序列化为JSON格式:

在当前应用下新建一个serializers的py文件

from rest_framework import serializers

from app01.models import Book


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

路由

from django.contrib import admin
from django.urls import path
from rest_framework.routers import SimpleRouter

from app01 import views

router = SimpleRouter()
router.register(r'books', views.BookViewSet, 'books ')

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

视图

from rest_framework.viewsets import ModelViewSet

from app01.models import Book
from .serializer import BookSerializer


class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

cbv的执行流程
from django.views import View
class BookViews(view)
对象方法
def get(self,reuqest,*args,**kwargs):
return 四件套
def post(self,reuqest,*args,**kwargs):
return 四件套

路由配置:

path('Bookviews/', views.Boksview.as_view()),as_view就是类的绑定方法

类的装饰器:@class method

cbv执行流程:从路由开始(入口),当请求过来时,路由匹配会执行index(request,有参传参)

as_viwe执行结果是什么?

        def view(request, *args, **kwargs):
            return self.dispatch(request, *args, **kwargs)

本质就是在执行viwe()相当于执行self.dispatch(request, *args, **kwargs),所以去类中寻找dispatch

   def dispatch(self, request, *args, **kwargs):
    
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

getattr:反射:通过字符串去对对象中寻找属性或方法

if request.method.lower() in self.http_method_names:
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

request当次请求对象取出method取出列表中的请求方式,转为小写判断是否在这个列表里,如果在列表中执行

 handler = getattr(self, request.method.lower(), self.http_method_not_allowed)

这里的self是谁调用就是谁的对象,那么就是开始userinfo这个对象

handler是BookViews中的(如果是get就是get,post就是post)方法其实就是真正的执行原来视图函数的内容,最终返回

总结

写cbv'时,只需要在视图类中写跟请求方式同名的方法即可,使用不同的请求方式,就会执行不同的执行方法,在这个方法中只需要写原来的方法逻辑即可。

ApI View源码分析

在视图函数中导入

from rest_framework。views import APIview

Aipview :继承了django的View

from rest_framework.response import Response

返回时将会返回ResPonse,以后就可以直接使用Response即可,不需要在使用JsonPonse

以后使用drf写符合apirestful规范接口时,都继承APIView

继承 ApiView和Response 编写五个接口

from rest_framework.response import Response
from rest_framework。views import APIview
class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer


class Books(APIView):
    def get(self,request,pk):
        book_list = Book.objects.filter(id=pk).first()
        l=[]
        for i in book_list:
            l.append({'name':i.name,'price':i.price,})
        return Response({'code':100,'msg':'ok','results':l})


    def delete(self,request,pk):
        book_list = Book.objects.filter(id=pk).delete()
        return Response({'code':100,'msg':'ok','results':book_list})


    def post(self,request):
        data=json.loads(request.body)
        book_list=Book.objects.create(**data)
        return Response({'code':100,'msg':'ok','results':{'name':book_list.name,'price':book_list}})

    def put(self,request):
        data=json.loads(request.body)
        book_list=Book.objects.update(**data)
        return Response({'code':100,'msg':'ok','results':{'name':book_list.name,'price':book_list}}
)

你可能感兴趣的:(python,django,后端)