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

天津网站建设制作方案云服务器 部署网站

天津网站建设制作方案,云服务器 部署网站,摄影网站定位,东莞虚拟主机目录 一、序列化和反序列化 【1】序列化 【2】反序列化 【3】小结 二、DRF的安装和快速使用 (1) 安装DRF#xff1a; (2) 配置DRF#xff1a; (3) 创建序列化器(Serializer)#xff1a; (4) 创建视图(View)#xff1a; (5) 配置URL路由#xff1a; 【补充】下载…目录 一、序列化和反序列化 【1】序列化 【2】反序列化 【3】小结 二、DRF的安装和快速使用 (1) 安装DRF (2) 配置DRF (3) 创建序列化器(Serializer) (4) 创建视图(View) (5) 配置URL路由 【补充】下载兼容性问题 【补充】JSON可以序列化和反序列化的类型 【补充】回顾CBV执行流程 三、APIView执行流程分析 【总结】 【补充】回顾装饰器 【补充】APIView再回顾 四、Request对象分析 【总结】 一、序列化和反序列化 api接口开发最核心最常见的一个过程就是序列化 【1】序列化 把我们能识别的数据结构(python的字典列表对象)转换成其他语言(程序)能识别的数据结构。例如 我们在django中获取到的数据默认是模型对象(queryset)但是模型对象数据无法直接提供给前端或别的平台使用所以我们需要把数据进行序列化变成字符串或者json数据提供给别人。 【2】反序列化 把别人提供的数据转换/还原成我们需要的格式。例如 前端js提供过来的json数据对于python而言就是字符串我们需要进行反序列化换成模型类对象这样我们才能把数据保存到数据库中 【3】小结 序列化 drf称为 read(读取数据)序列化queryset --- json返给前端反序列化 drf称为 write(写入数据)反序列化字符串 --- json接收前端的数据 二、DRF的安装和快速使用 DRF(Django REST Framework)是一个强大且灵活的开发工具包用于构建基于Django的Web API。 它提供了许多内置的功能和工具使得编写高质量的API变得更加容易和高效。 (1) 安装DRF 使用pip包管理器在终端中运行以下命令来安装DRF pip install djangorestframework (2) 配置DRF 在你的Django项目的settings.py文件中确保将DRF添加到INSTALLED_APPS列表中 INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,app01.apps.App01Config,rest_framework, # 注册drf ] (3) 创建序列化器(Serializer) 序列化器是DRF中一个重要的概念它将Python对象转换为JSON等可被传输的格式并可以反序列化接收到的数据。 在你的应用程序中创建一个名为serializers.py的文件并定义你的序列化器类。 一个示例 from rest_framework import serializersclass MyModelSerializer(serializers.ModelSerializer):class Meta:model MyModelfields __all__ 在这个示例中我们使用ModelSerializer来自动创建序列化器类。 (4) 创建视图(View) 在你的应用程序中创建一个名为views.py的文件并定义视图类。 一个示例 from rest_framework import generics from .serializers import MyModelSerializer from .models import MyModelclass MyModelListView(generics.ListCreateAPIView):queryset MyModel.objects.all()serializer_class MyModelSerializer 在这个示例中我们使用ListCreateAPIView来创建一个支持列表和创建操作的通用视图。 (5) 配置URL路由 在你的应用程序的urls.py文件中定义DRF的URL路由。 一个示例 from django.urls import path from .views import MyModelListViewurlpatterns [path(mymodels/, MyModelListView.as_view(), namemymodel-list), ] 通过上述配置当访问/mymodels/时将会调用MyModelListView视图。 以上是使用DRF进行快速开发的简要步骤。当然DRF还提供了许多其他功能如认证、权限控制、过滤器、分页等可以根据自己的需求进一步学习和定制。也可以参考官方文档以获得更详细的信息 Home - Django REST framework 【补充】下载兼容性问题 安装命令 pip install djangorestframework如果你是django2 直接这样装装最新drf他们不匹配--- pip会自动把django卸载安装最新django安装最新drfdjango3 这样没有任何问题 强制更新 pip3 install djangorestframework --upgrade 【补充】JSON可以序列化和反序列化的类型 【补充】回顾CBV执行流程 1 请求来了--- 执行 --- views.BookView.as_view()(request) --- 执行View类中as_view类方法中的闭包函数view classonlymethod def as_view(cls, **initkwargs):def view(request, *args, **kwargs):self cls(**initkwargs) # BookView类实例化得到对象self.dispatch(request, *args, **kwargs) # BookView类的dispatch 2 BookView类的dispatch没有 -- View的dispatch 通过反射去self【BookView的对象】中找到 跟请求方式同名的方法  get -- get方法 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_allowedreturn handler(request, *args, **kwargs) # 真正的执行视图类中跟请求方式同名的方法 3 以什么请求方式访问 --- 就会执行视图类中 跟请求方式同名的方法 比如http://127.0.0.1:8000/books/  get请求 执行BookView类中get方法 三、APIView执行流程分析 1 在路由中path(books/, views.BookView.as_view()),请求来了 2 先看 as_view()----APIView的 as_view--- as_view执行结果跟之前一样去除了csrf认证 classmethod def as_view(cls, **initkwargs):view super().as_view(**initkwargs) # 调用父类的 as_viewview还是View的as_view# 以后所有请求都不会做csrf认证了return csrf_exempt(view) 3 请求来了执行 views.BookView.as_view()(request)---view(request)---csrf_exempt(view)(request)--- 内部核心 --- return self.dispatch(request) 4 self 是 APIView类的对象 --- APIView没有dispatch --- APIView的dispatch核心代码如下 def dispatch(self, request, *args, **kwargs):# 后续的request都是 initialize_request 返回结果-- 新的request-- drf的Requet类的对象request self.initialize_request(request, *args, **kwargs)# 新的request放到了 self.request中--- self是BookView类的对象# 后续视图类的方法中 可以直接 self.request取出 当次请求的request对象self.request requesttry:# 执行了三大认证self.perform_authentication(request)self.check_permissions(request)self.check_throttles(request)self.initial(request, *args, **kwargs)###### 通过反射去视图类中BookView中执行跟请求方式同名的方法 ###### 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# request是新的Request类的对象了 get方法的第一个参数request也是新的response handler(request, *args, **kwargs)################# 执行视图类的方法结束 #################except Exception as exc:# 如果在执行三大认证或视图类方法中出了错都会被异常捕获统一处理response self.handle_exception(exc)self.response self.finalize_response(request, response, *args, **kwargs)return self.response 5 看self.initialize_request 是APIView的 def initialize_request(self, request, *args, **kwargs):# 类实例化得到对象传入一些参数# Request类-- drf提供的类from rest_framework.request import Requestreturn Request(request,parsersself.get_parsers(),authenticatorsself.get_authenticators(),negotiatorself.get_content_negotiator(),parser_contextparser_context) 只要继承APIView以后方法中得request都变了成了 rest_framework.request.Request 的对象了但是用起来跟之前的一模一样。 原来的是django.core.handlers.wsgi.WSGIRequest 类的对象。 【总结】 以后视图类方法中得request对象变成了新的request它rest_framework.request.Request 的对象了但是用起来跟之前一样把新的request对象同时放到了 视图类的对象中  self.request request  后续从视图类中可以直接通过 self.request取出来在执行视图类的方法之前执行了三大认证如果三大认证或视图类的方法执行出错会有全局异常处理以后所有的接口都去除了csrf认证 【补充】回顾装饰器 装饰器作用在不改变原函数源代码和调用方式的基础上为他增加新功能 import timedef add(a, b):time.sleep(1)return a b# 统计add的运行时间 # start_time time.time() # add(3, 4) # end_time time.time() # print(运行时间是, end_time - start_time)# 写一个通用的以后只要统计任意函数运行时间都使用通用的---改变了调用方式不行 # def outer(func): # start_time time.time() # func(3, 4) # end_time time.time() # print(运行时间是, end_time - start_time) # # outer(add)def outer(func):def inner(*args, **kwargs):start_time time.time()res func(*args, **kwargs)end_time time.time()print(运行时间是, end_time - start_time)return resreturn inner# innerouter(add) # 调用inner就是执行inner内部包了 add函数inner叫闭包函数 # inner() # 改变了调用方式# 继续优化 add outer(add)res add(3, 4) # add现在本质调用 inner参数传给 inner,inner要能接收ab 并且有返回结果 print(res)# 以后想装饰哪个函数 得按如下操作麻烦 # def ee(): # print(ee) # # eeouter(ee) # ee()# python提供了一个语法糖 以后只要按如下方式编写代码就能实现上述功能 outer # 等同于 eeouter(ee) 该语法糖会把被装饰器的函数ee,当做参数传入outer并且把outer的执行结果返回赋值给ee def ee():print(ee)# 以后ee其实已经不是ee了是inner了执行ee本质在执行inner#####上述是原理#### # 总结以后写他 def outer(func):def inner(*args, **kwargs):# 被装饰器函数执行之前干事res func(*args, **kwargs)# 被装饰函数执行之后干事情return resreturn inner# 装饰某个函数 outer def add(a,b):time.sleep(1)return ab 【补充】APIView再回顾 在执行视图类的方法之前干了一些事 去除csrf包装新的requet在视图类中加入了 self.request执行三大认证 在执行视图类的方法之后干了一些事 处理全局异常 本质就是做了装饰器的功能 四、Request对象分析 1 分析APIVIew时分析出以后request都是新的request了是drf提供的Request的对象 from rest_framework.request import Request 2 源码解析之 __init__--- 老的request在新的内部--- request._request 先看 __init__---类实例化得到对象时对对象进行初始化往对象中放数据 def __init__(self, request, parsersNone, authenticatorsNone,negotiatorNone, parser_contextNone):# 传入的request是老的django原生的request# 放到了self._request,self 是新的request类的对象self._request requestself._data Emptyself._files Empty# 什么时候调用的 __init__新的 老的-request self.initialize_request(request, *args, **kwargs)老的return Request(request) 以后用新的跟用老的一样,为什么 新的   requet.method新的   request.path 【补充】魔法方法 在类内部以 __开头  __结尾的方法 在某种情况下会自动调用他们称之为魔法方法 学过__init__:  类名() 自动触发           __str__:   print(对象)  自动触发 还有哪些 很多--- 所有类都继承object类--- 它都在object类中 今天要学的 __getattr__  -对象.属性 属性不存在会触发      3 回头看 新的 requet.method用的时候如果method不存在就会触发 Request类的 __getattr__ 源码解析之 __getattr__ # 逻辑肯定是从老的request中取出你想要的东西 def __getattr__(self, attr):try:# 通过反射去老的中取能取到就返回取不到执行except代码再取不到就报错return getattr(self._request, attr)except AttributeError:return self.__getattribute__(attr) 4 以后新的request中多了个属性 data --- 前端postput提交的请求体中得数据都会放在request.data中无论何种编码格式它都是字典 【总结】 1 老的request还在新的request内部  request._request 2 新的用起来跟老的一样原因是--- 重写了魔法方法  __getattr__      对象.属性 --- 属性不存在会触发 __getattr__的执行--- 内部通过反射找到老的request中对应的属性     request.POST     request.GET     request.method     ....      3 request.data 多了这个属性以后无论何种编码无论何种请求方式 -- 都能取出请求体携带的数据 postputget --- 只要放在body体中 --- 都能取出来 -- 当字典用如果是urlencodedform-data编码OrderedDict -- 原来的request.POST 对象如果是json编码dict 4 如果form-data编码--- 取数据request.data  --- 取文件request.FILES中取 5 请求地址栏中参数-- 从request.GET中取 --- 以后还可以从request.query_params 中取 query_params查询参数请求地址中带查询参数---》query_params
http://www.yutouwan.com/news/51644/

相关文章:

  • 怎么才能建设免费网站学建筑的女生后悔吗
  • 小米路由做网站服务器搜索引擎营销的实现方法有哪些
  • 做优化的网站建筑工程管理系统平台
  • 黑彩网站怎么做seo软文是什么
  • 建设网站公司哪家性价比高广东装修公司排名前十强
  • 淮安网站建设找谁好宝塔系统搭建wordpress
  • 淘宝客网站怎么做的人少了上海高品质网站建设
  • 图书馆网站建设的作用铁路建设工程网
  • 免费建网站无广告网站建设文章官网
  • 深圳网站建站的公司桂林生活网官网首页
  • 怎么创办自己的网站php做简单网站教程视频
  • 坂田网站设计学网站ui设计
  • 网站页面设计费用用discuz做的门户网站
  • 如何在本地搭建网站网站验收技术指标
  • 企业网站报价方案模板下载有人做网站花了10几万
  • 越野车网站模板企业网站空间选择
  • 织梦大气蓝色门户资讯网站模板房产经纪人如何做网站吸客
  • 网站接口怎么做网站栏目排序
  • 做的好微信商城网站戴尔网站建设成功
  • 游戏源代码网站wordpress禁用自动保存
  • 未备案个人网站 如何挣钱门户网站简称
  • 做网站公奇闻司郑州汉狮什么网站做详情页好
  • c 购物网站开发流程图网站中文名
  • 钢材销售都在哪个网站做建设设计院网站
  • 谁可以教我做网站上海贸易公司有哪些
  • 网站开发文件结构组成怎么改网站域名
  • 网站建设项目设计的图片南京网站房地产
  • 饮水机企业网站模板wordpress 字体库
  • 资讯门户网站 dede家具定制
  • 做网站wzjseo手机直播网站开发