Django路由层之路由分发 名称空间 虚拟环境 视图层之三板斧 JsonRsponse对象 request对象获取文件 FBV与CBV CBV源码剖析 模板层
路由层之路由分发
Django支持每个应用都可以自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起

多个应用都有很多路由与视图函数的对应关系 这时候可以拆分到各自的路由层


由总路由去管理子路由

使用路由分发之前 总路由直接干路由与视图函数的匹配
path('index/', views.index)
使用之后分发之后,总路由只按照应用名分配匹配方向
path('app01/', include('app01.urls'))
路由层之名称空间
路由分发之后 针对相同的别名能否自动反向解析出不同的应用前缀?
在每个应用层下的路由中取一样的别名


默认情况下是无法识别应用前缀的
想要正常识别区分有两种方式:
方式1:名称空间
在总路由
path('app01/', include(('app01.urls', 'app01'), namespace='app01')),
path('app02/', include(('app02.urls', 'app02'), namespace='app02')),

反向解析
reverse('app01:index_view')
reverse('app02:index_view')



方式2:别名不冲突即可
多个应用别名不冲突可以用应用名作为别名的前缀

path('index/', views.index, name='app01_index_view')
path('index/', views.index, name='app02_index_view')


虚拟环境
是搭配requirements.text(记录所需的模块以及版本)一起使用这样就能自动下载所需的模块及版本
pycharm创建虚拟环境
需求:
项目1需要使用:django1.11 python38
项目2需要使用:django2.22 pymysql requests python38
项目3需要使用:django3.22 request_html flask urllib3 python38
等等...
实际开发项目中我们只会给项目配备所需的环境,不需要的一概不配,这样就可以节省资源
虚拟环境:能够针相同版本的解释器创建多个分身 每个分身可以有自己独立的环境

venv虚拟环境代名词
创建出来的就是一个全新的解释器

下载Django1.1版本如出现报错 要学会看报错信息

将如上代码复制 并且也会同时下载所需相关联的模块

命令行形式创建虚拟环境
在命令行中虚拟环境是不支持多版本共存的
所以当你在终端以命令行形式创建虚拟环境python -m venv python38venv(创建虚拟环境的名字) 会取决于你环境变量解释器的查找顺序

进入虚拟环境查看目录结构dir

激活虚拟环境
方式1. 直接激活虚拟环境:source activate 虚拟环境名字
方式2. 进入到Scripts目录下调用activate激活:python38venv/scripts/activate
关闭虚拟环境:
进入到Scripts目录下python38venv/scripts/deactivate
视图层之三板斧
用来处理视图函数都必须得返回HttpRsponse对象 完全正确
class HttpResponse:
pass
return HttpResponse()
def render():
return HttpResponse()
return render()
def redirect():
redirect_class = 类(祖先有个类是HttpResponse)
return redirect_class()
return redirect()
HttpRsponse
在视图层中定义函数什么都不返回 pass HttpRsponse其实就是个类
报错显示没有返回一个HttpRsponse对象

render
返回的也是HttpRsponse对象

redirect
本质的本质也是返回的HttpRsponse对象

视图层之JsonResponse对象
给浏览器返回一个json格式字符串 使用json模块序列化可以实现


但在Django里有一个更方便的JsonResponse
前后端交互一般使用Json格式 而字典使用频率是最高的(表现数据的形式比较精准)JsonResponse默认是对字典做序列化

查看源码底层还是Json模块 Jsonresponse底层帮你封装了json模块。这里双下init里的data就是我们传进去的数据(必须是json模块支持转换的数据之一)
解决json中文乱码问题:

JsonRsponse解决编码问题:

可以通过给Jsonresponse传参数,将{ensure_ascii = utf8}这个字典传入内部封装的json.dumps。然后通过双星号解包,作为json.dumps的关键字实参传进去:

把字典换成一个列表去序列化

如图会显示报错 为了允许一个非字典的对象被序列化要把参数safe设置成False 由源码知safe默认是True 把safe改成False

json.JSONEncoder 查看那些数据类型能够被序列化
这样列表就能够被序列化

JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False
PS:以后写代码很多时候可能需要参考源码及所学知识扩展功能
视图层之request对象获取文件
form表单携带文件按类型的数据需要做到以下几点:
1.method是post
2.enctype是multipart/form-data(记form-data人家就知道什么意思)

针对选择类标签用户是不输的值value得设定好
Django后端需要通过request.FILES获取文件类型的数据

上图中file名字是由前端name属性指定的
request.FILES.get获取单个文件(getlist多个文件)拿到的是一个对象
将拿到的文件数据保存

如果我们要指定存储文件我们可以通过os模块做拼接 根目录就不用再获取了直接从settings里面的BASE_DIR拿到项目根目录 再路径拼接 创建文件mkdir
视图层之FBV与CBV
FBV
基于函数的视图
def index(request):return HttpResponse对象
CBV
基于类的视图(使用更加的灵活)
from django import views
class MyLoginView(views.View):
def get(self, request):
return HttpResponse('from CBV get function')
def post(self, request):
return HttpResponse('from CBV post function')
path('login/', views.MyLoginView.as_view())
会自动根据请求方法的不同自动匹配对应的方法并执行
需要导一个模块views

只要在类里面写跟请求方法相同的函数名 当在朝类发送请求的时候 如果你是get/post就会自动触发对应方法的执行 如果是其他的请求只要定义了对应的方法就会自动触发执行
CBV 路由也要做相应变化 类名点as_view()

CBV源码剖析(非常重要)
1.找准切入点 从CBV的路由匹配切入
path('login/', views.MyLoginView.as_view())
1.类名点名字(类或对象点名字涉及名字的查找顺序问题 先从本身查找) MyLoginView.as_view()
2.类名点名字并加括号调用(静态方法、绑定给类的方法)
myloginview是我们定义的视图类,其中有get和post两个方法。
所以我们先从myloginview类中找as_view这个名字,而我们自己创建的类是没有as_view() 那么往父类里面找 没有那么肯定会报错的,所以往父类找(views.View)。
因为是在类中调用as_view(),所以初步判断as_view()应该是个 类方法 或者 是个静态函数

如图可以看出是一个绑定给类的静态方法

发现view是个闭包函数,as_view执行之后将view作为返回值传出去。返回出去的view函数执行时可以用到外层as_view函数名称空间的名字(闭包)
2.函数名加括号执行优先级最高 项目一启动就会自动执行as_view方法
类名加括号调用一个函数拿到一个返回值view
path('login/', views.view) # CBV路由本质还是FBV

3.浏览器地址栏访问login路由需要执行view函数
1.产生我们自己编写类的对象
2.对象调用dispatch方法(注意查找顺序)
核心(清楚self是谁) 产生我们自己编写类的对象
浏览器访问路由,会执行内层函数view(自动加括号调用)。也就是通过view类产生一个对象。
查看view函数源码:

这里的cls是我们自己创的视图类。view的外层函数是as_wiew。as_wiew是个类方法。我们通过类调用会将类本身作为第一参数传进去也就是这里的cls 查找顺序是先对象本身 再找产生对象的类 然后再找父类
4.研究父类中的dispatch方法
获取当前请求方法并转小写 之后利用反射获取类中对应的方法并执行

使用反射getatter 通过不同的请求 获取视图类中的方法赋值给handler
此时handler就是我们视图类中的get、post函数
口述CBV
class View:
@classmethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs)
def dispatch(self, request, *args, **kwargs):
handler = getattr(self, request.method.lower())
return handler(request, *args, **kwargs)
模板层
"""
{{}}:主要与数据值相关
{%%}:主要与逻辑相关
django的模板语法是自己写的 跟jinja2不一样
1.针对需要加括号调用的名字 django模板语法会自动加括号调用你只需要写名字就行
2.模板语法的注释前端浏览器是无法查看的 {##}
3.
"""
1.模板语法传值
return render(request, 'demo02.html', {'n1': name, 'a1': age}) # 传值方式1:精准传值 不浪费资源 针对多资源的传递书写麻烦

return render(request,'demo02.html', locals()) # 传值方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的情况下比较浪费资源

2.模板语法传值特性
1.基本数据类型正常展示
2.文件对象也可以展示并调用方法
3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)
4.类名也会自动加括号调用
5.对象则不会
ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用 Django模板语法不支持传参数
1.基本数据类型正常展示、2.文件对象也可以展示并调用方法



3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)
4.类名也会自动加括号调用 5.对象则不会 对象可以点它的方法

类自动加括号

3.模板语法之过滤器(内置函数)
过滤器能接收的最大长度 右|右各一个 共两个
add 做字符拼接及求和
add源码

length 获取字符长度

slice 切片

更多:https://www.cnblogs.com/Dominic-Ji/articles/10982302.html
Django路由层之路由分发 名称空间 虚拟环境 视图层之三板斧 JsonRsponse对象 request对象获取文件 FBV与CBV CBV源码剖析 模板层的更多相关文章
- caffe库源码剖析——net层
net层的功能实现主要涉及到net.hpp和net.cpp文件,让我们要捋顺它是干了什么,是如何实现的. 1. net层使用到的参数 第一步要做的事,就是查看caffe.proto文件,弄清楚net都 ...
- Django Rest Framework源码剖析(八)-----视图与路由
一.简介 django rest framework 给我们带来了很多组件,除了认证.权限.序列化...其中一个重要组件就是视图,一般视图是和路由配合使用,这种方式给我们提供了更灵活的使用方法,对于使 ...
- Web API 源码剖析之默认消息处理程序链之路由分发器(HttpRoutingDispatcher)
Web API 源码剖析之默认消息处理程序链-->路由分发器(HttpRoutingDispatcher) 我们在上一节讲述了默认的DefaultServer(是一个类型为HttpServer的 ...
- Web API 源码剖析之默认消息处理程序链--》路由分发器(HttpRoutingDispatcher)
我们在上一节讲述了默认的DefaultServer(是一个类型为HttpServer的只读属性,详情请参考 Web API 源码剖析之全局配置).本节将讲述DefaultHandler(是一个Http ...
- Django REST framework 源码剖析
前言 Django REST framework is a powerful and flexible toolkit for building Web APIs. 本文由浅入深的引入Django R ...
- Django Rest Framework源码剖析(七)-----分页
一.简介 分页对于大多数网站来说是必不可少的,那你使用restful架构时候,你可以从后台获取数据,在前端利用利用框架或自定义分页,这是一种解决方案.当然django rest framework提供 ...
- Django Rest Framework源码剖析(六)-----序列化(serializers)
一.简介 django rest framework 中的序列化组件,可以说是其核心组件,也是我们平时使用最多的组件,它不仅仅有序列化功能,更提供了数据验证的功能(与django中的form类似). ...
- Android源码剖析之Framework层升级版(窗口、系统启动)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...
- STL源码剖析 — 空间配置器(allocator)
前言 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象都存放在容器之中. 你完全可以实现一个直接向硬件存取空间的allocator. 下面介绍的是SGI STL提供的配 ...
- 前端Vue 源码分析-逻辑层
Vue 源码分析-逻辑层 预期的效果: 监听input的输入,input在输入的时候,会触发 watch与computed函数,并且会更新原始的input的数值.所以直接跟input相关的处理就有3处 ...
随机推荐
- iOS Social和Accounts简单使用
ACAccountStore *account = [[ACAccountStore alloc] init]; ACAccountType *type = [account accountTypeW ...
- 基于electron+vue+element构建项目模板之【打包篇】
1.概述 开发平台OS:windows 开发平台IDE:vs code 本项目使用了一款Vue-CLI插件(vue-cli-plugin-electron-builder) 来构建 electron ...
- 《Hyperspectral Image Classification With Deep Feature Fusion Network》论文笔记
论文题目<Hyperspectral Image Classification With Deep Feature Fusion Network> 论文作者:Weiwei Song, Sh ...
- 高可用(vrrp)以及mysql主主备份部署
高可用说起来感觉很高大上,我刚接触的时候也是一头雾水,但是需求的时候很容易理解的,当一台服务器挂了另一台能够马上顶上去继续提供服务,这就叫做高可用,需求其实不难理解,只是需要自身根据项目的实际需求还有 ...
- c#-03关于类和继承的基本知识
一.类继承 通过类继承可以定义一个新类,新类纳入一个已经声明的类进行扩展 已经存在的类叫做基类,而通过继承出的类叫做派生类,派生类的组成为: 本身声明中的成员 基类的成员 派生类无法删除基类成员,但可 ...
- 洛谷P1036 [NOIP2002 普及组] 选数 (搜索)
n个数中选取k个数,判断这k个数的和是否为质数. 在dfs函数中的状态有:选了几个数,选的数的和,上一个选的数的位置: 试除法判断素数即可: 1 #include<bits/stdc++.h&g ...
- 带你读AI论文丨ACGAN-动漫头像生成
摘要:ACGAN-动漫头像生成是一个十分优秀的开源项目. 本文分享自华为云社区<[云驻共创]AI论文精读会:ACGAN-动漫头像生成>,作者:SpiderMan. 1.论文及算法介绍 1. ...
- dubbo的一系列配置与搭建
dubbo新的版本采用前后端分离技术,在github上下载的时候,不仅仅只是一个dubbo-admin 而是将admin包分离为dubbo-admin-ui前端包和dubbo-admin-server ...
- 第二阶段:高级核心基础知识·第1章Linux三剑客·1
1.用vmware添加一块10G的硬盘,且永久挂载到/data01中,写出详细的步骤 2.用自己语言描述raid0和raid1的区别 RAID 0: 将两个或以上相同信号,容量的硬盘组合,磁盘阵列的总 ...
- .net core 读取appsettings.json 文件中文乱码的问题
解决办法:设置高级保存选项 第一步:在工具栏找到自定义选项 第二步:添加高级保存选项Advanced save options 第三步:在Appsettings.json页面操作