下面开始解释这些函数的具体工作原理:
首先明确一下,所有写在views.py里的函数叫做响应函数。这些东西是用来显示你的网页的。下面是有一段python的代码:
========================================================================
from django.template import Template,Context,engine
import datetime
from django.template.loader import get_template
date=datetime.datetime.now()
candidate_names = ['Bill Clinton','Barack Obama','George Bush']
#随便写几个人名
page_code = '''a test page
The Name is:
{{Namer}}
The Height is:
{{Heighter}}
Today is:
{{Timer}}
candidates are:
{% for name in Name_List %}
- {{ name }}
{% endfor %}
candidate name in reversed order are:
{% for name in Name_List reversed%}
- {{ name }}
{% endfor %}
'''
#page_code代表一段网页代码,目前是python的一个字符串。
# 本例里作为上下文传递的键值都必须是字符串类型的。否则就会报错说ImproperlyConfigured: Requested setting USE_TZ
# 实际你在项目里的时候不会有这个问题,可以传入数值的
context_content = {'Name_List':candidate_names,"Namer":'George',"Heighter":'178cm',"Timer":str(date)}
t = Template(page_code,engine=engine.Engine())
# 这里一定要指定engines参数,新版的django会检查这个engine是否存在
c = Context(context_content)
# Context的需要传入的参数是一个多元素或但元素的字典。
# 这个字典的键与网页代码里的变量标签一致,值就是用来替换页面 代码的变量标签的
r = t.render(c)
print('r= ',r)
# 在旧版本的django里t.render(c)的类型是UNICODE编码
# 新版里是
# page_code里的诸如{{Namer}}一类的变量标签都被翻译成了context_content对应的内容
# {% for %}和{% endfor %}都会被执行并翻译成相应的内容
# 这里重点强调一个概念,就是模板网页里的这些内容都是现在服务器端处理和解析之后在传递给客户端的。
# 这也是为什么服务器这边的网页文件都叫做模板的一个原因,服务器这边的网页文件都是需要django处理过一下才发给客户端的
# 这一点必须搞清楚。
========================================================================
执行上面的代码可以得到一个结果
========================================================================
r= The Name is: George The Height is: 178cm Today is: 2019-11-03 01:21:19.761648 candidates are: candidate name in reversed order are:
========================================================================
现在说下上面的执行过程:
page_code的内容相当于网页的html代码。其中,以双大括号{{ }}包裹的叫做模板变量;以大括号加百分号{% %}包括的部分呢叫做模板标签,这两个东西后面再讲。经过,t = Template(page_code,engine=engine.Engine())这一步处理之后,t变成了内容为字符串 page_code的值得一个Template()对象。
context_content是一个字典,作用相当于把page_code里高亮部分的内容同python代码里的内容进行了一下映射。这个字典里的建代表网页里的模板变量名,值就是python代码里的变量值。经过 c = Context(的 这一步处理之后 c成为了一个内容为context_content的Context的实例。
承载着html代码的 t 经过 t.render(c) 方法后得到返回值r就是你的django服务器最终发给客户端的东西。在django的服务器端,经过render方法处理之后,模板变量和模板标签都被翻译成了最终发给客户端的网页代码。这个就是django响应客户端请求的最核心原理。翻译过程就是首先把html的代码当作一个文本进行处理,根据Context()实例里传过来的映射内容把模板变量替换成python代码里相关值,然后再根据模板标签执行相应的操作,把模板标签里的计算结果也翻译处理成相应的文本,最后再把整个文本发给客户端,作为最终的响应渲染到客户端的浏览器里。
理解上面的这个过程,接下来就简单了。HttpResponse就是一个把上面的过程打包了的一个对象。这个对象的输入值,就是page_code和context_content.。context_content可以为空。HttpResponse的返回值就是经过django翻译好了的html代码二进制格式外加一些其他响应的属性 。
==============================================
from django.shortcuts import render, redirect, HttpResponse
h = 'Some Page Content'
res = HttpResponse(h,content_type="text/plain",charset='utf-8')
print("html is:",res.content)
==============================================
这段代码的执行结果就是:
b'Some Page Content'
django要求所有views.py模块里的函数输入值必须是request,也就是客户端的请求对象,返回值必须是HttpResponse。
同时还要明确的一点就是,这个翻译的过程是在服务器端进行的。发到客户端的时候已经是翻译好了的页面代码了。django会把被请求的页面文件里,所有代码都当成一整个文本文件进行处理,不管里面有什么语法现象,只负责翻译和替换其中以双大括号{{}}包裹的和以大括号加百分号{%%} 包裹的部分。这个过冲一定要搞清楚。
render函数就是封装了HttpResponse对象的一个函数。
这个函数要求输入的第一个值必须是view函数传进来的request,
第二个参数是你的页面文件名称,要求用字符串的形式。django会到先到你的YourApp下面的templates文件夹去找这个页面文件,如果没找到就去别的App下面的templates文件里找,如果都找不到,就去项目的根目录下的templates文件夹里找。
第三个参数就是你的Context对象,这个是根据页面文件的需要可选的。render函数的返回值就
redirect函数不仅可以返回你项目下的页面文件还能直接让客户端重定向到别的网站。
如果写成redirect(SomeFuncInYourViewsPy)就会重定向到你的某个view函数。
如果这个SomeFuncInYourViewsPy不在同一个views.py内的话还需要import一下。 格式就是from YourOtherApp import views as otherViews 并且,SomeFuncInYourViewsPy还必须是在你的url.py里注册过的。这一点下一节也会讲。
如果写成redirect('/some/url/inyoursite/')就会重定向到你网站里的那个网址。
如果写成redirect('http://some/url/')就会重定向到你指定的那个网址。