@[toc]
Django的URL路由机制
Django的URL路由配置
路由是关联URL及其处理函数关系的过程
setting.py 文件中ROOT_URLCONF
变量指定全局路由文件名称
ROOT_URLCONF = '<工程名称>.urls'
Django使用urlpatterns变量表示路由(urls.py),该变量是列表类型,由path()或re_path()作为元素组成
urlpatterns = [
path('msggate/',include('msgapp.urls')),
path('admin/', admin.site.urls),
]
Django的URL路由流程
- Django查找全局urlpatterns变量(urls.py)
- Django按照先后顺序,对URL逐一匹配urlpatterns每个元素
- 在找到第一个匹配时,停止查找,根据匹配结果执行对应处理函数
- 如果没有找到匹配或出现异常,Django进行错误处理
注意:
- Django的路由不考虑HTTP请求方式,仅根据URL进行路由,即只要URL相同,无论POST、GET等哪种方式都指向同一个操作函数
路由:path()处理字符串路由,re_path()处理正则表达式路由
path(route,view,kwargs=None,name=None)
- route:URL或URL模式,Django定义的URL转换语法
- view:处理(视图)函数的名称,或include()类
- kwargs:向处理函数提供的额外参数,以字典形式表示
- 给URL模式的命名
route的格式和转换
-
精确字符串模式:articles/2003/
- 一个URL匹配一个操作函数
- 最简单形式,适合对静态URL的响应
- URL字符串不以/开头,但要以/结尾
-
Django的转换格式:<类型:变量名>,
articles/<int:year>/
- 一个URL模板,匹配URL同时在其中获得一批变量作为参数
- 常用形式,目的是通过URL进行参数获取和传递
- 采用<类型:变量名>格式获取参数
-
正则表达式格式:
articles/(?P<year>[0-9]{4}/
- 借助正则表达式丰富语法表达一类URL(不是一个)
- 可以通过<>提取变量作为处理函数的参数,高级用法
- 使用re_path()函数
- 简单形式(pattern),不提取参数:
articles/[0-9]{4}/
- 命名形式(?P<name>pattern),提取参数,统一为str类型:
articles/(?P<year>[0-9]{4})/
- 简单形式(pattern),不提取参数:
view的使用
urlpatterns = {
path('help/',views.help),
path('sub/',views.sub),
]
view包括两种类型:处理函数和include()函数
-
处理函数:views.py中处理URL的对应函数,URL处理的归宿
-
include()函数:包含其他路由信息的函数,分段路径组合形成总路径
- 附加本地路由
- 路径去重
#urls.py
urlpatterns = [
path('entry/',include('appA.urls')),
]
#appA/urls.py
urlpatterns = [
path('help/',views.help),
path('sub/',views.sub),
]
Django的视图响应类型
视图函数编写原则
视图函数接受HTTP请求并返回响应,可以放在任何地方,可以是任何功能
- 视图函数可以返回Web文本、页面、重定向、错误、图片等任何内容
- 视图函数通过
HttpResponse、JsonResponse
等类表达并返回回应 - 按约定,视图函数放在对应app中的views.py文件中
Django的响应类型
- HttpResponse类及子类(共10个)
HttpResponse(content,content_type=None,status=200,charset=None)
- content:拟返回的字符串
- content_type:MIME格式的返回内容类型
- status:响应状态码
- charset:响应的字符集
- JsonResponse类
JsonResponse(data)
- data:字典类型,返回的JSON类型数据
- StreamingHttpResponse类
StreamingHttpResponse(streaming_content)
streaming_content:内容的迭代器形式,以内容流的方式响应
- FileResponse类
FileResponse(stream)
- stream:以流形式打开后的文件
Django请求类型的判断
django.views.decorators.http
- 路由不能判断HTTP请求的类型
- Django通过decorators在视图函数前进行进本判断
Django的视图流式响应机制
一次性响应 vs 流式响应
- HttpResponse方式
def file_download(request):
#do something……
with open('data.txt') as f:
c = f.read()
return HttpResponse(c)
文件内容为一次性响应,仅适合小文件
- StreamingHttpResposne方式
from django.http import StreamingHttpResponse
def big_file_download(request):
#do something
def file_iterator(file_name,chunk_size=512):
with open(file_name) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
fname = "data.txt"
response = StreamingHttpResponse(file_iterator(fname))
return response
- 将文件分段,每次传输一部分,分段大小可调
- 利用python的迭代器产生分段
- 可以是文件,也可以是任何大规模的数据响应
-
yield关键字
包含yield语句的函数是一个生成器(迭代器的一种)
生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。
生成器是一个不断产生值的函数 -
FileResponse方式
FileResposne
是StreamingHttpResponse
的子类
自动分段、自动迭代,适合二进制文件传输
def homeproc2(request):
cwd = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
response = FileResponse(open(cwd + "/msgapp/templates/PyLogo.png","rb"))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="pylogo.png"'
return response
-
MIME标记
- Content-Type用于指定文件类型
- Content-Disposition用于指定下载文件的默认名称
- 这两者是MIME类型的标准定义
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="pylogo.png"'
Django的模板引擎与模板使用
Django的模板引擎:django,Jinja2
模板引擎的配置
setting.py文件中对模板引擎进行配置(BACKEND)
模板目录在列表中的顺序是搜索模板的顺序
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,"msgapp/templates")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
模板的查找
get_template(template_name) -> Template类
在模板目录列表中,依次查找某个模板,直到找到并返回Template类
如果未找到模板,则抛出TemplateDoesNotExist
异常
select_template(template_name_list) ->Template类
与get_template()
类似
模板的渲染
Template.render(context,request) ->HTML字符串
模板对象的.render()方法用于将模板结合内容渲染成HTML字符串
渲染render()
将模板和内容整合到一起,返回HTML字符串
try:
tpl = get_template("MsgSingleWeb.html")
except:
return HttpResponseNotFound("<h1>自定义的404</h1>")
html = tpl.render({"data":datalist},request)
return HttpResponse(html)
模板使用步骤
步骤1:指定Template:定义一个Template类
步骤2:进行渲染:通过Context类或字典类
def pgproc(request):
template = Template("<h1>这个程序的名字是{{name}}</h1>")
context = Context({"name":"实验平台"})
return HttpResponse(template.render(context))
Django模板语言入门
模板语言:指导模板加载数据方式的工具
DTL:Django Template Language
-
注释
单行注释:{# 这是单行注释 #}
多行注释:{% comment %}
第一行
第二行
{% endcomment %} -
变量
{{ name }}
如果变量本身是字典类型、列表类型或对象,用.获取元素
{{ adict.key}} {{ alist.0 }} -
标签
{ % 关键字引导的程序逻辑 %}
标签中的关键字包括:
for,endfor,block,endblock,if,elif,else,endif,in,trans,as,with,entends等
{% for line in data %}
<tr>
<td>{{line.time}}</td>
<td align="center">{{line.userA}}</td>
<td>{{line.msg}}</td>
</tr>
{% endfor %}
- 过滤器
{{ name|过滤标签}}
过滤器对变量的值进行修饰
lower, escape, linebreaks, date, length等
{{ name|lower}}
{{my_date|date:"Y-m-d"}}
网友评论