路由层之路由分发

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. typescript中对象属性可选属性与只读属性与索引签名

    可选属性 type类型别名 type 会给一个类型起个新名字. type 有时和 interface 很像,但是可以作用于原始值(基本类型),联合类型,元组以及其它任何你需要手写的类型. interf ...

  2. bilibili弹幕爬虫

    import random import requests import jieba import numpy as np from lxml import etree class SpiderBil ...

  3. HTML5中新增实用的标签

    1:progress  进度条 <h3>progress</h3> <progress value="75" max="100"& ...

  4. struts项目向前台返回图片。

    读取项目路径WebRoot下的图片 编写action package com.sadj.market.action; import java.io.BufferedInputStream; impor ...

  5. mysql安装教程-window操作系统

    1.下载安装包(官网下载) 直达链接:https://dev.mysql.com/downloads/mysql/ 下载后放到指定目录下解压即可(给电脑新手忠告:注意不要放在C盘,养成好习惯,放C盘多 ...

  6. mybatis-plugin插件执行原理

    mybatis-plugin插件执行原理 今天主要是在看mybatis的主流程源码,其中比较感兴趣的是mybatis的plugin功能,这里主要记录下mybatis-plugin的插件功能原理. pl ...

  7. winscp报错Server sent passive reply with unroutable address. Using server address instead

    找了一堆没用. 最后终于 1.使用winSCP连接ftp时,编辑会话,单击高级. 2.进入高级设置之后,单击连接,查看连接模式,把被动模式的勾,勾掉. 3.单击确定,然后保存配置,重新连接FTP,OK

  8. 云原生分布式 PostgreSQL+Citus 集群在 Sentry 后端的实践

    优化一个分布式系统的吞吐能力,除了应用本身代码外,很大程度上是在优化它所依赖的中间件集群处理能力.如:kafka/redis/rabbitmq/postgresql/分布式存储(CephFS,Juic ...

  9. Go | 基本数据类型详解

    前言 基本数据类型,变量存的就是值,也叫值类型.每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间. Printf 和 Println 的区别 printf 输出后不换行, print ...

  10. 5.websocket原理

      websocket协议原理 1.WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实现了浏览器与 ...