day66---Django视图系统和模板系统

1. Django视图系统(View)

描述:一个视图函数或类,简称视图。视图是一个简单的python函数或类,它接受Web请求返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片

FBV和CBV

  • FBV(Function Base View):基于函数的视图

    # views.py
    from django.shortcuts import render, redirect
    def function_name(request):
        if request.method == 'POST':
            return redirect(URL地址)
        return render(request, html文件)
    # urls.py
    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^url_name/', views.function_name)
    ]
  • CBV(Class Base View):基于类的视图

    # views.py
    from django.shortcuts import render, redirect
    from django.views import View
    class ClassName(View):
        def get(self, request):
            return render(request, html文件)
        def post(self, request):
            return redirect(URL地址)
    # urls.py
    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^url_name/', views.ClassName.as_view())
    ]

Request对象

  • 常用属性:django将请求报文中的请求行、头部信息、内容主体封装成 HttpRequest 类中的属性。除了特殊说明的之外,其他均为只读的。

    • request.schem:请求的字符串(通常为http或https)
    • request.body:请求体
    • request.path:请求的路径,不包含域名和参数
    • request.method:请求的方法,如:get、post
    • request.encoding:提交数据的编码,如果为None则表示使用DEFAULT_CHARSET的设置,默认为'utf-8',这个属性是可写的,可以修改它来修改访问表单数据使用的编码
    • request.GET:以字典的形式存储get请求的参数
    • request.POST:以字典的形式存储post请求的参数
    • request.FILES:以字典的形式存储上传文件的信息。FILES只有在请求的方法为POST且提交的form表单带有enctype="multipart/form-data"的情况下才会包含数据。否则,FILES将为一个空的类似于字典的对象
    • request.COOKIES:以字典的形式存储cookie信息
    • request.session:一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django启用会话的支持时才可用
    • request.user:一个AUTH_USER_MODEL类型的对象,表示当前登录的用户
    • requese.resolver_match:一个ResolverMatch的实例,表示解析后的URL。这个属性只有在URL解析方法之后才设置,这意味着它在所有的视图中可以访问,但是在URL解析发生之前执行的中间件方法中不可以访问
  • request.META:以字典的形式存储所有的HTTP头部信息
    • CONTENT_LENGTH:请求的正文的长度
    • CONTENT_TYPE:求的正文的MIME类型
    • HTTP_ACCEPT:响应可接收的Content-Type
    • HTTP_ACCEPT_ENCODING:响应可接收的编码
    • HTTP_ACCEPT_LANGUAGE:响应可接收的语言
    • HTTP_HOST:客服端发送的HTTP头部
    • HTTP_REFERER:Referring页面
    • HTTP_USER_AGENT:客户端的user-agent字符串
    • QUERY_STRING:单个字符串形式的查询字符串(未解析过的形式)
    • REMOTE_ADDR:客户端的IP地址
    • REMOTE_HOST:客户端的主机名
    • REMOTE_USER:服务器认证后的用户
    • REQUEST_METHOD:请求的方法
    • SERVER_NAME:服务器的主机名
    • SERVER_PORT:服务器的端口
    • 注意:除CONTENT_LENGTH和CONTENT_TYPE之外,请求中的任何HTTP首部转换为META的键时,都会将所有字母大写并将连接符替换为下划线最后加上HTTP_前缀。所以,一个叫做X-Bender的头部将转换成META中的HTTP_X_BENDER键
  • 常用方法:

    • request.get_host():根据从HTTP_X_FORWARDED_HOST和HTTP_HOST头部信息返回请求的原始主机。如果这两个头部没有提供相应的值,则使用SERVER_NAME和SERVER_PORT。USE_X_FORWARDED_HOST:一个布尔值,用于指定是否优先使用X-Forwarded-Host首部,仅在代理设置了该首部的情况下,才可以被使用。当主机位于多个代理后面时,get_host()方法将会失败,除非使用中间件重写代理的首部
    • request.get_full_path():获取URL的路径,不包含域名,但是会包含后面的参数
    • request.build_absolute_uri(location):获取location绝对的URI,如果不指定location,则返回使用request.get_full_path()的值
    • request.is_secure():判断请求是否是安全的;如果请求时是安全的,则返回True;即请求通是过HTTPS发起的
    • request.is_ajax():判断请求是否是ajax发送的;如果请求是通过XMLHttpRequest发起的,则返回True,方法是检查HTTP_X_REQUESTED_WITH相应的首部是否是字符串'XMLHttpRequest'。大部分现代的JavaScript库都会发送这个头部。如果你编写自己的XMLHttpRequest调用(在浏览器端),必须手工设置这个值来让is_ajax()可以工作
    • request.get_signed_cookie(key,default=RAISE_ERROR,salt='', max_age=None):返回签名过的Cookie对应的值,如果签名不再合法则返回django.core.signing.BadSignature。如果提供default参数,将不会引发异常并返回default的值。可选参数salt可以用来对安全密钥强力攻击提供额外的保护。max_age参数用于检查Cookie对应的时间戳以确保Cookie的时间不会超过max_age秒
    • request.read(size=None):读取请求报文的内容主体,除了read方法以外,还有跟python文件操作一样的方法:request.readline()、request.readlines()、request.xreadlines()。使用request.__iter__()方法查看出,也可以使用for循环的方式循环迭代的查看请求报文的内容主体
  • 获取值的方法:

    • get():获取前端name的对应的值
    • getlist():获取前端前端name的对应的多个值,使用列表的形式存储
  • 如果后端想获取前端的数据,前端的标签中必须要有name属性,常见的标签有:input、select、textarea、checkbox、radio

Response对象

  • 描述:返回指定的字符串

    from django.shortcuts import HttpResponse
    def function_name(request):
            if request.method == 'POST':
                response = HttpResponse('ok', content_type="text/plain", charset=UTF-8)
                return response
  • 属性:

    • HttpResponse.content:响应内容
    • HttpResponse.charset:响应内容的编码
    • HttpResponse.status_code:响应的状态码
  • 设置和删除响应头信息:

    from django.shortcuts import HttpResponse
    response = HttpResponse()
    response['Content-Type'] = 'text/html; charset=UTF-8'
    del response['Content-Type']

render函数

  • 描述:结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的HttpResponse对象

  • 格式:render(request, template_name, [context])

  • 参数说明:

    • requese:用于生成响应体的对象
    • template_name:需要渲染的模板名称
    • context:渲染模版传送的数据,以字典的形式存储。如果字典的值是可调用的,视图将在渲染模版之前调用
    • content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE设置的值
    • status:响应的状态码,默认为200
  • render示例:

    from django.shortcuts import render
    def function_name(request):
        return render(request, 'template.html', {'key': 'value'})

redirect函数

  • 描述:返回页面的重定向,可以设置永久重定向和临时重定向,redirect是两次请求的过程

  • 参数的类型:

    • 一个模型:将调用模型的get_absolute_url()函数
    • 一个视图,可以到参数:将使用urlresolvers.reverse 来反向解析名称
    • 一个绝对的或相对的URL,将原封不动的作为重定向的位置。
  • redirect重定向说明:默认返回一个临时的重定向;传递permanent=True可以返回一个永久的重定向

    • 临时重定向:响应状态码是302,搜索引擎收录的是原始页面
    • 永久重定向:响应状态码是301,搜索引擎收录的是重定向后的页面

render和redirect的区别

  • 如果返回的页面需要模版语言来渲染,需要使用render函数先生成字符串,然后再把生成的字符串返回给前端页面来渲染

  • 如果返回的页面需要指定跳转到其他页面,需要使用redirect函数指定视图或URL来返回

JsonResponse对象

  • 描述:JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应

    from django.http import JsonResponse
    jsonresponse = JsonResponse({'key': 'value'})
    print(jsonresponse.content)
  • 默认只能传字典类型,如果需要传递非字典类型,需要设置关键字参数safe=False

    from django.http import JsonResponse
    jsonresponse = JsonResponse([1, 2, 3], safe=False)
    print(jsonresponse.content)

2. Django模版语言(Template)

模版语言的简介

  • Django的模版系统可以将页面的设计和Python的代码分离开会更干净简洁更容易维护

  • 模板 = HTML代码 + 模板语言

  • 模版在使用时替换对应的变量名,也会根据控制模版的逻辑标签来实现和显示出不同的结果

  • 两种特殊符号:

    • 变量相关的特殊符号:{
    • 逻辑标签相关的特殊符号:

模版语言之注释

    {# 注释信息 #}

模板语言之变量

  • 语法:{{ 变量名 }}

  • 在Django模板中遍历复杂数据结构的关键是句点字符'.'。使用点可以获取对象属性的值

  • 用法:

    {# 获取lst的第一个参数 #}
    {{ lst.0}}
    {# 获取dic的key对应的value #}
    {{ dic.key}}
    {# 获取class对象的attr属性 #}
    {{ class.attr }}
    {# 点的操作只能调用类中不带参数的方法 #}

模板语言之过滤器

  • 语法:{{ var|filter_name:param }}

  • 注意:管道符|左右没有空格

  • default:当var为空时,可以使用默认值

    {{ var|default:'默认值' }}
  • length:获取var的长度,字符串和列表都支持

    {{ var|length }}
  • filesizeformat:获取var的格式化为可读性的文件尺寸

    {{ var|filesizeformat }}
  • date:如果var是时间类型的值,可以格式化为指定的格式

    {{ var|date:'Y-m-d H:i:s' }}
  • slice:对var进行切片操作,字符串和列表都支持,遵守python的切片方式,即顾头不顾尾

    {{ var|slice:'m:n' }}
  • truncatechars:字符串截断。如果字符串是字符多与指定的字符数量,会被自动截断,截断的字符串会以'...'替换,这三个点也会占用三个字符

  • truncatewords:单词截断。跟truncatechars用法一样,只是针对单词进行截断

    {{ var|truncatechars:8 }}
    {{ var|truncatewords:6 }}
  • safe:为了安全因素考虑,Django的模板中会对HTML标签和JS等语法标签进行自动转义。但是有些时候不需要对于标签元素进行转义,需要关闭Django中的自动转义功能。

    {{ var|safe }}

模板语言之标签

  • 语法:{% tag %} ...

  • 注意:标签有开始标签和结束标签

  • for:针对列表或字典进行循环遍历

    • 循环列表
        {% for i in list %}
            <p>{{ i.key }}</p>
        {% endfor %}
    
    • 反向循环
        {% for i in list reversed %}
            <p>{{ i.key }}</p>
        {% endfor %}
    
    • for循环可用的参数
      • forloop.counter:当前循环的索引值(从1开始)
      • forloop.counter0:当前循环的索引值(从0开始)
      • forloop.revcounter:当前循环的倒叙索引值(从1开始)
      • forloop.revcounter0:当前循环的倒叙索引值(从0开始)
      • forloop.first:判断当前循环是不是第一次循环(返回布尔值)
      • forloop.last:判断当前循环是不是最后一次循环(返回布尔值)
      • forloop.parentloop:当前循环的外层循环
    • for...empty指定循环的对象为空时的值
        {% for i in list %}
            <p>{{ i.key }}</p>
        {% empty %}
            <p>当前无数据</p>
        {% endfor %}
    
  • if:针对一个条件进行判断,根据条件的真假来显示不同的内容

    • if条件判断支持的语法有:and、or、==、!=、>、<、>=、<=、in、not in、is、is not等判断语法
    • if...else格式
        {% if 条件判断 %}
            <p>{{ 条件判断为真时显示的内容 }}</p>
        {% else %}
            <p>{{ 条件判断为假时显示的内容 }}</p>
        {% endif %}
    
    • if...elif...else格式
        {% if 条件判断1 %}
            <p>{{ 条件判断1为真时显示的内容 }}</p>
        {% elif 条件判断2 %}
            <p>{{ 条件判断2为真时显示的内容 }}</p>
        {% else %}
            <p>{{ 条件判断为假时显示的内容 }}</p>
        {% endif %}
    
  • with:定义一个别名变量

    {% with var_tmp=class.0.attr %}
        <p>{{ var_tmp }}</p>
    {% endwith %}
  • csrf_token:用于跨站请求伪造的保护,随机为提交的form表单生成一段随机的加密字符串,跟随提交的数据一起传送给后端

    <form action='' method='post'>
        {% csrf_token %}
        ...
    </form>

自定义过滤器和标签

模板语言之母板

  • 描述:把模板内容中公共的部分创建一个骨架模板,包含站点中的所有标签元素,把可定义的部分使用blocks包起来。通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换

  • 继承母板:在子页面中的最上方使用extends来继承母板

    {% extends 'base.html' %}
  • 块:在母板中定义块名,可以在子页面中使用母板中定义的块名来对应替换母板中相应的内容

    {% block block_name %}
        ...
    {% endblock %}
  • 组件:把常用的页面内容保存在单独的文件中,在需要使用的地方使用include导入

    {% include 'public.html' %}
  • 静态文件动态导入:动态引入模版中静态文件的路径,无需不用手动指定

    {% load STATIC_NAME %}
    <img src="{% STATIC_NAME"images/img.jpg"%}" alt=""/>
  • 静态文件别名:把引入次数较多的静态文件,可以为其声明别名变量来存储,使用了别名之后,引入时需要使用变量的的语法的特殊符号

    {% load STATIC_JS %}
    {% STATIC_JS "js/myjs.js" as MYJS %}
    <script src="{{ MYJS }}"></script>
  • 使用get_static_prefix,直接获取和使用当前静态文件路径的名称:

    • 第一种:直接引入
        {% load STATIC_NAME %}
        <img src="{% get_static_prefix"images/img.jpg"%}" alt=""/>
    
    • 第二种:别名变量引入
        {% load STATIC_NAME %}
        {% load get_static_prefix as STATIC_PRE %}
        <img src="{{ STATIC_PRE }}images/img1.jpg" alt=""/>
        <img src="{{ STATIC_PRE }}images/img2.jpg" alt=""/>
    
posted @ 2018-01-18 22:16  _岩哥  阅读(179)  评论(0)    收藏  举报