Restframework 简单使用

一.安装djangorestframework

pip install djangorestframework

RestFramework是一个能快速为我们提供API接口,方便我们编程的框架。API是后端编程人员写的,为了让前端拿数据的一个接口,通常就是以url的形式存在。 每个项目总有第一个人做基础构架,这个时候就不是仅仅实现一个API就OK了,需要考虑更多的事情,包括  o统一的异常处理 oAPI权限 o统一的参数校验 o缓存如何可以做的更简单统一 o认证 o统一的查询过滤 o代码分层

请求方式 : GET :从服务器取出资源(一项或多项) POST :在服务器新建一个资源 PUT :在服务器更新资源(客户端提供改变后的完整资源——全部修改) PATCH :在服务器更新资源(客户端提供改变的属性——部分修改) DELETE :从服务器删除资源

过滤 :通过在URL上传参的方式,有GET请求获取相应的数据 https://api.example.com/v1/zoos?limit=10:指定返回数据的数量https://api.example.com/v1/zoos?offset=10:指定返回数据的开始位置https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页以及每页的数据数量https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件

状态码 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。 202 Accepted - []:表示一个请求已经进入后台排队(异步任务) 204 NO CONTENT - [DELETE]:用户删除数据成功。 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。 401 Unauthorized - []:表示用户没有权限(令牌、用户名、密码错误)。 403 Forbidden - [] 表示用户得到授权(与401错误相对),但是访问是被禁止的。 404 NOT FOUND - []:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

返回结果 :针对不同操作,服务器向用户返回的结果应该符合以下规范。 GET/collection:返回资源对象的列表 GET/collection/resource:返回单个资源对象 POST/collection:返回新生成的资源对象 PUT/collection/resource:返回完整的资源对象 PATCH/collection/resource:返回完整的资源对象 DELETE/collection/resource:返回一个空文档

项目应用:

django创建app应用

在应用下创建serializers.py文件,django项目下的settings.py文件中 INSTALLED_APPS = [ 'rest_framework', ] 配置分页 REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 10 }

二,restfranework简单使用

新建django项目 pychrame创建django类型的项目

Pycharme 中点击tools 创建应用,在django项目下的settings中配置应用

在应用如rfapp中,models.py中新建数据库的信息 ,

之后新建serializers.py文件。序列化从数据库拿出来的数据发给前端

, 最后在views中,新建BookViewSet类,继承viewsets类

在django项目下的urls中指定路由

再去rfapi应用下,新建urls,urls中使用restframework 的routers

from rest_framework import routers

router = routers.DefaultRouter() router.register('books',viewset=views.BookViewSet)

挂载路由。 启动django 项目,控制台,python manage.py runserver

通过postman调用 http://你配置的ip+端口(默认127.0.0.1:8000)/rfapi/books/ 调用成功说明restframework可以正常使用

三.过滤器的使用 REST framework列表视图的默认行为是返回一个model的全部queryset。通常你却想要你的API来限制queryset返回的数据 整体思路: image.png

pip install django-filter

django项目下settings配置 REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',) } 应用rfapp中新建filters.py文件 import django_filters from rfapp import models class BookFiter(django_filters.rest_framework.FilterSet): btitle = django_filters.rest_framework.CharFilter(field_name='btitle',lookup_expr='icontains')

class Meta:
    model = models.BookInfo
    fields = ['btitle']

在views中,新增 class BookViewSet(baseview.BaseViewSet): # 固定写法 queryset = BookInfo.objects.all()

serializer_class = BookInfoSerializer

filter_backends = (django_filters.rest_framework.DjangoFilterBackend,) filterset_class = filters.BookFiter postman调用验证: http://你配置的ip+端口/rfapi/books?btitle=cjf2

如果你不用过滤器,你是不能通过参数查询数据

四.定义方法 日常工作中需要一些自定义的接口,比如返回一些字段信息,特定的接口逻辑

from rest_framework.decorators import action

class BookViewSet(baseview.BaseViewSet): # 固定写法 queryset = BookInfo.objects.all()

serializer_class = BookInfoSerializer

filterset_class = filters.BookFiter

# 自定义写法
@action(methods=['post'], detail=False,url_path='get_book')
def getbook(self,request):
    bk=BookInfo.objects.all()
    res={}
    blist=[]
    for b in bk:
        bdict={}
        bdict["btitle"]=b.btitle
        bdict["bread"] = b.bread
        bdict["bp_data"] = b.bp_data
        blist.append(bdict)
    res={"code":200,"msg":"查询成功","data":blist}
    return Response(data=res)

主要看下@action装饰器,接收3个参数,是自定义的接口返回,url_path接口路径