路由分发、名称空间、视图层之必会的三板斧、JsonResponse对象、request获取文件、FBV与CBV、模板层语法传值

一、昨日内容回顾

二、路由分发

1.djiango的每个应用都有主见的templates文件夹,djiango文件夹,static文件夹等有利于分组
2.路由分发有益于防止总路由urls.py的代码冗余
3.组长可以将组员写的APP全部拷到一个新的djiango项目中,利用路由分发的特点整合app

总路由:
from django.contrib import admin
from django.urls import path,include urlpatterns = [
path('admin/', admin.site.urls),
path('app01/',include('app01.urls')),
path('app02/',include('app02.urls'))
]
app01
urls.py:
from django.urls import path
from app01 import views
urlpatterns = [
path('index/', views.index_urls),
]
views.py:
from django.shortcuts import render,HttpResponse # Create your views here.
def index_urls(request):
return HttpResponse('from app01 index urls')
app02
urls.py:
from django.urls import path
from app02 import views
urlpatterns = [
path('index/', views.index_urls),
]
views:
from django.shortcuts import render,HttpResponse # Create your views here.
def index_urls(request):
return HttpResponse('from app02 index urls')

三、名称空间

当多个应用出现了相同的别名时,无法识别应用的前缀

解决方式一:名称空间

总的路由添加一个名称空间:
path('app01/',include(('app01.urls','app01'),namespace='app01')),
path('app02/',include(('app02.urls','app02'),namespace='app02'))
urls:
urlpatterns = [
path('index/', views.index_urls, name='index_urls'),
]
views:
def index_urls(request):
print(reverse('app01:index_urls'))
return HttpResponse('from app01 index urls')

解决方式二:起别名

总路由:
path('app01/',include('app01.urls')),
path('app02/',include('app02.urls'))
子路由:
urls:
urlpatterns = [
path('index/', views.index_urls, name='app01_index_urls'),
]
views:
def index_urls(request):
print(reverse('app01_index_urls'))
return HttpResponse('from app01 index urls')
1.只要名字不冲突,就没有必要使用名称空间
2.起别名我们一般在APP多的情况下,然后起别名的时候加上app当做前缀,这样就可以避免名字冲突的问题。

四、虚拟环境

虚拟环境的作用:
开发工作中针对不同的项目需要为其配备对应的解释器环境
诸多项目在你的机器上任何无障碍的打开并运行
#方式1:
把所用的模块都下载下来,如果有相同模块不同版本每次都重新下载替换
#方式2:
提前准备好多个解释器环境,针对不同的项目切换

有一个新的文件夹创建讲师表示虚拟环境创建成功

命令行创建虚拟环境的方式:
python -m venv xxxxxx
激活虚拟环境:
activate
关闭虚拟环境:
deactivate

五、视图层之必会三板斧

views.py文件里面是一系列的函数或者类
用来处理请求的视图函数都必须返回HttpResponse对象
1.HttpResponse
返回的是字符串类型
HttpResponse()括号内直接跟一个具体的字符串作为响应体
2.render
返回html页面,并且在返回给浏览器之前还可以给HTML文件传值
除了request参数外,还接受一个待渲染的模板文件和一个保存具体数据的字典参数
def render(request, template_name, context=None, content_type=None, status=None, using=None)
eg:def render(request,"index.html",{'form':form})
3. redirect
接受一个url参数,表示跳转到指定的url
eg: def redirect("/home")
研究底层源码
1.def index_func(request):
return HttpResponse()
"""
按住ctrl键点击进入HttpResponse,进去之后发现HttpResponse其实是一个类
类名加()就是实例化一个对象
class HttpResponse(HttpResponseBase):
def __init__(self,content,*args,**kwargs)
pass
"""
2.def index(request):
return render()
"""
按住ctrl键点击进入render:
def render(request, template_name, context=None, content_type=None, status=None, using=None):
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)
执行的是render函数,然后render函数返回的是HttpResponse(content, content_type, status)
"""
3.def index(request):
return redirect()
"""
按住ctrl键点击进入redirect:
def redirect(to, *args, permanent=False, **kwargs):
redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
return redirect_class(resolve_url(to, *args, **kwargs)) 按住ctrl键点击进入HttpResponsePermanentRedirect:
class HttpResponsePermanentRedirect(HttpResponseRedirectBase):
status_code = 301
........ 最后发现它继承的也是HttpResponse
"""
综上:Django视图层函数必须要返回一个HttpResponse对象

六、JsonResponse对象

def index(request):
user_dict = {'name':'jia老师','age':18}
import json
user_json = json.dumps(user_dict,ensure_ascii=False) #
return HttpResponse(user_json)
from django.http import JsonResponse
def index(request):
# user_dict = {'name':'jia老师','age':18}
# import json
# user_json = json.dumps(user_dict,ensure_ascii=False)
# return HttpResponse(user_json)
l1 = [11,22,33,44,55,66]
return JsonResponse(l1,json_dumps_params={'ensure_ascii':False},safe=False) 查看源码发现扩展的功能
class JsonResponse():
def __init__(self,data,json_dumps_params=None):
json.dumps(data,**json_dumps_params)
JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False

七、视图层之request对象获取文件

html代码:
<h1>获取数据</h1>
<form action="" method="post" enctype="multipart/form-data">
<p>
username:
<input type="text" name="username">
</p>
<p>
hobby:
<input type="checkbox" name="hobby" value="basketball">篮球
<input type="checkbox" name="hobby" value="basketball1">篮球1
<input type="checkbox" name="hobby" value="basketball2">篮球2
</p>
<p>
file:
<input type="file" name="file">
</p>
<input type="submit" value="按钮">
<button>按钮</button>
</form>
    if request.method == 'Post':
print(request.POST)
print(request.FILES)
return render(request,'1.html')

    if request.method == 'POST':
# print(request.POST)
# print(request.FILES) file_obj = request.FILES.get('file')
print(file_obj.name)
with open(r'%s' % file_obj.name, 'wb') as f:
for line in file_obj:
f.write(line)
return render(request,'1.html')

八、FBV与CBV

FBV(Function base view):基于函数的视图 我们之前写过的都是FBV
CBV(Class base view)
1.FBV
def index(request):
return HttpResponse对象
2.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())

九、CBV源码剖析

path('login/', views.MyLoginView.as_view())
"""
面向对象属性方法的查找顺序:
1.先从对象自己的名称空间找
2.去产生类对象的类里面找
3.去父类里面找
"""
源码分析入口
path('func/', views.MyView.as_view())
1.绑定给类的as_view方法(它是我们自己写的类里面继承的类)
class View:
@classonlymethod
def as_view(...):
绑定给类的,类调用会自动将类当作第一个参数传入
def view(...):
pass
return view
2.CBV路由匹配本质:跟FBV是一致的
path('func/', views.view)
3.访问func触发view执行
def view(...):
obj = cls() # 我们自己写的类加括号产生的对象
return obj.dispatch()
'''涉及到对象点名字 一定要确定对象是谁 再确定查找顺序'''
4.研究dispatch方法
def dispatch(...):
判断 request.method将当前请求方式转成小写 在不在 self内 self==MyLogin
"http_method_names 内有八个请求方式 合法"
['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
if request.method.lower() in self.http_method_names:
# getattr 反射: 通过字符串来操作对象的属性或者方法
func_name = getattr(obj,request.method.lower())
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
用到了一个反射的知识,从obj这个对象里面,找一个request.method.lower()这个的函数

十、模板层

1.模板语法的传值

urls代码:
path('modal/', views.modal) views代码:
def modal(request):
name = 'jason'
return render(request, 'modal.html', {'name':name}) 指名道姓传参 不浪费资源
html代码:
<body>
{{ name }}
{{ age }}
{{ gender }}
</body> urls代码:
path('modal/', views.modal) views代码:
def modal(request):
name = 'jason'
age = 18
gender = 'female'
return render(request, 'modal.html', locals()) # 将函数体里局部空间里所有的名字全部传入给前面的那个页面 将整个局部名称空间中的名字去全部传入简单快捷

2.模板语法传值特性

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

路由分发、名称空间、视图层之必会的三板斧、JsonResponse对象、request获取文件、FBV与CBV、模板层语法传值的更多相关文章

  1. Django框架路由分发-名称空间

    目录 一:路由分发 1.路由分发简介 2.总路由分发配置 3.总路由终极配置(不需要导应用路由,直接点应用即可) 4.子路由配置 二:名称空间 1.名称空间应用场景 3.解决方式二>>&g ...

  2. Django url反向解析与路由分发名称空间

    url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...

  3. Web框架之Django_03 路由层了解(路有层 无名分组、有名分组、反向解析、路由分发 视图层 JsonResponse,FBV、CBV、文件上传)

    摘要: 路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页.虚拟环境 视图层 JsonResponse FBV 与 CBV(function base views与class bas ...

  4. [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]

    [Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...

  5. django路由匹配、反向解析、无名有名反向解析、路由分发、名称空间

    目录 django请求生命周期流程图 1.Django请求的生命周期的含义 2.Django请求的生命周期图解及流程 3.Django的请求生命周期(分布解析) 路由层 1.路由匹配 2.path转换 ...

  6. Django 视图层和模板层

    目录 一.网站首页和404页面的路由配置 1. 网站首页路由 2. 404页面 二.Django视图层 1. 小白必会三板斧 (1)HttpResponse (2)render (3)redirect ...

  7. django之路由分组,路由分发,FBV,CBV,ORM框架

    今日的内容: a. 路由系统 1. 创建app 2. 路由的分组 3. 路由的分发 - 正则表达式匹配 b. django的orm(模型model) 1. 创建模型的步骤 2. orm基本的增删改查 ...

  8. Python 的名称空间和作用域

    最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...

  9. Django之路由分发反向解析

    Django路由分发|反向解析 当一个Django中有多个app时,路由会有很多,将这些路由都写在与项目同名的文件夹下就会显得很多,很乱.并且在协同开发的时候容易出现相同的命名,当项目合并后就会出现路 ...

  10. Django基础之视图(views)层、模板层

    目录 Django基础之视图(views)层.模板层 JsonResponse 向前端返回一个json格式字符串的两种方式 重写Django中的json的某个方法 form表单上传文件 FBV与CBV ...

随机推荐

  1. SQL中事务以及全局变量的使用

    事务的定义 简单的说,事务处理可以用来维护数据库的完整性,保证一批SQL语句要么全执行,要么全部不执行 事务的特性 原子性  一致性  持久性  隔离性        注:一元九个 事务的使用 sel ...

  2. 题解 UVA439 骑士的移动 Knight Moves

    前言 最近板子题刷多了-- 题意 一个 \(8\times 8\) 的棋盘,问马从起点到终点的最短步数为多少. \(\sf Solution\) 要求最短路径嘛,显然 bfs 更优. 读入 这个读入处 ...

  3. IP分类与子网划分

    1.IP地址的格式  每一类地址都由两个固定长度的字段组成: (1)网络号 net-id:它标志主机(或路由器)所连接到的网络 (2)主机号 host-id:它标志该主机(或路由器).   最大可指派 ...

  4. 第2-1-2章 传统方式安装FastDFS-附FastDFS常用命令

    目录 3 安装配置 3.1 安装GCC 3.2 安装libevent 3.3 安装libfastcommon 3.4 安装FastDFS 3.5 安装fastdfs-nginx-module 3.5 ...

  5. Linux---ls cd

    ls 命令 ls命令是linux下最常用的命令,是 list 的缩写,可以用各种方式查看目录中的内容. 格式: ls [选项] [目录名] 常用参数 short long function -a -- ...

  6. 如何在CentOS7上搭建自己的GitLab仓库

    序言 各位好啊,我是会编程的蜗牛,作为java开发者,在团队开发中,一般都是需要使用git及git仓库来管理我们的代码的,这非常方便.我以前在小公司的时候,基本都是一个人开发一个项目,所以也没有怎么接 ...

  7. 【题解】CF1215C Swap Letters

    题面传送门 解决思路 首先容易得知,两个字符串中 \(b\)(或 \(a\)) 的个数为偶数时,一定有解.为奇数则一定无解. 其次考虑怎么交换.对照样例三: in: 8 babbaabb ababab ...

  8. JS图片放大镜功能实现

    JS图片放大镜功能实现 技术关键点 1.左侧和上侧距离,在一个水平位置和垂直位置中有我们可以挪动的区域,就是原图片区域,鼠标挪动位置是一个块状位置,他的左侧和上侧距离浏览器上侧和左侧分别有一个长度,我 ...

  9. FluentFTP能连接却报未将对象引用设置到对象的实例。

    本来项目中用的好好的FTP下载传输,不知道从什么时候开始读取不到了,也上传不了.实际读取的是本地缓存的.因为同事上传不了文件和图片才发现.上源码! #region 下载文件 static byte[] ...

  10. 深度学习之tensorflow2实战:多输出模型

    欢迎来到CNN实战,尽管我们刚刚开始,但还是要往前看!让我们开始吧! 数据集 链接:https://pan.baidu.com/s/1zztS32iuNynepLq7jiF6RA 提取码:ilxh,请 ...