进入python的世界_day51_Django之视图层、模板层
一、路由分发
django中应用 都可以有自己独立的 urls.py文件 templates文件夹static文件夹
能够让基于django开发的多个应用完全独立 便于小组开发
能分能收
整个dj项目下的路由叫总路由,每个app的路由叫子路由
# 总路由
path('app01/',include('app01.urls')),
path('app02/',include('app02.urls')),
# 子路由
path('index/',views.after) #app01
path('index/',views.after) #app02
二、名称空间
在路由分发场景下 多个应用在涉及到反向解析别名冲突的时候无法正常解析
# 解决方式一:
path('app01/',include(('app01.urls','app01'),namespace='app01'))
path('app01/',include(('app01.urls','app02'),namespace='app02'))
# 解决方式二:
!自己起别名时加上应用名字即可,反正就是自己看着来,不要冲突即可
三、虚拟环境
因为以后工作中,有的项目需要这个版本的python,然后需要啥啥啥的模块,有的项目需要那个版本的python,有需要啥啥啥的模块,这样我们如果不使用虚拟环境得切来切去还要不时的删除多余模块(多余模块会占用资源),非常麻烦
一个解释器版本,有多个分身,每个分身有独立的模块空间
pycharm创建
每创建一个虚拟环境,就相当于重新下载了一个全新的解释器,绿色框是让创的这个虚拟环境可以应用于其他项目
虚拟环境创建好后,终端也切成了虚拟环境的情景
我们点击pycharm的终端时,可能会报错,如下所示
解决方法:
解决方法: win+x 以管理员方式运行powershell
输入: set-executionpolicy remotesigned 接下来输入“y”表示执行,之后重新打开pycharm打开终端即可
命令行创建
# 代码
# 建议选择除了c盘以外的地方创建
python -m venv 要创建虚拟空间文件夹名字
# 创好后,要进入这个文件夹中的script文件夹激活下
cd script
activate # 激活
deactivate # 取消激活
# 激活后,每一行的命令抬头前面都有带venv的提示
四、视图层
1.三板斧
用来处理请求的视图函数都必须返回HttpResponse对象,该语句是完全正确
1.HttpResponse() #这是类加括号,产生了对象,肯定是没问题的,返回的就是对象
2.render() # 查看源码,这个render也是返回HttpResponse产生的对象
3.redirect() # 查看源码,发现返回的本质还是继承了HttpResponsed的对象
2.返回json格式数据
先导一下
from django.http import JsonResponse
# 1.最基本的返回
import json
def index_func(request):
user_info = {'name': '小红', 'age': 18}
user_json = json.dumps(user_info,ensure_ascii=False) # 这里改了是支持中文
return HttpResponse(user_json)
# 2.利用django的JsonResponse模块
from django.http import JsonResponse # 可以导入 jsonRespons 直接可以 序列化字典
def index_func(request):
user_info = {'name': '小明', 'age': 18}
return JsonResponse(user_info,)
#不过发现,这种直接用模块的方法,还是不支持中文
# 3.通过查看JsonResponse的源码,发现可以改一下传参的值,变形后即可支持中文
def index_func(request):
user_info = {'name': '小明', 'age': 18}
return JsonResponse(user_info, json_dumps_params={'ensure_ascii': False})
# 序列化 非字典类型数据 还需要指定 safe参数 为False
l1 = [1, 2, 3, 4, 5, 6]
return JsonResponse(l1, json_dumps_params={'ensure_ascii': False}, safe=False)
3.request获取文件**
form表单携带文件类型数据必备的条件:
1.form标签的属性得加上method="post" 并且,settings.py里面的MIDDLEWARE 中间的那行得注销
2.form标签的属性得加上,enctype,属性值必须是multipart/form-data
request.FILEs获取
能获取前端传过来的文件,是列表套对象的形式,不过列表内的数据是二进制流数据,还要拿出来
# 拿到文件对象
file_obj = request.FILES.get('file') # 如果有多个,就getlist
# 完善一下视图函数,拿到文件对象数据后,逐行读取并写入在当前目录下
def index_func(request):
if request.method == 'POST':
file_obj = request.FILES.get('file')
with open(r'%s' % file_obj.name, 'wb') as f:
for line in file_obj:
f.write(line)
return render(request, 'index_html.html')
五、FBV与CBV***!
1.FBV
基于函数的视图
这几天写的都是
2.CBV
基于类的视图
#views
from django import views # 要导入模块先
class Myfunc(views.View): # 必须继承这个
def get(self,request):
return HttpResponse('CBV GET方式')
def post(self,requset):
return HttpResponse('CBV,POST方式')
#urls
path('func/',views.Myfunc.as_view() # 必须.as_view()
- CBV会自动根据请求方式的不同匹配类中定义的方法并自动执行
3.CBV源码分析(部分)
- 源码分析路径,分析为啥要加尾部的.as_view()
一个类,点了一个方法并且带了括号,有两种情况,第一种是一个普普通通的函数被@staticmethod修饰,第二种是绑定给类的方法类来调把类名当参数传进去
2.研究源码发现,CBV本质和FBV一样,调用路由时,即执行views.view
@classonlymethod
def as_view(cls, **initkwargs):
...
def view(request, *args, **kwargs):
self = cls(**initkwargs) # cls是我们定义的类
...
return self.dispatch(request, *args, **kwargs)
# 这个self就是我们自己类产生的对象,所以先从自身查起
...
return view #最后 发现 返回的是 view函数体
3.研究dispatch方法
首先我们自己views里写的类,现在阶段不能有dispatch方法,不然按照self.方法查找顺序,先从自身找起,如果自身有,就不找父类了
# http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'],目前我们就学了两个
def dispatch(self, request, *args, **kwargs):
# 请求方式小写字符串 在不在 后面这个列表里面面
if request.method.lower() in self.http_method_names:
# 面向对象 反射 通过字符串请求方式 获取 对象内属性 赋值给变量
# 刚好,我们自己写的类,有get
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
#最后 直接执行该方法 即执行 我们写的类下的方法
return handler(request, *args, **kwargs)
六、模板层
1.传值语法
-
指名道姓的传,用字典一个一个的传,精准的传
return render(request,'test.html',{'xx':xxx,'xxxx':xxxxx})
-
该视图函数中所有名称,被传的html都可以直接{{}}使用
关键字——locals()
return render(request,'test.html',locals())
2.传值特性
主要研究传值的一些特点
django 模板语法中符号 就两个
需要使用数据的时候{{}}
需要使用方法的时候{% %}
# 1.八大python数据类型都可以正常传
# 2.函数,函数名的传递会自动加括号执行 并将返回值展示到页面上
# 注意函数如果有参数则不会执行也不会展示 django模板语法不支持有参函数
# 3.类名传递也会被加括号调用,产生的对象被展示到了html页面上,并且对象也可以调用方法
# 总结:
# 模板语法会判断每个名字是否可调用 如果可以则调用
3.过滤器
有点类似于python的内置函数,调用是通过' | :' 或' | '来调用
<p>同级长度:{{ s|length }}</p>
<p>数字加法运算:{{ i|add:6 }}</p> # 源码中运用了异常捕获,所以可以加整形又拼接字符串
<p>字符串拼接:{{ s|add:'world' }}</p>
<p>日期转换:{{ res|date:'Y年-m月-d日 H:i:s' }}</p> # X不识别,用不了
<p>文件大小:{{ file_size|filesizeformat }}</p> # 会自己斟酌哪个单位更合适
<p>数据切片:{{ l|slice:'1:3' }}</p>
<p>字符截取:(按字符个数截取 三个点 算一个){{ s|truncatechars:3 }}</p> #超出范围 会返回完整的数据
<p>单词截取:(三个点不算 按空格计算单词截取){{ s|truncatewords:3 }}</p>
<p>语法转义:{{ 标签名|safe }}</p> # 重点,意思是让html放手去做
今日单词
serialized 序列化