什么是 resful:
resfu全称为:REST全称是Representational State Transfer,表征性状态转移
Web API接口的设计风格,尤其适用于前后端分离的应用模式中。
规范:
-Weibo API
-https://api.weibo.com/v2/
-新浪微博开放平台-首页
-https://api.weibo.com/v1/login --->需要的参数name和pwd
-https://api.weibo.com/v2/login --->需要的参数name和pwd和code
-https://127.0.0.1/api/v1/users
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的书
{'code':100,'msg':成功}
"Message": "send success",
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:返回一个空文档
"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格式的字符串交互
在前后端分离的场景下,使用的是
把别的语言的数据转化为我们语言能够识别的数据结构
前端给我们的json数据,转化为字典,列表等数据例如{'name':'kk','age':19}
在前后端分离情况下指的是
DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。(若没有Django环境,需要先创建环境安装Django)
pip install djangorestframework #安装框架
我们利用在Django框架学习中创建的demo工程,在settings.py的INSTALLED_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
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'时,只需要在视图类中写跟请求方式同名的方法即可,使用不同的请求方式,就会执行不同的执行方法,在这个方法中只需要写原来的方法逻辑即可。
在视图函数中导入
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}}
)