想法简友广场散文

django框架进阶

2021-09-29  本文已影响0人  Cache_wood

@[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进行错误处理
    注意:

路由:path()处理字符串路由,re_path()处理正则表达式路由

path(route,view,kwargs=None,name=None)

route的格式和转换
view的使用
urlpatterns = {
    path('help/',views.help),
    path('sub/',views.sub),
]

view包括两种类型:处理函数和include()函数

#urls.py
urlpatterns = [
    path('entry/',include('appA.urls')),
]
#appA/urls.py
urlpatterns = [
    path('help/',views.help),
    path('sub/',views.sub),
]

Django的视图响应类型

视图函数编写原则

视图函数接受HTTP请求并返回响应,可以放在任何地方,可以是任何功能

Django的响应类型
HttpResponse(content,content_type=None,status=200,charset=None)
- content:拟返回的字符串
- content_type:MIME格式的返回内容类型
- status:响应状态码
- charset:响应的字符集
JsonResponse(data)
- data:字典类型,返回的JSON类型数据
StreamingHttpResponse(streaming_content)

streaming_content:内容的迭代器形式,以内容流的方式响应

FileResponse(stream)
- stream:以流形式打开后的文件
Django请求类型的判断

django.views.decorators.http

Django的视图流式响应机制

一次性响应 vs 流式响应

def file_download(request):
    #do something……
    with open('data.txt') as f:
        c = f.read()
    return HttpResponse(c)

文件内容为一次性响应,仅适合小文件

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的迭代器产生分段
- 可以是文件,也可以是任何大规模的数据响应
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
    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

{%  for line in data %}
<tr>
    <td>{{line.time}}</td>
    <td align="center">{{line.userA}}</td>
    <td>{{line.msg}}</td>
</tr>
{%  endfor  %}
    

lower, escape, linebreaks, date, length等

{{ name|lower}}
{{my_date|date:"Y-m-d"}}
上一篇 下一篇

猜你喜欢

热点阅读