django前后分离-restful

摘要:
一.django中使用restful1.安装相关库pipinstalldjangorestframework==3.4.6pipinstalldjango-filter#用于过滤2.settings.py配置的修改在工程目录中的settings.py文件的INSTALLED_APPS中需要添加rest_frameworkINSTALLED_APPS=[...'rest_framework',]3.在应用app中定义路由URL定义路由需要注意:使用router.register注册的url为资源,而且资源只能为名词不能为动词。定义的资源不要加'/'斜杠,在访问地址的时候,URL中会默认的添加反斜杠'/'fromdjango.conf.urlsimporturlfromrest_framework.routersimportSimpleRouterfromappimportviews#引入路由router=SimpleRouter()#使用router注册的地址router.registerurlpatterns=[]urlpatterns+=router.urls4.在视图views.py文件中定义StudentView类具体的详细介绍在地址通过定义StudentView并继承了mixins的方法,即可有对应个增删改查的方法。在StudentView中还定义了两个变量queryset、serializer_class。
前言

REST是所有Web应用都应该遵守的架构设计指导原则。

Representational State Transfer,翻译是”表现层状态转化”。

REST核心: 资源, 状态转移, 统一接口

资源:是REST最明显的特征,是指对某类信息实体的抽象,资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。

状态转移:是指客户端痛服务端进行交互的过程中,客户端能够通过对资源的表述,实现操作资源的目的

统一接口:REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。 比如,客户端通过HTTP的4个请求方式(POST, GET, PUT, PATCH)来操作资源,也就意味着不管你的url是什么,不管请求的资源是什么但操作的资源接口都是统一的。

GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT(PATCH)用来更新资源,DELETE用来删除资源。

一.django中使用restful

1.安装相关库

pip install djangorestframework==3.4.6
pip install django-filter # 用于过滤

2.settings.py配置的修改

在工程目录中的settings.py文件的INSTALLED_APPS中需要添加rest_framework

INSTALLED_APPS = [
...

'rest_framework',
]

3.在应用app中定义路由URL

定义路由需要注意:

  1. 使用router.register注册的url为资源,而且资源只能为名词不能为动词。

  2. 定义的资源不要加'/'斜杠,在访问地址的时候,URL中会默认的添加反斜杠'/'

    from django.conf.urls importurl
     
     from rest_framework.routers importSimpleRouter
     
     from app importviews
     
     #引入路由
     router =SimpleRouter()
     #使用router注册的地址
     router.register(r'^student', views.StudentView)
     
     urlpatterns =[
     
     ]
     urlpatterns += router.urls

4.在视图views.py文件中定义StudentView类

具体的详细介绍在地址

通过定义StudentView并继承了mixins的方法,即可有对应个增删改查的方法。在StudentView中还定义了两个变量queryset、serializer_class。

from rest_framework importviewsets, mixins
​
from app.models importStudent
from app.serializers importStudentSerializer
​
​
classStudentView(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  mixins.DestroyModelMixin,
                  mixins.RetrieveModelMixin,
                  mixins.UpdateModelMixin,
                  viewsets.GenericViewSet):
​
    #返回数据
    queryset = Student.objects.all()  #需要需要序列化的数据
    #序列化结果
    serializer_class = StudentSerializer  #指定序列化的类(需自己定义)

其中queryset参数表示需要需要序列化的数据 serializer_class参数指定序列化的类

5.定义序列化类

序列化类需要继承ModelSerializer,使用ModelSerializer表明序列化整个Student模型,并且可以指定虚拟化哪些字段。

from rest_framework importserializers
​
from app.models importStudent
​
classArticleSerializer(serializers.ModelSerializer):
    #序列化时,创建资源需对传入的字段进行校验
    title = serializers.CharField(required=True, max_length=10, min_length=5,
                                  error_messages={
                                    'required': '标题必填',
                                    'max_length':'最大长度10',
                                    'min_length':'最小长度5'})
    desc = serializers.CharField(required=False)
    
    classMeta:
        #指定序列化的模型
        model =Article
        #指定序列化哪些字段
        fields = ['title','desc','id','is_show'] #展示的字段,指定序列化后才能展示
        
   #进一步校验
    defvalidate(self, attrs):
        #校验文章标题是否重复
        title = attrs.get('title')
        iftitle:
            if Article.objects.filter(title=title).exists():
                raise ParamsException({'code':1002, 'msg':'标题重复'})
        returnattrs      
    #父类默认调用
    #将字段定义的值,改成我们想要展示的值(例: is_show的值true变成中文 '展示')
    defto_representation(self, instance):
        data =super().to_representation(instance)
        data['is_show'] = '展示' if data['is_show'] else '不展示'
        return data

通过以上的代码,可以通过以下的URL和HTTP请求方式,完成对资源Student的CRUD操作:

CRUD对应的增删改查:

增: POST http://127.0.0.1:8080/stu/addStu/

删: DELETE http://127.0.0.1:8080/stu/addStu/1/

改: UPDATE http://127.0.0.1:8080/stu/addStu/1/

查: GET http://127.0.0.1:8080/stu/addStu/1/
二.rest响应重构

1.修改响应结构

1.修改settings.py中的返回数据结构的配置信息
#rest_framework 使用相关配置
REST_FRAMEWORK ={
    #分页配置    分页配置只需在setting中设置就ok
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 3,  #每页几条数据
    
    #过滤配置     根据条件来查找数据
    'DEFAULT_FILTER_BACKENDS':(
        'django_filters.rest_framework.DjangoFilterBackend',
    ),
    
    这里修改返回数据结构的配置信息
    #render的配置 响应时自动调用render方法,将字典转化为json数据
    'DEFAULT_RENDERER_CLASSES':(
        'utils.renderer.MyJsonRenderer',
    )
​
}

注意: 定义default_renderer_classes参数,指定render的时候使用我们自定义的renderer.py文件中的CustomJsonRenderer类方法

2.重构JSONRenderer下的render方法

该方法继承了JSONRenderer并且重构了render方法,修改了返回的数据结构

classCustomJsonRenderer(JSONRenderer):

    def render(self, data, accepted_media_type=None, renderer_context=None):

        ifisinstance(data, dict):
            msg = data.pop('msg', '请求成功')
            code = data.pop('code', 0)
        else:
            msg = '请求成功'code =0
     #将http响应状态码改为200, 若不加,抛错时,http的响应状态码会显示500,
     #前端ajax请求信息会是失败,不会进入then,直接执行catch里的语句
        response = renderer_context['response']
        response.status_code = 200
        res ={
            'code': code,
            'msg': msg,
            'data': data
        }

        return super().render(res, accepted_media_type, renderer_context)

2.异常的响应的结构

自定义异常处理,一定需要继承from rest_framework.exceptions import APIException 中的APIException,在编写自己的异常处理的方法

三.分页

修改settings.py配置文件

只需 在rest_framework配置中,增加分页的配置信息

REST_FRAMEWORK ={
    #分页配置    分页配置只需在setting中设置就ok
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 3,  #每页几条数据
}

注意:在结果在data对应的value值中,有一个count的key,表示返回数据有3条,next表示下一个的url,previous表示上一页的url。

四.过滤

修改settings.py配置文件,增加filter过滤的信息

1.安装过滤的库

pip install django-filter

2. 配置setings.py的信息

配置DEFAULT_FILTER_BACKENDS

django2.0以下版本的配置
REST_FRAMEWORK ={
    #分页配置    
.......
    
    #过滤配置     根据条件来查找数据
    'DEFAULT_FILTER_BACKENDS':(
        'rest_framework.filters.DjangoFilterBackend',
        'rest_framework.filters.SearchFilter',
    ),
django2.0以上版本的配置
REST_FRAMEWORK ={
    #分页配置  
........
    #过滤配置     根据条件来查找数据
    'DEFAULT_FILTER_BACKENDS':(
        'django_filters.rest_framework.DjangoFilterBackend',
    ),
}

3.views中指定filter_class

class ArticleView(viewsets.GenericViewSet,  #提供两个方法
                  mixins.CreateModelMixin,  #创建
                  mixins.ListModelMixin,   #查看所有
                  mixins.DestroyModelMixin, #删除
                  mixins.RetrieveModelMixin, #查看详情
                  mixins.UpdateModelMixin,  #修改
):
    #资源对应所有数据,必须定义该参数,会被源码中get_queryset()方法调用,默认返回它
    queryset =Article.objects.all()
    #序列化,必须定义该参数, 会被源码中get_serializer()方法调用
    serializer_class =ArticleSerializer
    #过滤
    filter_class = ArticleFilter  #这里指定过滤调用的类

4.定义过滤的类

2.0以上版本
importdjango_filters
​
from app.models importArticle
​
classArticleFilter(django_filters.rest_framework.FilterSet):
    #模糊查询title字段
    title = django_filters.CharFilter(lookup_expr='contains')
    desc = django_filters.CharFilter(lookup_expr='contains')
    #id_min和id_max为接口中定义的过滤参数,其对应到数据库中查询时,对应id字段
    id_min = django_filters.CharFilter('id',lookup_expr='gte')
    id_max = django_filters.CharFilter('id',lookup_expr='lt')
    #老版本:method改写action
    is_show = django_filters.CharFilter(method='filter_is_show')
    classMeta:
        model =Article
        #老版本中 fields中定义的参数,才是接口中能过滤的参数
        fields = ['title','desc','id', 'is_show']  #高版本可不写全
deffilter_is_show(self,queryset, name, value):
        if value == 'on':
            return queryset.filter(is_show=1)
        else:
            return queryset.filter(is_show=0)
2.0以下版本

继承的父类修改为: filters.FilterSet

importdjango_filters
from rest_framework importfilters
​
classArticleFilter(filters.FilterSet):
    ...

免责声明:文章转载自《django前后分离-restful》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Redis服务启动失败,提示:redis-server:command not foundredis-ha下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring MVC与JAXRS比较与分析

http://www.infoq.com/cn/articles/springmvc_jsx-rs 过去几年,REST逐渐成为影响Web框架、Web协议与Web应用设计的重要概念。如果你还不了解REST,那这个简短的介绍将有助你快速掌握REST,此外还可以点击这里了解关于REST的更多信息。 现在有越来越多的公司希望能以简单而又贴合Web架构本身的方式公开...

java序列化/反序列化之xml、protobuf、protostuff 的比较与使用例子

目录 1、背景 2、测试   2.1、环境   2.2、工具   2.3、说明   2.4、结果   2.5、结论 3、xml简单教程   3.1、准备   3.2、代码  4、protobuf简单教程   4.1、快速入门     1、下载.exe编译器     2、编写.proto文件     3、利用编译器编译.proto文件生成javabean  ...

C#(4):XML序列化

一、使用 System.Xml.Serialization类 1、定义元数据 引入System.Xml.Serialization命名空间。 XML序列化常用属性: XmlRoot XmlType XmlText XmlEnum [Serializable] [XmlRoot] public class Product { public int...

json常用的注解

json注解: 1、@jsonIgnoreProperties: 此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。 写法将此标签加在model 类的类名上 ,可以多个属性也可以单个属性 //生成json时将name和age属性过滤 @JsonIgnoreProperties({"name"},{...

Java安全之RMI反序列化

Java安全之RMI反序列化 0x00 前言 在分析Fastjson漏洞前,需要了解RMI机制和JNDI注入等知识点,所以本篇文来分析一下RMI机制。 在Java里面简单来说使用Java调用远程Java程序使用的就是RMI,调用C的程序调用的是JNI,调用python程序使用到的是Jython。RMI、JNI、Jython,其实在安全中都能发挥比较大的作用...

Fastjson远程代码执行漏洞复现

fastjson漏洞简介 Fastjson是一个Java库,可用于将Java对象转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象,fastjson爆出多个反序列化远程命令执行漏洞,攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。 fastjson漏洞原理 先来分析fastjson 1.2.47的POC { "a":...