昨日内容回顾
-
Django请求生命周期图
处理一条请求与7个部分关联:
客户端、网关服务接口、Django中间件、路由层、视图层、模板层、模型层。
-
Django路由层的匹配
-
静态匹配
匹配指定的路由。
-
动态匹配
分为转换器匹配和正则匹配。正则匹配又包含有名分组匹配与无名分组匹配。
-
反向解析
在HTML页面或后端界面进行动态匹配时,需要用到反向解析。
-
今日内容概要
- 路由分发
- 名称空间
- 虚拟环境
- request获取文件对象
- 路由层返回数据要求
- FBV与CBV
- CBV原理解析
- 模板层传值
今日内容详细
路由分发
路由分发的基础是Django允许每个app拥有自己独立的一套配置数据,包括路由、模板、视图等。当一个Django项目内含有多个app且每个app下有多个视图时,为了方便管理,在项目根目录下的路由层中,不会直接匹配请求的视图,而是将请求的视图分配给其所在的app,由其所在的app进行后续的操作,这就是路由分发。
路由分发的表现形式
项目根目录下路由中的路由匹配:
path('app_name/', include('app_name.urls')) # 使用include需要导入
名称空间
Django项目中的所有视图共享一个名称空间,当为不同项目下的视图指定相同的name时,仅有后被加载的视图可以生效,先加载的视图的名称会被覆盖。
为避免名称的覆盖问题,最简单的解决方式是指定名称时为视图添加当前app的前缀来区分,也可以在路由分发时指定视图所在的名称空间。
总路由
path('app01/', include(('app01.urls', 'app01'), namespace='app01')),
path('app02/', include(('app02.urls', 'app02'), namespace='app02')),
反向解析
reverse('app01:index_view')
reverse('app02:index_view')
虚拟环境
虚拟环境是已存在的程序运行环境的备份,虚拟环境是为了特定程序运行单独开设的,目的是为了保证程序运行环境的纯净,以节省空间。
创建虚拟环境的方法:
- 使用pycharm创建,操作较为简单,在创建新项目时选择虚拟环境即可;
- 命令行创建,指令为 python -m venv python_venv,最后一个单词为虚拟名称名字,可自定义。命令行创建虚拟环境需要手动启动activate文件以激活虚拟环境,使用deactivate文件关闭虚拟环境。
request获取文件对象
Django后端获取文件对象使用request. FILES。
使用该方法能获取到文件对象的前提是前端form表单使用了正确的提交方式。form表单中关于文件传输需要满足两个条件:
- method必须为post
- enctype必须为multipart/form-data
路由层返回数据要求
用来处理请求的视图函数返回的数据必须为HttpResponse对象。
视图函数返回数据有三种,为HttpResponse()、render()、redirect(),其本质都是返回了HttpResponse对象。
class HttpResponse:
pass
return HttpResponse()
def render():
return HttpResponse()
return render()
def redirect():
redirect_class = 类(祖先有个类是HttpResponse)
return redirect_class()
return redirect()
FBV与CBV
FBV即以函数为基础的视图,即视图中实现功能主要通过功能函数。
CBV即以类为基础的视图,即视图中实现功能主要通过类的操作。本质也是通过类中定义的功能函数实现,不过可以通过定义特定的函数实现自动实现请求种类对应的操作。
CBV原理解析
定义相关视图类形式,可以看到继承了views中的View类:
class MyLoginView(views.View):
CBV路由匹配形式,需要调用类中的as_view函数:
path('login/', views.MyLoginView.as_view())
父类View的代码主体:
class View:
@classmethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs)
return view
def dispatch(self, request, *args, **kwargs):
handler = getattr(self, request.method.lower())
return handler(request, *args, **kwargs)
调用相关视图类的执行流程:
- 首先执行as_view函数,将views.MyLoginView.as_view()变换为views. view;
- 执行view函数,生成自定义类的对象,让后调用dispatch函数(需要注意查找顺序);
- 调用dispatch函数,获取request中的请求方式并转换为小写;
- 调用自定义类中的请求对应方式小写对应的函数。
模板层传值
Django模板语法主要格式:
"""
{{ }} 数据相关操作
{% %} 逻辑处理相关操作,调用函数时只需要写函数名
{# #} 注释语法,不会显示在前端页面上
"""
模板语法传值方式
- 使用字典形式传值,传值精准,值较多时不适用。
return render(request, 'html_name.html', {'name1': data1, 'name2': data2})
- 使用locals()传值,将该函数中所有名称及对应值传入,值多时适用。
return render(request,'html_name.html', locals())
模板语法传值特性
- python基本数据类型正常展示;
- 文件对象也可以展示并调用方法;
- 函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参);
- 类名也会自动加括号调用,对象直接展示;
- 使用{{ 数据|内置方法名}}可以调用数据内置函数。