路由层之路由分发

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源码剖析 模板层的更多相关文章

  1. caffe库源码剖析——net层

    net层的功能实现主要涉及到net.hpp和net.cpp文件,让我们要捋顺它是干了什么,是如何实现的. 1. net层使用到的参数 第一步要做的事,就是查看caffe.proto文件,弄清楚net都 ...

  2. Django Rest Framework源码剖析(八)-----视图与路由

    一.简介 django rest framework 给我们带来了很多组件,除了认证.权限.序列化...其中一个重要组件就是视图,一般视图是和路由配合使用,这种方式给我们提供了更灵活的使用方法,对于使 ...

  3. Web API 源码剖析之默认消息处理程序链之路由分发器(HttpRoutingDispatcher)

    Web API 源码剖析之默认消息处理程序链-->路由分发器(HttpRoutingDispatcher) 我们在上一节讲述了默认的DefaultServer(是一个类型为HttpServer的 ...

  4. Web API 源码剖析之默认消息处理程序链--》路由分发器(HttpRoutingDispatcher)

    我们在上一节讲述了默认的DefaultServer(是一个类型为HttpServer的只读属性,详情请参考 Web API 源码剖析之全局配置).本节将讲述DefaultHandler(是一个Http ...

  5. Django REST framework 源码剖析

    前言 Django REST framework is a powerful and flexible toolkit for building Web APIs. 本文由浅入深的引入Django R ...

  6. Django Rest Framework源码剖析(七)-----分页

    一.简介 分页对于大多数网站来说是必不可少的,那你使用restful架构时候,你可以从后台获取数据,在前端利用利用框架或自定义分页,这是一种解决方案.当然django rest framework提供 ...

  7. Django Rest Framework源码剖析(六)-----序列化(serializers)

    一.简介 django rest framework 中的序列化组件,可以说是其核心组件,也是我们平时使用最多的组件,它不仅仅有序列化功能,更提供了数据验证的功能(与django中的form类似). ...

  8. Android源码剖析之Framework层升级版(窗口、系统启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...

  9. STL源码剖析 — 空间配置器(allocator)

    前言 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象都存放在容器之中. 你完全可以实现一个直接向硬件存取空间的allocator. 下面介绍的是SGI STL提供的配 ...

  10. 前端Vue 源码分析-逻辑层

    Vue 源码分析-逻辑层 预期的效果: 监听input的输入,input在输入的时候,会触发 watch与computed函数,并且会更新原始的input的数值.所以直接跟input相关的处理就有3处 ...

随机推荐

  1. Linux make编译

    安装问题 linux编译流程 linux开发部分 一般来说著名的linux系统基本上分两大类: RedHat系列:Redhat.Centos.Fedora等 Debian系列:Debian.Ubunt ...

  2. 洛谷P7167 [eJOI 2020 Day1] Fountain (单调栈+ST)

    开两个数组:to[i][j]表示从i这个位置向下的第2j个圆盘是哪个,f[i][j]表示流满从i这个位置向下的 2j 个圆盘需要多少体积的水. 详情见代码: 1 #include<bits/st ...

  3. JSP页面实现验证码校验

    目录 验证码校验分析 生成验证码 测试验证码 校验验证码 测试验证码校验 添加验证码刷新 在网页页面的使用中为防止"非人类"的大量操作和防止一些的信息冗余,增加验证码校验是许多网站 ...

  4. JavaScript基础&实战(1)js的基本语法、标识符、数据类型

    文章目录 1.JavaScript简介 2.输出语句 2.1 代码块 2.2 测试结果 3.JS编写位置 3.1代码 3.2 测试结果 4.基本语法 4.1 代码 5.标识符 5.1 代码 6.数据类 ...

  5. 如何清除取消KMS激活

    1.首先要卸载掉用KMS激活的程序. 2.卸载完成之后,以管理员身份打开命令提示符. 3.依次输入以下命令 slmgr /upk slmgr /ckms slmgr /rearm 输入完成后会显示需要 ...

  6. iOS开发应用上传AppStore的步骤

    原文:http://blog.csdn.net/ayangcool/article/details/46647693   前言:作为一名IOS开发者,把开发出来的App上传到App Store是必须的 ...

  7. PCA降维的原理及实现

    PCA可以将数据从原来的向量空间映射到新的空间中.由于每次选择的都是方差最大的方向,所以往往经过前几个维度的划分后,之后的数据排列都非常紧密了, 我们可以舍弃这些维度从而实现降维 原理 内积 两个向量 ...

  8. ML-朴素贝叶斯算法

    贝叶斯定理 w是由待测数据的所有属性组成的向量.p(c|x)表示,在数据为x时,属于c类的概率. \[p(c|w)=\frac{p(w|c)p(c)}{p(w)} \] 如果数据的目标变量最后有两个结 ...

  9. 苹果 App Store 开始支持隐藏上架应用:只能通过链接下载

      据MacRumors报道,苹果公司最近宣布,正如其开发者网站上所概述的那样,App Store现在支持只能通过直接链接才能发现的隐藏应用.   图片来自 Apple 拥有不适合公开发布的应用的开发 ...

  10. 第2-3-2章 环境搭建-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

    目录 5. 文件服务开发 5.1 环境搭建 5.1.1 数据库环境搭建 5.1.2 Nacos环境搭建 5.1.3 Nginx环境搭建 5.1.4 maven工程环境搭建 5. 文件服务开发 全套代码 ...