django框架进阶

作者: Cache_wood | 来源:发表于2021-09-29 10:22 被阅读0次

@[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路由流程
  1. Django查找全局urlpatterns变量(urls.py)
  2. Django按照先后顺序,对URL逐一匹配urlpatterns每个元素
  3. 在找到第一个匹配时,停止查找,根据匹配结果执行对应处理函数
  4. 如果没有找到匹配或出现异常,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})/
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方式
    FileResposneStreamingHttpResponse的子类
    自动分段、自动迭代,适合二进制文件传输

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"}}

相关文章

网友评论

    本文标题:django框架进阶

    本文链接:https://www.haomeiwen.com/subject/kobcnltx.html