《玩转Django2.0》读书笔记-探究视图

                                       作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  视图(View)是Django的MTV架构模式的V部分,主要负责处理用户请求和生成相应的响应内容,然后在页面或其他类型文档中显示。也可以理解为视图是MVC架构里面的C部分(控制器),主要处理功能和业务上的逻辑。

一.构建网页内容

1>.视图函数的retrurn的多种响应类型

  在上一个篇博客里我们看到视图函数都是通过return方式返回数据内容的,然后生成响应的网页内容呈现在浏览器上。而视图函数的retrurn具有多种响应类型,如下所示:

2>.使用django.http模板实现文件下载案例

  响应类型代表HTTP状态吗,其核心作用是Web Server服务器用来告诉客户端当前的网页请求发生了什么事,或者当前Web服务器的响应状态。上述响应主要来自模板django.http,该模块是实现响应功能的核心。在实际开发中,可以使用该模板实现文件下载功能,在index的urls.py和views.py中分别添加以下代码:

  1. #!/usr/bin/env python3
  2. #_*_coding:utf-8_*_
  3. #@author :yinzhengjie
  4. #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
  5. #EMAIL:y1053419035@qq.com
  6.  
  7. from django.urls import path,re_path #导入URL编写模块,path只是普通的URL定义,而re_path则支持正则表达式
  8. from . import views #导入当前目录(该文件存放的同一目录)下的views.py文件
  9.  
  10. '''
  11. urlpatterns:
  12. 整个项目的URL集合,每个元素代表一条URL信息。
  13.  
  14. path('', views.index):
  15. URL为空,代表为网站的域名,即“http://127.0.0.1:8000/”,通常是网站的首页;还寄给上面我们导入了“views”这个文件吗?
  16. 该文件用于编写视图函数,处理URL请求信息并返回网页给用户。“views.index”表示我们调用了views文件中的index函数(换句话说,当
  17. 用户访问首页是,就会触发“views.index”函数的执行)。因此我们在这里指定后,需要在“views”这个文件里编写对应的“index”函数。
  18.  
  19. path('download.html',views.download):
  20. 当用户在浏览器输入:“http://127.0.0.1:8000/download.html”,就会调用views.download函数。
  21. '''
  22. urlpatterns = [
  23. path('', views.index),
  24. path('download.html',views.download)
  25. ]

index下的urls.py文件内容

  1. #!/usr/bin/env python3
  2. #_*_coding:utf-8_*_
  3. #@author :yinzhengjie
  4. #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
  5. #EMAIL:y1053419035@qq.com
  6.  
  7. from django.http import HttpResponse #用于给用户响应信息。
  8. import csv
  9.  
  10. '''
  11. index函数必须设置参数request,该参数代表当前用户的请求对象,该对象包含用户名,请求内容和请求方式等信息,视图函数
  12. 执行完成后必须使用return将处理结果返回,否则程序会抛出异常信息。
  13. '''
  14. def index(request):
  15. return HttpResponse("尹正杰到此一游!")
  16.  
  17. '''
  18. download(request):
  19. 文件下载功能说明如下:
  20. 1>.接收到用户的请求后,视图函数download首先定义HTTPResponse的响应类型为文件类型('text/csv'),生成response对象。
  21. 2>.然后在response对象上定义Content-Disposition,设置浏览器下载文件的名称。attachment设置文件的下载方式,filename为文件名称
  22. 3>.最后使用CSV模板加载response对象,把数据写入response对象所设置的CSV文件并将response对象返回到浏览器上,从而实现实现文件下载。
  23. '''
  24. def download(request):
  25. response = HttpResponse(content_type='text/csv')
  26. response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
  27. writer = csv.writer(response)
  28. writer.writerow(['First row', 'A', 'B', 'C'])
  29. return response

index下的views.py文件内容

  在浏览器输入:“http://127.0.0.1:8000/download.html”,运行结果如下:

  查看下载后的文件内容如下:

3>. render参数的介绍

  django.http 除了实现文件下载之外,要使用该模板生成精美的HTML网页,可以在响应内容中编写HTML源码,如HttpResponse('<html><body>...</body></html>')。尽管这是一种可行的方法,但并不符合实际开发。因此Django在django.http模板上进行封装,从而有了render(),render_to_response()和redirect()函数。

  render()和render_to_response()实现的功能是一致的。render_to_response()自2.0版本以来已开始被弃用,并不代表2.0版本无法使用,只是大部分开发者都使用render()。因此,本片博客只对render()进行讲解,render()的语法如下:

  render(request,template_name,context=None,content_type=None,status =None,using=None)

  函数render()的参数request和template_name是必须参数,其余的参数是可选参数。各个参数说明如下:

  1. request
  2. 浏览器向服务器发送的请求对象,包含用户信息,请求内容和请求方式等。
  3.  
  4. template_name:
  5. HTML模板文件名,用于生成HTML网页。
  6.  
  7. context
  8. HTML模板的变量赋值,以字典格式表示,默认情况下是一个空字典。
  9.  
  10. context_type:
  11. 响应数据的数据格式,一般情况下使用默认值即可。
  12.  
  13. status
  14. HTTP状态码,默认为200
  15.  
  16. using
  17. 设置HTML模板转换生成HTML网页的模板引擎。

二.数据可视化

  视图除了接受用户请求和返回响应内容之外,还可以与模型(Model)实现数据交互(操作数据库)。视图相当于一个处理中心,负责接受用户请求,然后根据请求信息读取并处理后台数据,最后生成HTML网页返回给用户。

  视图操作数据实质就是models.py导入数据库映射对象,models.py的数据库对象是通过Django内置的ORM框架构建数据库映射的,从而生成数据库对象(数据库对象的实现过程我会在第六篇读书笔记分享)。我们在index的models.py中编写一下代码:

  1. #!/usr/bin/env python3
  2. #_*_coding:utf-8_*_
  3. #@author :yinzhengjie
  4. #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
  5. #EMAIL:y1053419035@qq.com
  6.  
  7. from django.db import models
  8. # Create your models here.
  9. class Product(models.Model):
  10. id = models.IntegerField(primary_key=True)
  11. name = models.CharField(max_length=50)
  12. type = models.CharField(max_length=20)

  上述代码将Product类和数据表Product构成映射关系,代码只是搭建两者的关系,在数据库中没有生成响应的数据表。我们在CMD窗口中是使用 “python manage.py xxx”指令通过Product类创建数据表Product,创建指令如下:

  1. Microsoft Windows [版本 6.1.7601]
  2. 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
  3.  
  4. C:\Users\yinzhengjie\softwares\PycharmProject\MyWeb>python manage.py makemigrations
  5. Migrations for 'index':
  6. index\migrations\0001_initial.py
  7. - Create model Product
  8.  
  9. C:\Users\yinzhengjie\softwares\PycharmProject\MyWeb>

C:\Users\yinzhengjie\softwares\PycharmProject\MyWeb>python manage.py makemigrations          #根据models.py生成相关的.py文件,该文件用于创建数据表

  1. C:\Users\yinzhengjie\softwares\PycharmProject\MyWeb>python manage.py migrate
  2. Operations to perform:
  3. Apply all migrations: admin, auth, contenttypes, index, sessions
  4. Running migrations:
  5. Applying contenttypes.0001_initial... OK
  6. Applying auth.0001_initial... OK
  7. Applying admin.0001_initial... OK
  8. Applying admin.0002_logentry_remove_auto_add... OK
  9. Applying admin.0003_logentry_add_action_flag_choices... OK
  10. Applying contenttypes.0002_remove_content_type_name... OK
  11. Applying auth.0002_alter_permission_name_max_length... OK
  12. Applying auth.0003_alter_user_email_max_length... OK
  13. Applying auth.0004_alter_user_username_opts... OK
  14. Applying auth.0005_alter_user_last_login_null... OK
  15. Applying auth.0006_require_contenttypes_0002... OK
  16. Applying auth.0007_alter_validators_add_error_messages... OK
  17. Applying auth.0008_alter_user_username_max_length... OK
  18. Applying auth.0009_alter_user_last_name_max_length... OK
  19. Applying index.0001_initial... OK
  20. Applying sessions.0001_initial... OK
  21.  
  22. C:\Users\yinzhengjie\softwares\PycharmProject\MyWeb>
  23. C:\Users\yinzhengjie\softwares\PycharmProject\MyWeb>

C:\Users\yinzhengjie\softwares\PycharmProject\MyWeb>python manage.py migrate              #创建数据表

  执行之后,我们可以查看“yinzhengjie”数据库多出了很多数据表文件,如下:

  从上图可以看到,当指令执行完成后,Django会默认创建多个数据表,其中数据表“index_product”对应的models.py所定义的Product类,其余的数据表都是Django内置的功能所生成的,主要用于Admin站点,用户认证和Session会话等功能。使用mysql链接工具,在数据表“index_product”中添加如下图所示的数据:

  完成数据表的数据添加之后,接着将数据表的数据展现在网页上。首先将模板文件index.html左侧导航栏代码注释掉,然后在同一位置添加Django的模板语法,代码如下:

  1. <!-- banner 广告 注释代码 -->
  2. <div id="banner">
  3. {# <ul id="cate_box" class="lf">#}
  4. {# <li>#}
  5. {# <h3><a href="#">手机</a></h3>#}
  6. {# <p><span>荣耀</span><span>畅玩</span><span>华为</span><span>Mate/P系列</span></p>#}
  7. {# </li>#}
  8. {# <li>#}
  9. {# <h3><a href="#">平板 & 穿戴</a></h3>#}
  10. {# <p><span>平板电脑 </span><span>手环</span><span>手表</span></p>#}
  11. {# </li>#}
  12. {# </ul>#}
  13.  
  14. <!-- 添加Django独有的模板语法 -->
  15. <ul id="cate_box" class="lf">
  16. {% for type in type_list %}
  17. <li>
  18. <h3><a href="#">{{ type.type }}</a></h3>
  19. <p>
  20. {% for name in name_list %}
  21. {% if name.type == type.type %}
  22. <span>{{ name.name }}</span>
  23. {% endif %}
  24. {% endfor %}
  25. </p>
  26. </li>
  27. {% endfor %}
  28. </ul>

  新添加的代码是Django的模板语法,主要将视图的变量传递给模板,通过模板引擎转换成HTMLL语言。上述代码使用循环和判断语句对变量进行分析处理,具体的模板语法会在后续的章节中讲解。最后在视图函数中编写代码,将数据表的数据与模板链接起来,实现数据可视化,代码如下:

  1. '''
  2. type_list:
  3. 用于查询数据表字段type的数据并将数据去重。
  4. name_list:
  5. 用于查询数据比较字段type和name的全部数据,这两种独特的查询方式都是由Django内置的ORM框架提供的。
  6. return render(request, 'index.html',context=context, status=200)
  7. request:
  8. 浏览器向服务器发送的请求对象,包含用户信息,请求内容和请求方式等。
  9. 'index.html':
  10. HTML模板文件名,用于生成HTML网页。
  11. context=context:
  12. 对HTML模板的变量赋值,以字典格式表示,默认情况下是一个空字典。
  13. status:
  14. HTTP状态码,默认为200。
  15.  
  16. 从视图函数的context={'title':'首页'}可知,将index.html的模板变量title的值设置为首页,返回状态码是200.
  17. '''
  18. def index(request):
  19. type_list = Product.objects.values('type').distinct()
  20. name_list = Product.objects.values('name','type')
  21. context = {'title': '首页', 'type_list': type_list, 'name_list': name_list}
  22. return render(request, 'index.html',context=context, status=200)

  上述代码中,视图函数index的处理流程如下:

    第一:type_list用于查询数据表字段type的数据并将数据去重,name_list用于查询数据表字段type和name的全部数据,这两种独特的查询方式都是由Django内置的ORM框架提供。

    第二:将查询所得的数据以字典的数据格式写入context中,变量context是render()函数的参数值,其作用是将变量传递给HTML模板。

    第三:当HTML模板接受到变量type_list和name_list后,模板引擎解析模板语法并生成HTML文件。

  接着为我们启动项目,在浏览器输入“http://127.0.0.1:8000/”,运行结果如下所示:

  从上述例子可以看到,如果想要将数据库的数据展现在网页上,需要由视图,模型和模板共同实现,实现步骤如下:

    第一:定义数据模型,以类的方式定义数据表的字段。在数据库创建数据表时,数据表模型定义的类生成。

    第二:在视图导入模型所定义的类,该类也称为数据表对象,Django为数据表对象提供独有的数据操作方法,可以实现数据库操作,从而获取数据表的数据。

    第三:视图函数获取数据后,将数据以字典,列表或者对象的方式传递给HTML模板,并由模板引擎接受和解析,最后生成响应的HTML网页。

 

《玩转Django2.0》读书笔记-探究视图的更多相关文章

  1. <玩转Django2.0>读书笔记:URL规则和视图

    1. 带变量的URL #urls.py from django.urls import path from .view import * urlpatterns = [ path('',index_v ...

  2. <玩转Django2.0>读书笔记:表单

    1. 表单字段 参考: 官方文档 Django表单字段汇总 2. 表单代码示例(forms.Form) # form.py代码 # 获取数据库数据 choices_list = [(i+1,v['ty ...

  3. <玩转Django2.0>读书笔记:模板和模型

    1. 模板内置标签 Django常用内置标签 标签 描述 {% for %} 遍历输出变量的内容 {% if %} 对变量进行条件判断 {% csrf_token %} 生成csrf_token标签, ...

  4. <玩转Django2.0>读书笔记:邮件和分页

    1. 发送邮件 # settings.py设置 # 邮箱设置 EMAIL_USE_SSL = True # 邮件服务器 EMAIL_HOST = 'smtp.qq.com' # 邮件服务端口 EMAI ...

  5. 《玩转Django2.0》读书笔记-编写URL规则

    <玩转Django2.0>读书笔记-编写URL规则 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. URL(Uniform Resource Locator,统一资源定位 ...

  6. 《玩转Django2.0》读书笔记-Django建站基础

    <玩转Django2.0>读书笔记-Django建站基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.网站的定义及组成 网站(Website)是指在因特网上根据一 ...

  7. 《玩转Django2.0》读书笔记-Django配置信息

    <玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...

  8. 玩转 Django2.0 笔记1

    模板静态  路由 urls.py urlpatterns = [ path("<year>/<int:month>/<slug:day>",my ...

  9. vue2.0读书笔记3 - router、vuex

    1.vue的应用场景.优势.劣势 优势 通常情况下,运行时效率更高:一个事件循环仅一次视图更新,无频繁的DOM操作: 数据与视图分离,通过管理数据流,控制页面的展现,便于维护.且高效: 数据双向绑定, ...

随机推荐

  1. 在 Activity 中实现 getContentView 操作

    2017/9/8 17:17:03   前言     最近接到个需要优化Android原生系统设置APK的任务.这个任务里面有一个更换应用背景图片的需求.我手里的这个设备是一个平板设备,使用了一下这个 ...

  2. python深度学习库keras——安装

    TensorFlow安装keras需要在TensorFlow之上才能运行.所以这里安装TensorFlow.TensorFlow需要vs2015环境,需要wein64位环境,所以32位的小伙伴需要升级 ...

  3. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  4. Android环境搭建(大学授课课件)

    前面一直没有提过如何搭建Android开发环境,其实这些网上一大堆,随便一搜就是很多大神的详细介绍.本人过于懒惰,拿出大学授课课件供大家参考.非原创 位)   下载地址: sdk:http://pan ...

  5. Hard Life UVA - 1389(最大密度子图 输出点集)

    题意: rt 解析: 我用的第二种方法... s向所有的边连权值为1的边 所有的点向t连权值为mid的边 如果存在u -  > v  则边向u和v分别连一条权值为INF的边 二分mid 用dfs ...

  6. Bomb Game HDU - 3622(二分最小值最大化)

    题意: 就是给出n对坐标,每对只能选一个,以选出来的点为圆心,半径自定义,画圆,而这些圆不能覆盖,求半径最小的圆的最大值 解析: 看到最x值最x化,那二分变为判定性问题,然后...然后我就没想到... ...

  7. Quartus prime 16.0 中通过JTAG固化程序

    前言 下载项目sof文件到开发板中,掉电后会消失:由于开发板有JTAG口,则可以用JTAG固化jic文件到EPCS16芯片中. 流程 1.打开quartus软件并打开convert programmi ...

  8. bzoj 3631 松鼠的新家 (树链剖分)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3631 思路: 直接用树链剖分求每一次运动,因为这道题只需要区间增添,单点求值,没必要用线段 ...

  9. Google Apps的单点登录-谷歌使用的单点登录

    简述: Customer :客户 Google:谷歌 Identity Provider:身份提供者安全断言标记语言(英语:Security Assertion Markup Language,简称S ...

  10. MT【267】第一次很重要

    \begin{equation*}\textbf{已知}x_1,x_2<\pi,x_{n+1}=x_n+\left\{ \begin{aligned} sin x_n &,x_n> ...