Django 视图层

简介: Django 视图层

Django 视图层

Django 视图层的主要工作是衔接HTTP请求,Python程序 HTML模板等,

1.URL映射

URL分发(URL dispatcher)映射配置可以看作Django项目的入口配置,通过 URLdispatcher可以指定用户每一次访问的后台Python处理函数是什么。

1.普通URL映射

每个django项目都有一个urls.py文件用于维护URL dispatcher 对该文件的内容举例如下
from django.urls import path
from django.conf.urls import url
from . import views
urlpatterns = [
    path(r'year/2018',views.moments_2018),
    url(r'^year/([0-9]{4})/$',views.year_moments),
    url(r'^month/([0-9]{4})/([0-9]{2})$',views.month_moments),
    url(r'^single/([0-9]{4})/([0-9]{2})/([0-9]+)$',views.single),
]
"""
该文件通过维护 urlpatterns列表的元素完成URL映射每个元素可以是一个django.conf.urls.url()函数执行的结果,也就是django.urls.path()函数结果。两个函数的第一个参数是https路径,第二个参数是改路径被映射到的Python函数名 他们的区别在于url()函数的HTTP路径名是正则表达式,而path函数的HTTP路径是普通字符串
注意:从django2.0开始 django.conf.urls.url()是对django.urls.re_path()函数的简单封装,因此开发者也可以直接使用django.urls.re_path().出于兼容旧版本的django原因 下面继续使用url()
本例中维护了四个URL映射
第一个路径是一个严格路径 即只匹配[year/2018]。该路径调用的是views.py文件中的moments_2018()函数。
函数url()的路径用正则表达式定义  其中^意为以...开始   $  是以...结束 第二个url()匹配的路径是任何year/xxxx路径 其中要求xxxx是四位数字。其调用函数是views.py中的year_moments(requests,xxxx)
第三个和第四个url()解析方法与第二个相似只是有更多的路径变量,
"""

2 正则表达式

3 命名URL参数映射

在普通的url映射中,django将URL中的变量参数按照路径中的出现顺序传递给被调用函数。而命名参数使得开发者可以定义这些被传递参数的参数名称,命名URL参数的定义方式是 ?P<param_name>pattern
from django.conf.urls import url
from . import views
urlpatterns=[
url(r'^year/2018/$',views.moments_2018);
url(r'^year/?P<year>([0-9]{4})/$',views.year_moments);
url(r'^year/?P<year>([0-9]{4})/?P<month>([0-9]{2})/$',views.month_moments);
]
"""
本例中的后两个url()使用命名参数进行定义,他们调用views.py中的Python函数,调用方式分别为year_mements(request,year=xxxx),month_moments(request,year=xxxx,month=xx)
注意:当多个URL映射定义可以匹配同一个URL地址时,Django会选取 urlpatterns列表中的第一个匹配的元素,比如[year/2018]可以同时匹配第一个和第二个映射 但Django会针对给地址的访问调用函数moments_2018().
"""

4 分布式URL

在大型Django项目中,一个项目可能包含多个Django应用,而每个应用都有自己的URL映射规则。这时将所有的URL映射都保存在一个urls.py文件中就不利于网站的维护,所以django使用include()函数提供了分布式URL映射功能,使得URL映射可以被编写再多个urls.py文件中

在项目根映射文件djangosite/djangosite/urls.py中引用其他URL映射文件的示例代码如下

from django.conf.urls import url,include
urlpatterns=[
    url(r'^moments/',include("djangosite.app.ursl")),
    url(r'^admin/',include("djangosite.admin.ursl")),
]
"""
本例中两组url函数都进行了映射定义
以moments/开头的URL被转接到djangosite.app.urls包中,即djangosite/app/urls.py文件
以admins/开头的URL被转接到djangosite.admin.urls包中,即djangosite/admin/urls.py文件
"""

5 反向解析

6.带参数的反向解析

2 视图函数

视图函数是Django开发者处理HTTP请求的Python函数。在通常情况下,视图函数的功能是通过模型层对象处理数据,然后用如下方式中的一种返回HTTP Response

  • 直接构造HTTP Body
  • 用数据渲染HTML模板文件
  • 如果有逻辑错误 则返回HTTP错误或其他状态

1 直接构造HTML文件

对于一些简单的页面,可以直接在视图函数中构造返回给客户端字符串,通过HttpResponse()函数封装后返回

如下例子为返回当前服务器的时间给客户端:

from django.http import HttpResponse
import datetime
def current_datetime(request):
    now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return HttpResponse(now)

2 用数据渲染HTML模板文件

由于模板文件包含丰富的HTML内容,因此使用渲染模板文件的方法返回页面是最常见的一种django视图函数技术。模板渲染通过render()函数实现,举例如下

from django.shortcuts import render
from app.models import Moment
def detail(request,moment_id):
    m = Moment.objects.get(id=moment_id)
return render(request,'tempalte/moment.html',{'headline':m.headline,'user':m.user_name})
"""
函数 render() 的第一个参数是HTTP request 第二个参数是模板文件名,第三个参数是以字典的形式表达式的模板参数
"""

3 返回HTTP错误

HTTP 错误通过HTTP头中的Status表达,通过给HttpResponse够着函数传递status参数,可以返回HTTP错误状

from django.http import HttpResponse
def my_view(request):
return HttpResponse(status=404)
"""
t通过上述代码可返回HTTP404错误 即 PageNotFound 为了方便开发者 django对于常用的Status状态定义了若干HttpResponse的子类,开发者需要返回非200 OK状态时,也可直接通过这些子类定义Response,比如下面用HttpResponseNotFound子类的实例返回404错误
"""
from django.http import HttpResponseNotFound
def my_view(request):
return HttpResponseNotFound

其他一些常用的特定的状态HttpResponse子类如下。

  • HttpResponseRedirect:返回Status302 用于重定向,需要将重定向的目标地址作为参数传给该类
    技巧:HttpResponseRedirect的参数经常使用URL反向映射函数reverse()获得 这样可以避免在更改网站的urls.py内容的时候维护视图函数中的代码
  • HttpResponseNotModified:返回Status304 用于浏览器用其上次请求的缓存结果作为页面显示内容
  • HttpResponsePermanentRedirect:返回Status301,与HttpResponseRedirect类似 但是告诉浏览器这个是一个永久重定向。
  • HttpResponseBadRequest:返回Status404 请求内容错误
  • HttpResponseForbidden返回Status403禁止访问内容
  • HttpResponseNotAllowed 返回405 用不允许的方法 Get Post Head等 访问本页面
  • HttpResponseServerError:返回Status500 服务器内部错误,比如无法处理的异常等

3 模板语法

模板文件是一种文本文件,模板文件主要由目标文件的内容组成(比如HTML CSS等)辅以模板的特殊语法用于替

换动态的内容。下面是一个功能较全的典型模板文件

{% extends "base.html" %}
{% block title %}{{ section.title }} {% endblock %} {# 块内容,用于模板继承 #}
{% block content %}                                  {# 块内容,用于模板继承 #}
<h1>{{ section.title }}</h1>                        {# 变量替换 #}
{% for moment in moment_list %}                     {# 流程控制-for循环 #}
<h2>
    {{ moment.headline|upper }}                      {# 带过滤器的变量替换 #}
</h2>
{% endfor %}
{% endblock %}

1.变量的替换

2.过滤器

过滤器(filter)在模板中是放在变量后并用于控制变量显示格式的计数。变量与过滤器之间通过管道符号|链接 如下代码upper 过滤器应用在moment.headline django中常用的过滤器如下
  • add :给value加上一个数值{{ 128|add:5}}返回128
  • addslashes:单引号加上转义号
  • capfirst:第一个字母大写,比如{{ "goos"|capfirst }}返回Good
  • center:输出指定长度的字符串,把变量居中,比如{{ "abscd"|center:50 }}
  • cut: 删除指定字符串,比如 {{ "You are not a englishman"|cut:"not" }}
  • date: 格式化日期
  • default:如果值不存在,则使用默认值代替,比如{{ value|default:"(N/A)"}}
  • default_if_none:如果值为None,则使用默认值替代 使用方式与default类似
  • dictsort :按某字段排序,变量必须是一个dictionary
{% for moment in moments|dictsort:"id"%}
    *{{ moment.headline }}
{% endfor %}
"""
如上代码指定moments 用id字段排序后逐一进行headline输出
"""
  • dictsortreversed: 按某字段排序后倒序,变量必须是一个dictionary
  • divisibleby:判断是否可以被某数字整除
  • escape:按HTML转义 比如将"<"转换为"&lt" 将">"转换为"&gt"
  • filesizeformat:增加数字的可读性,结果转为 KB MB Bytes等
  • first:返回列表中的第一个元素,变量必须是一个列表 比如{{ ['english','Chinese','Jpanese']|first}}
  • floatformat:转换为指定精度的小数,默认保留1位小数
{{ 34.23234|floatformat }}  {# 34.2#}
{{ 34.23234|floatformat:3 }} {# 34.232 #}
{{ 34.23234|floatformat:4 }} {# 34.2323 #}
  • get_digit:从个位开始截取指定位置的数字 比如{{23456|get_digit:"1"}}返回6
  • join:用指定分隔符链接列表 比如 {{ ['abc','45']|join:'' }} 返回'abc45'
  • length:返回列表中元素的个数或字符串的长度
  • length_is:检查列表、字符串的长度是否符合指定的值,比如{{ "hello"|length_is:"3" }} 返回false
  • linebreaks:用或标记包裹变量,其中单独的行被替换为,空行前后被分割为
{{ "Hi\n\n David"|linebreaks }}  {# 返回<p>Hi</p> <p>David</p> #}
  • linebreaksbr:用标记代替换行符
  • linenumbers:为变量中的每一行加上行号
  • ljust:输出指定长度的字符串,变量左对齐,比如{{ "ab"|ljust:5 }} 返回"ab "
  • lower:字符串变换为小写,{{ "ABCD"|lower }}
  • make_list:将字符串转换为列表,比如{{ "abc"|make_list }} 返回['a','b','c']
  • pluralize:根据数字确定是否输出英文复数符号
you have{{ num_messages }} message{{ num_messages|pluralize }}.
"""
该过滤器将在num_messages d大于1的时候输出英文复数符号s
"""
  • random:返回列表随机一项
  • removetags:删除字符串中指定的HTML标记
{{ values|removetags:"h1 h2" }}
当value是"<h1>Good morning</h1><h3>David</h3>"时 该过滤器的输出为"Good morning <h3>David</h3>"
  • rjust:输出指定长度的字符串,变量右对齐。
  • slice:切片操作,即返回列表、字符串中的一部分 比如{{ [3,9,1]|slice:[:2]}} 返回[3,9]
  • slugify:在字符串中留下减号和下划线,其他符号删除,空格用减号替换
  • stringformat:字符串格式化,使用Python字符串格式化语法
  • time:返回日期的时间部分
  • timesince:以"到现在为止过了多长时间"的形式显示时间变量,可能的结果格式如45days 3hours等
  • timeutil:与timesince类似,但是比较的是当前时间与之后的某个时间
  • title:每个单词的首字母大写
  • truncatewords:将字符串转换为省略表达方式,传入参数表达保留的单词个数, 比如{{"this is a lovely cat"|truncatewords:"3" }} 返回"this is a..."
  • truncatwords_html:与truncatewords类似,但是保留其中的HTML标签,比如{{ "This is a lovely cat
    " | truncatewords_html:"3" }} 返回的是"This is a...
    "
  • upper:转换为全部大写形式
  • urlencode:将字符串中的特殊字符转换为URL兼容表达方式
{{ "http://www.example.org/foo?a=b&c=d"|urlencode }
"""返回https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd
"""
  • urlize:将变量字符串中的URL由纯文本变为可点击的链接
{{ "点击 www.django.com"|urlize }}
"""
"点击<a href="http://www.django.com" rel="nofollow">www.django.com</a>"
"""
  • wordcount:返回变量字符串中的单词数目
  • yesno:将不二变量转换为字符串中的yes no 或者maybe 也可以在参数中指定变换的结果
{{ true|yesno:"yes,no,perhaps"}}{# 返回yes #}
{{ false|yesno }}               {# 返回no#}
{{ None|yesno:"yes,no,perhaps" }}{# 返回perhaps#}

3.流程控制

4.模板继承

目录
相关文章
|
4月前
|
XML 前端开发 JavaScript
Python 教程之 Django(5)视图基础
Python 教程之 Django(5)视图基础
39 1
|
5月前
|
Python
05 Django入门 - 视图(介绍)
05 Django入门 - 视图(介绍)
26 0
|
3月前
|
Shell 数据库 Python
Python 教程之 Django(6)视图类型
Python 教程之 Django(6)视图类型
21 0
Python 教程之 Django(6)视图类型
|
3月前
|
XML 前端开发 JavaScript
Python 教程之 Django(5)视图基础
Python 教程之 Django(5)视图基础
28 1
Python 教程之 Django(5)视图基础
|
8月前
|
XML JSON 安全
django -- 视图
django -- 视图
|
8月前
|
XML 中间件 数据格式
Django 高级指南:深入理解和使用类视图和中间件
Django 是一款强大的 Python Web 框架,它提供了一套完整的解决方案,让我们能够用 Python 语言快速开发和部署复杂的 Web 应用。在本文中,我们将会深入研究 Django 中的两个高级特性:类视图(Class-Based Views)和中间件(Middleware)。
|
4月前
|
Shell 数据库 Python
Python 教程之 Django(6)视图类型
Python 教程之 Django(6)视图类型
35 0
|
4月前
|
Shell 数据库 Python
删除视图——基于函数的视图 Django
删除视图——基于函数的视图 Django
22 0
|
4月前
|
Shell 数据库 Python
更新视图——基于函数的视图 Django
更新视图——基于函数的视图 Django
24 0
|
4月前
|
Shell 数据库 Python
详细视图——基于函数的视图 Django
详细视图——基于函数的视图 Django
18 0