Django采用了MVT的软件设计模式,暨模型(Model),视图(View),模板(Template)
· M:负责和数据库交互,进行数据处理。
· V:接受请求,进行业务处理,返回应答,做逻辑函数
· T:负责封装构造要返回的html
MVT模型的工作流程:
路由控制器将请求转发给对应的视图函数,完成业务逻辑,视图函数将从model中获取的数据嵌入到template中的模块(html)渲染成一个页面字符串,返回给客户端的流程。
Django的重点在于:
url路由器+MVT设计模型
流程图:
Django完整的目录结构如下:
Django创建一个项目:# django-admin startproject 项目名
启动项目:# python manage.py runserver IP:PORT
创建应用:# python manage.py startapp 应用名
--------------------------------------------------------------------------------------------------------------
一开始的'项目名'下的urls.py其实本质是一种映射关系,请求路径和视图函数的映射关系
根路径的话不用加'/',比如可以是path("",getindex)就可以了访问根路径了,但是上图其实并不符合我们程序员的一般习惯,所以最好是吧get_timer函数放到自己创建的'应用名'文件之中,然后用from...import...去调用即可,在这个例子里,我们把它放在了views之中。
以下图为例,他的'应用名'叫做'app01',然后去调用它views.py里的get_timer和index函数就行,这样的话代码会好看一些。
----------------------------------------------------------------------------------------------------------------
render()函数是个渲染函数,render函数第一个参数放请求request,第二个参数放模板文件,比如index.html在templates之中,但是其实我们写render函数的时候可以这么写就行:return render(request,"index.html"),不用写路径,这其实是django里封装好的。为什么呢?因为我们可以在与‘项目名’同名的‘应用名’中的settings.py配置文件中的TEMPLATES里的‘DIRS’路径其实就render函数找的默认路径,如下图所示。也就是每次找函数都是在BASE_DIR下的templates里去找。从这里可以看出templates这个文件夹不能改的原因:暨django封装的配置里规定了其下路径以templates来搞。
那么,如果在templates下还有个文件夹我们称作“multiend”,"multiend"文件夹下才有这个index.html的话,那么你render中的路径就要变成:multiend/index.html
目前为止,均为静态页面。。。
——————————————————————————————————————————————————————
Q:如何给客户端返回动态数据?
如果我们想在timer.html中获得一个实时更新的时间,所以流程是获取数据再嵌入。我们可以在templates中的timer.html中写{{ now }}来占位,然后再回到views中去调用datatime函数获取当前时间,对其nowStr进行字符串处理,下面就是嵌入的问题:引入render的第三个参数,其本质是个字典{"now":nowStr}。
----->
如上图所示即可。
__________________________________________________________________________________________________
Q:为什么每个视图函数都会有request的原因?
因为一开始启动函数runserver时wsgi.py会解析请求,封装响应,再传给urls。所以通俗地说,wsgi才是django的第一站,而urls只是我们开发的第一站。
———————————————————————————————————————————————————————
Q:关于正则分组查询和request传参的问题?
上图为urls.py中正则传参,这里的path要写做re_path,(\d{4})表示传一个4位数字以正则的方式去查找。
view里接受参数的时候,参数就不仅仅是一个request了,还要包含你上面的(\d{4})和(\d{2})这2个东西对标year和month,HttpResponse就可以接受啦。
补充,如果想模糊传参,(\d{2})只能传2位,但(\d{1,2})可以传1或2位。
真实流程大概如下:
————————————————————————————————————————————
Q:关于有名分组?
定义了传参的标准,接受的时候只能以同样的key来接受,不过顺序可以改变。
——————————————————————————————————————————————
Q:关于路由分发?
这时候去访问app01里的urls
此时若要在网页匹配成功,