当前位置: 首页 > news >正文

深圳罗湖做网站app开发建设公司

深圳罗湖做网站,app开发建设公司,网站建设范文,网站列表页框架布局原则文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置#xff08;1#xff09;DRF需要以下依赖#xff08;2#xff09;创建django项目 4.序列化器的使用#xff08;1#xff09;创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan… 文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置1DRF需要以下依赖2创建django项目 4.序列化器的使用1创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Django REST framework是一个建立在Django基础之上的Web 应用开发框架可以快速的开发REST API接口应用简称DRF。 在REST framework中提供了序列化器Serialzier的定义可以帮助我们简化序列化与反序列化的过程把queryset类型数据自动转化为json等可以传到前端的数据类型 不仅如此还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。 REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。 REST framework提供了一个API 的Web可视化界面来方便查看测试接口。 提供了我们写接口便利的方法把响应的内容响应的格式响应状态码都封装好了 不用自己再做这些了但是能DRF能做的还是有限的对于复杂的接口还是需要自己来做这些事 restful不是必须的但是为了后续开发交接规范大家约定俗成的使用restful规范 2.DRF特点 提供了定义序列化器Serializer的方法可以快速根据 Django ORM 或者其它库自动序列化/反序列化提供了丰富的类视图、Mixin扩展类简化视图的编写丰富的定制层级函数视图、类视图、视图集合到自动生成 API满足各种需要多种身份认证和权限认证方式的支持[jwt]内置了限流系统直观的 API web 界面可扩展性插件丰富 django restframework简称drf本质上其实就是一个别人编写好的app里面集成了很多编写restful API的功能功能。 其目录中有很多我们以前写django程序见到过的因为它就是一个别人写好了的app我们拿来用。 因此 每次新建项目时要记得在settings中注册app。 同时在settings中也要加上如下字典以后drf相关的全局配置都会在该字典中添加。 3.环境安装与配置 1DRF需要以下依赖 Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6, 3.11)Django (1.10, 1.11, 2.0, 4.2.1) DRF是以Django扩展应用的方式提供的所以我们可以直接利用已有的Django环境而无需从新创建。若没有Django环境需要先创建环境安装Django 安装DRF这是linux安装 前提是已经安装了django建议安装在虚拟环境 #mkvirtualenv drfdemo -p python3 #pip install django pip install djangorestframework Windows就在本地环境中安装 2创建django项目 添加rest_framework应用pycharm创建的项目默认会把第一个创建的应用添加进去 在settings.py的INSTALLED_APPS中添加’rest_framework’。 需要手动将rest_framework 添加到INSTALLED_APPS 中这个一定要手动添加不然用不了drf功能 接下来就可以使用DRF提供的功能进行api接口开发了。在项目中如果使用rest_framework框架实现API接口主要有以下三个步骤 将请求的数据如JSON格式转换为模型类对象操作数据库将模型类对象转换为响应的数据如JSON格式 创建模型操作类 class Student(models.Model):# 模型字段name models.CharField(max_length100,verbose_name姓名,help_text提示文本不能为空)sex models.BooleanField(default1,verbose_name性别)age models.IntegerField(verbose_name年龄)class_null models.CharField(max_length5,verbose_name班级编号)description models.TextField(max_length1000,verbose_name个性签名)#通过django migrate默认创建的表名是 应用名_类名小写如果不想用默认的可以自己配置表的元信息#通过class Meta类来配置class Meta:#配置表名db_tabletb_student#这里是为了配置Django的后台管理系统admin里面的表名verbose_name 学生#这里是为了配置让表名不以复数形式显示默认是以复数形式显示verbose_name_plural verbose_name我们看urls.py有个admin路径 当我们运行项目时Django默认带个后台管理系统需要先执行数据库同步指令 运行项目登录后台管理系统 需要用户名密码初次登录需要我们创建超级管理员用户 控制台 python manager.py createsuperuser 按照提示输入邮箱可以不用输入 输入用户名密码登录 这里面有两张系统自带的表生产中一般不用admin由于admin功能太过简单不符合生产要求 如果想用一个不错的后台管理系统可以用xadmin admin和xadmin是用来对数据库中的表进行管理的项目中可能会写很多表。admin和xadmin就可以展示所有的表以及表中数据 比如我们希望通过admin来管理模型类中的表 创建完需要我们将models类里面的表注册到admin里面管理 在我们创建的应用下有个admin.py专门用于admin后台管理系统的 注册模型类 #首先导包 from app01 import models admin.site.register(models.Student) 重新运行项目登录管理系统平台可以看到我们app01应用下自己创建的表 class Meta:下面的verbose_name 就是配置在这里显示的表名 verbose_name_plural 是配置表名复数显示 比如我们注释后再看 表名 显示为我们创建的模型类 类名的复数形式 只配置verbose_name 表名默认以复数形式显示 配置好后我们进入表中查看 我们可以直接通过这个后台管理系统管理我们的表做增删改查 点击ADD学生可以直接添加学生 页面字段显示中文就是我们创建模型类时每个字段指定了verbose_name 才能显示的 admin后台管理系统显示字段名称直接是通过verbose_name配置的名称来显示的 还有提示信息help_text 这些主要是给后台管理系统用的 整个admin后台管理系统是基于 form 和model-form开发的。数据检验用的 布尔值在后台管理系统显示就是个单选框 添加表记录 点保存 默认展示的是模型类对象怎么展示出表的字段名称呢在admin.py中配置 现在看表中数据展示 想要修改字段点击前面的id进入编辑界面 admin就是用来管理数据库表的 也可以查找 也可以直接在展示页面编辑不能把id放进去 可以做批量修改 创建管理员以后访问admin站点先修改站点的语言配置,设置成显示中文 修改settings.py LANGUAGE_CODE ‘zh-hans’ 重启服务这样页面就是中文展示 这个admin功能不够全面后面生产中我们使用xadmin提供的功能更多 现在我们连接mysql数据库来进行drf操作 create database students; 在项目的__init__.py文件中配置pymysql使用mysql数据库并兼容高版本mysql 此时要把原先创建在sqlite3里面的数据迁移到mysql由于初始化数据库同步语句已经生成了数据库表没有变化不要再执行makemigrations 只需要执行migrate 可能的报错处理 数据库中查看表 创建序列化器 创建个子应用 student startapp student 记得将新创建的应用添加到INSTALLED_APPS里面 配置路由分发在新创建的应用下创建urls.py文件 项目下的urls.py 将各个应用的url导入 在student应用目录中新建serializers.py用于保存该应用的序列化器。 创建一个StudentModelSerializer类用于序列化与反序列化。 #创建序列化器类回头会在视图中被调用 #要继承rest_framework中的一个类ModelSerializer from rest_framework.serializers import ModelSerializer from app01 import models class StudentModelSerializer(ModelSerializer):#配置元信息class Meta:model models.Studentfields __all__model 指明该序列化器处理的数据字段从模型类Student参考生成 fields 指明该序列化器包含模型类中的哪些字段__all__指明包含所有字段可以使用fields来明确字段__all__表示包含所以字段具体那些字段-fields (title,price)由于之前admin管理后台创建的超级用户存在了sqlite3现在数据库换成了mysql需要重新创建一个存在了django内置的auth-user表中 登录上去添加些数据 视图类函数 from django.shortcuts import render# Create your views here.from app01 import modelsfrom django.http import JsonResponse #引入我们创建的序列化器类 from student.serializers import StudentModelSerializer def students(request):method request.methodif method GET:studentdata models.Student.objects.filter()#序列化多条数据需要加上manyTrue,返回序列化对象serializer_obj StudentModelSerializer(instancestudentdata,manyTrue)#返回列表类型数据print(serializer_obj.data,type(serializer_obj.data))#JsonResponse返回非字典类型数据需要加上safeFalse返回中文需要加上, json_dumps_params{ensure_ascii: False} 不然浏览器查看是Unicode码return JsonResponse(serializer_obj.data,safeFalse, json_dumps_params{ensure_ascii: False})查看数据类型每个字典由一个元祖包裹 浏览器访问达到效果前端拿到数据之后方便循环来展示 DRF可以用一个方法实现5个接口增删改查我们视图使用CBV模式 视图类 from app01 import modelsfrom django.http import JsonResponse #引入我们创建的序列化器类 from student.serializers import StudentModelSerializer#导入DRF的ModelViewSet类 from rest_framework.viewsets import ModelViewSet#定义的视图类要继承ModelViewSet类 class StudentView(ModelViewSet):#queryset 指明该视图集在查询数据时使用的查询集#serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器queryset models.Student.objects.all()serializer_class StudentModelSerializer路由也由drf来注册生成 from student import views#Django2之后的path不支持正则正则使用re_pathurlpatterns [# path(students/, views.students), ]#使用rest_frame创建路由首先导包 from rest_framework.routers import DefaultRouter url_obj DefaultRouter() # 可以处理视图的路由器自动通过视图来生成增删改查的url路径 url_obj.register(students,views.StudentView) #students是生成的url前缀名称随便写 向路由器中注册视图集 urlpatterns url_obj.urls # 将路由器中的所有路由信息追到到django的路由列表中浏览器访问查看这些路由都是drf的defaultrouter对象自动生成的 DefaultRouter生成的接口路径太死板在公司中我们也基本不用它都是自己手写的 我们查看下students返回的json页面视图都是drf提供的 视图页面是由ModelViewSet这个视图类提供的 正常的APIView或者View 页面都是返回的json字符串 如果我们不想看页面也可以只看json数据在url添加?formatjson 这些都是DRF提供的功能 不仅提供了查看数据也可以直接添加数据可以直接在页面添加数据 不仅可以以form表单形式提交还可以以原生json格式提交 输入数据点POST直接添加到数据库 也可以查询指定id的数据 在浏览器中输入网址127.0.0.1:8000/stu/students/3/可以访问获取单一学生信息的接口id为3的学生呈现如下页面 可以直接修改数据然后点击put提交 点击put后返回修改后的数据 点击delete可以删除本条记录 删除成功返回状态码204 序列化器类中可以使用fields来明确字段__all__表示包含所以字段具体那些字段-fields (‘title’,‘price’) 也可以序列化指定字段数据 访问接口查看 4.序列化器的使用 在ser里面创建个新的模型类 添加几条数据 1创建序列化器 #先引入基础序列化器类 from rest_framework import serializers from ser import models name models.CharField(max_length100,verbose_name姓名,help_text提示文本不能为空)sex models.BooleanField(default1,verbose_name性别)age models.IntegerField(verbose_name年龄)class_null models.CharField(max_length5,verbose_name班级编号)description models.TextField(max_length1000,verbose_name个性签名) #这个基础序列化类能指定哪个字段序列化什么格式,可以指定序列化哪些数据加工几条数据返回几条数据 # 序列化哪些字段就写与模型类中相同的名称 class StudentSerializer(serializers.Serializer):id serializers.IntegerField()name serializers.CharField()sex serializers.BooleanField()age serializers.IntegerField()class_null serializers.CharField()description serializers.CharField() #对于serializer中没有的数据类型使用CharField。不写长度默认有多长序列化多长这样的好处是不想要哪个字段的数据就不用序列化 视图类一样 from django.http import JsonResponse from django.shortcuts import render# Create your views here.from django.views import View from ser import models from ser.serializers import StudentSerializerclass StudentView(View):def get(self,request):studentdata models.Student.objects.filter()#序列化多条数据需要加上manyTrue,返回序列化对象serializer_obj StudentSerializer(instancestudentdata,manyTrue)#返回列表类型数据print(serializer_obj.data,type(serializer_obj.data))#JsonResponse返回非字典类型数据需要加上safeFalse中文显示中文return JsonResponse(serializer_obj.data,safeFalse, json_dumps_params{ensure_ascii: False})浏览器访问 上面我们序列化queryset类型数据我们也可以序列化模型类对象 #序列化模型类对象对于单条数据不用加manytruestudentdata models.Student.objects.get(id1)serializer_obj StudentSerializer(instancestudentdata) #返回字典返回的是字典 注意serializer不是只能为数据库模型类定义也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。 常用字段类型 选项参数 这个是在序列化类里面在序列化相关字段时可以添加一些参数 通用参数默认required 默认是True 5. 反序列化器使用 序列化器的使用分两个阶段 在客户端请求时使用序列化器可以完成对数据的反序列化。在服务器响应时使用序列化器可以完成对数据的序列化。 使用序列化器进行反序列化时需要对数据进行验证后才能获取验证成功的数据或保存成模型类对象。 在获取反序列化的数据前必须调用is_valid()方法进行验证验证成功返回True否则返回False。 验证失败可以通过序列化器对象的errors属性获取错误信息返回字典包含了字段和字段的错误。如果是非字段错误可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。 验证成功可以通过序列化器对象的validated_data属性获取数据。 在定义序列化器时指明每个字段的序列化类型和选项参数本身就是一种验证行为。 后台收到前端发过来的数据在保存之前要对数据进行校验符合要求再往里面存 不符合要求报错 #定义个新的序列化器2id是主键自增不需要前端传递所以不需要反序列化 # 数据校验基于用到了序列化时的参数具体限制多少要根据数据库创建时的要求来定 class StudentSerializer2(serializers.Serializer):name serializers.CharField(max_length8)sex serializers.BooleanField()age serializers.IntegerField()class_null serializers.CharField()description serializers.CharField() #对于serializer中没有的数据类型使用CharField。不写长度默认有多长序列化多长反序列化器校验基于用户提交的数据再在视图函数写个post方法 #用户提交数据逻辑def post(self,request):#保存数据之前要对用户提交的数据进行校验将用户提交的数据放到序列化器中serializer_obj StudentSerializer2(datarequest.POST)#对数据进行校验所有数据校验成功返回True但凡有一个校验失败返回Falseif serializer_obj.is_valid():print(校验成功后的数据,serializer_obj.validated_data)return JsonResponse(serializer_obj.validated_data,safeFalse, json_dumps_params{ensure_ascii: False})else:#打印校验失败信息print(serializer_obj.errors)#校验失败返回错误信息并修改状态码return JsonResponse({error:校验失败},status400)我们借助接口调试工具postman或国产的apipost来调试 我们使用国产的apipost可以设置请求类型携带的请求参数 可以原生row的json类型提交也可以form表单的www-form-urlencodedform-data apipost功能还是太少我们使用postman 向后台传输原生json类型 注意json 键和值如果是字符串类型必须用英文双引号 最后一对键值对后面不能有逗号 后台打印可知没接收到数据因为Django默认解析不了json类型数据 一般情况下需要我们通过request.body将数据取出来然后自己手动序列化解析 现在我们通过DRF来帮我们自动解析简化工作量 视图类继承drf的apiview from rest_framework.views import APIView 继承了APIView之后视图类定义的请求方法中的request 就被重新加工了一遍 APIView类还是继承的View对View进行了拓展 对View里面的request进行了扩展 扩展后的request再从前端拿数据不用request.POST了 使用request.data request.data就能获取到前端post请求提交过来的json数据 不管什么格式都能解析出来 request.data 返回解析后的请求体数据。类似Django中标准的request.POST和request.FILES属性但是能提供如下属性 包含了解析后的文件和非文件数据 包含了对POSTPUTPATCH请求方式解析后的数据 利用了REST framework的parsers解析器不仅支持表单类型数据(unlencoded/data)也支持JSON数据(application/json) 此时重启服务器postman发送post请求 后台已经获取到获取到的就是字典类型数据 当name字段长度超过限制则会报错 查看打印的错误信息code指明哪个参数校验报的错 发送符合要求的字段就不再报错 现在我们发送个正确的post请求 返回正常的json类型数据 请求正常就保存数据 allow_blank默认为False, 空字符串 如果想要实现不传数据需要结合required False validators校验函数 a).可以在序列化器字段上使用validators函数指定自定义的校验规则 b).validators值必须为序列类型(类表),在列表中可以添加多个校验规则 c).DRF框架自带的UniqueValidator校验器,必须指定queryset参数指定查询集对象,用于对该字段的唯一性进行校验,UniqueValidator里面还可以使用message指定自定义报错信息 在序列化器需要反序列化输入校验的字段中,指定validators[校验规则1,校验规则2...]参数,可以使用drf自带的校验规则UniqueValidator, 也可以使用自定义的的校验规则error_messages 可以自定义报错信息 自定义错误信息用字典包裹针对每个参数定义报错信息 发送post请求 这样报错信息就是我们自定义的实现了错误信息定制 不传name 上面序列化器一个是用于序列化用的一个是反序列化数据校验的 序列化和反序列化 能不能合并成一个序列化器来使用呢 可以的 针对个别字段有的只用于序列化输出有的只用于反序列化输入可以用下面两个参数控制 read_only 表明该字段仅用于序列化输出默认False 用户提交数据时不校验该字段 write_only 表明该字段仅用于反序列化输入默认False 序列化时不会把该字段提取出来服务端响应数据时不响应给客户端该字段。反序列化时客户端必须要传该字段进行校验 序列化器合成一个 #将序列化和反序列化合并在一个序列化类中实现 class StudentSerializer3(serializers.Serializer):id serializers.IntegerField(read_onlyTrue) #id在序列化时需要反序列化时不需要name serializers.CharField(max_length8)sex serializers.BooleanField()age serializers.IntegerField(max_value200)class_null serializers.CharField()description serializers.CharField() #对于serializer中没有的数据类型使用CharField。不写长度默认有多长序列化多长视图类中get请求和post请求都用该序列化器 get请求能收到数据 post请求能提交数据 post请求校验成功 read_only使用场景一般用在id上序列化时需要用户提交数据时不需要提交该字段 write_only使用场景一般用在用户短信验证码输入手机号用户收到验证码需要提交到后台验证但是不需要服务端响应给客户也不需要保存到数据库。 好了今天先到这明天继续Carry on !
http://www.w-s-a.com/news/598057/

相关文章:

  • 聊城大型门户网站建设多版本wordpress
  • 建网站的公司 快云wordpress的搜索
  • 贷款网站模版东莞网站建设哪家专业
  • 做做网站已更新878网站正在建设中
  • dz旅游网站模板网站上做百度广告赚钱么
  • 青岛外贸假发网站建设seo优化名词解释
  • 四川建设厅网站施工员证查询网站建设行业政策
  • 网站全站出售dw怎么设计网页
  • 合肥网站建设方案服务网站建设推荐郑国华
  • 襄阳网站建设需要多少钱台州网站设计公司网站
  • 东莞专业拍摄做网站照片如何在百度上发布自己的广告
  • 网站建设费 科目做网站建设最好学什么
  • php商城网站建设多少钱深圳市建设
  • 有什么做糕点的视频网站黄岛做网站
  • 做视频课程网站建设一个普通网站需要多少钱
  • 专做化妆品的网站合肥做网站建设公司
  • 唐山企业网站网站建设费计入那个科目
  • 企业网站制作运营彩虹云主机官网
  • 如何建设废品网站如何在阿里云云服务器上搭建网站
  • 如何建立网站后台程序wordpress 后台管理
  • 山东外贸网站建设怎么样wordpress首页左图右文
  • 志丹网站建设wordpress 形式修改
  • 南通seo网站推广费用网站建设就业前景
  • 自适应网站做mip改造浏览器广告投放
  • 网站meta网页描述网站的推广费用
  • 偃师市住房和城乡建设局网站网站个人主页怎么做
  • 做网站要实名认证吗wordpress去掉仪表盘
  • 在哪做网站好Python建网站的步骤
  • 卢松松的网站办公室设计布局
  • 住房城乡建设干部学院网站织梦网站0day漏洞