MTV框架之VIew(业务控制器)

关注公众号“轻松学编程”了解更多。

1、什么是视图

  • 视图层=路由表(urls.py)+视图函数(views.py)
  • 其角色相当于MVC中的Controller
  • 其职能是协调models和Template的关系,并解除其耦合
  • 过程
    • 路由表接收用户请求,并分配给相应的视图函数进行处理
    • 视图函数调用模型(数据库)获取数据
    • 视图函数将数据交给模板渲染
    • 视图函数将渲染结果返回给客户端

2、路由定义

  • 定义路由响应函数

    • url(r’^hehe/(\d+)/’, views.hehe_user, name=‘hehe’)

      • 将指定路由交由指定函数进行处理
      • 当前函数被命名为’hehe’
    • url(r’^app/’,include(‘App.urls’,namespace=‘appns’))
  • 将特定路由派发给子路由表
    • url(r’^app/’, include(‘App.urls’, namespace=‘app’))

      • 将所有/app/xxx派发给App下的urls.py处理
      • namespace=‘app’
        • 上述子路由表被命名为’app’
  • 【反向解析】=得到【指定路由表中的指定函数】对应的路由

3、路由参数

  • 普通参数规则

    • 在url匹配规则中使用括号
    • url规则中有多少括号,request参数后就要有多少参数
    • 一一对应,按位置对应(位置参数)
    • 写法(正则)
  • 普通参数示例

    • url(r’^hehe/(\d+)/’, views.hehe_user, name=‘hehe’)
    • def hehe_user(request, user_id):
  • 关键字参数规则

    • 关键字参数 (?P\正则 ) ,P代表params
    • 需要和视图函数的参数 (year),按照名称匹配
  • 关键字参数示例

    • url(r'^getdate/(?P<month>\d+)/(?P<day>\d+)/(?P<year>\d+)', views.get_date, name='getdate')
      
    • def get_date(request, year, month, day)
      
  • 反向解析路径

    • 模板中

      • {% url ‘namespace:name’ value1 value2 …%}
      • {% url ‘namespace:name’ key=value key=value …%}
    • 视图中
      • reverse(‘namespace:name’, args=(value1,value2…))
      • reverse(‘namespace:name’, kwargs={key:value, key: value})

4、发起请求

  • 直接声明url

    • <a href="/go/hello/">hello world</a>
      
    • <a href="/getdate/3/30/2018/">获取时间</a>
      
  • 反向解析获得url

    • <a href="{% url 'hello:helloWorld' %}">hello World</a>
      
      • urls.py中namespace=‘hello’
      • app中的urls.py中name=‘helloWorld’
    • <a href="{% url 'two:hehe' 17951 %}">链接</a>
      
      • namespace='two’的那个urls.py
      • 上述urls.py中定义的name='hehe’的那个响应函数
      • 路径参数为17951
      • 最终url形如:/two/hehe/17951/
    • <a href="{% url 'two:getdate' year=2018 month=3 day=31 %}">跳转</a>
      
      • namespace='two’的那个urls.py
      • 上述urls.py中定义的name='getdate’的那个响应函数
      • getdate这个响应函数中定义了三个参数:year,month,date
      • 三个路径参数分别为: year=2018 month=3 day=31
      • 最终url形如:/two/getdate/2018/3/31/

5、返回响应

  • 渲染页面并返回

    • return HttpResponse(result)
      
      • 以HttpResponse形式返回渲染结果
    • return HttpResponse("<h1>HelloWorld</h1>")
      
      • 直接在响应中给页面内容
    • return render(request, 'Hello.html')
      
      • 直接返回渲染结果
    • return render(request, 'AnimalList.html', context={"animals": animals, "data": data_dict})
      
      • 渲染模板时传递数据
  • 请求重定向

    return HttpResponseRedirect("/four/wahaha")
    return HttpResponseRedirect("/four/getdate/4/1/2018/")
    return HttpResponseRedirect(reverse("two:haha"))
    return HttpResponseRedirect(reverse("two:getdate", kwargs={"year":"2019","month":"11", "day":"11"}))
    return redirect(reverse("axf:user_login"))
    
  • 返回JSON数据

    • return JsonResponse({“msg”: “ok”, “status”: “200”, “data”: “精神一下”})
    • 用途
      • 响应前端AJAX请求
      • 为移动端APP返回数据

6、Request对象

  • 请求对象
  • 视图函数中的第一个参数
  • 是由Django框架根据用户的请求信息,为开发者自动创建的一个对象
  • 包含了请求的所有信息
    • path
    • method
    • encoding
    • GET
    • POST
    • FILES
    • COOKIES
    • session
    • is_ajax
    • META
  • 用法举例
    • user_id = request.session.get(“user_id”)
    • request.session[“user_id”] = user.id
    • if request.method == “GET”:
    • goodsid = request.GET.get(“goodsid”,None)
      • 获得请求数据
    • username = request.POST.get(“username”,None)
      • 获取表单数据
    • icon = request.FILES.get(“icon”)
      • 获取上传的文件位置,类型是字符串
    • request.session.flush()
      • 清空session
6.1 META请求元信息

request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版本号)。 注意,Header信息的完整列表取决于用户所发送的Header信息和服务器端设置的Header信息。 这个字典中几个常见的键值有:

HTTP_REFERER,进站前链接网页,如果有的话。 (请注意,它是REFERRER的笔误。)
HTTP_USER_AGENT,用户浏览器的user-agent字符串,如果有的话。 例如: “Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17” .
REMOTE_ADDR 客户端IP,如:“12.345.67.89” 。(如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如:“12.345.67.89,23.456.78.90” 。)
……
因为 request.META 是一个普通的Python字典,因此当你试图访问一个不存在的键时,会触发一个KeyError异常。 (HTTP header信息是由用户的浏览器所提交的、不应该给予信任的“额外”数据,因此你总是应该好好设计你的应用以便当一个特定的Header数据不存在时,给出一个优雅的回应。)你应该用 try/except 语句,或者用Python字典的 get() 方法来处理这些“可能不存在的键”。

#META是一个字典类型,可以获取
def test(request):print('request', request)rm = request.METAprint(type(rm))dictData = {'dictData': rm}return render(request, 'test.html', context=dictData)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{#输出META信息#}
<ul>{% for k,v in dictData.items %}<li>{{ k }}={{ v }}</li>{% endfor %}</ul>
</body>
</html>

7、Response对象

  • 响应对象
  • 由开发者自己创建
  • 服务器和客户端交流的方式
  • 分类
    • HttpResponse

      • render
    • HttpResponseRedirect
      • redirect
    • JsonResponse
  • 属性和方法
    • content
    • charset
    • status_code
    • content-type
      • text/html
      • image/jpeg
    • write()
    • flush()
      • 将缓冲区的内容推到response.content中

8、错误页面定制

  • 关闭DEBUG模式
  • ALLOWED_HOSTS=[’*’]
  • 想要覆盖哪个错误,就书写相应的HTML
    • 404.html
    • 502.html

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

python框架Django中MTV框架之VIew(业务控制器)相关推荐

  1. Django的MTV框架基础

    ----Model:数据---- 1.连接MySQL数据库(settings.py设置范例): # 配置数据库 DATABASES = {'default': {# 数据库引擎'ENGINE': 'd ...

  2. python框架django入门_web框架之Django(python3入门)

    -ORM ORM是什么? 不是django独有或者python独有的 对象关系映射 python中主流的几个ORM框架 django的orm(django已经封装好了,必须在django中使用) sq ...

  3. python什么时候用框架_Python 中三大框架各自的应用场景

    Django: 主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过 10000, 如果要实现高并发的话,就要对 django 进行二次开发,比如把整个笨重的框架给拆掉,自己写 s ...

  4. django mysql connector,MySQL Connector / python在Django中不起作用

    我正在学习以MySQL为后端的Django. 我安装了Oracle的mysql连接器以与mysql连接. 但是,当我运行python manage.py时,出现此错误 Traceback (most ...

  5. java struts 框架_java中struts 框架的实现

    该文章主要简单粗暴的实现了struts的请求转发功能. 其他的功能后续会慢慢补上. 最近在学习javassist的内容,看到一篇文章  大家一起写mvc  主要简单的描述了mvc的工作流程,同时实现了 ...

  6. python和django中的常见错误

    int() argument must be a string or a number, not 'tuple' Error in formatting: coercing to Unicode: n ...

  7. 使用python框架Django搭建web应用

    一.Django简介 1. web框架介绍 具体介绍Django之前,必须先介绍Web框架的概念. Web框架: 别人已经设定好的一个Web网站模板,你学习它的规则,然后"填空"或 ...

  8. python框架django书籍_有Python基础,刚接触web框架的Django初学者。

    本文面向:有Python基础,刚接触web框架的Django初学者. 环境:windows7 python3.5.1 pycharm Django 1.10版 pip3 一.Django简介 百度百科 ...

  9. Django之web框架的本质

    web框架的本质及自定义web框架 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应, ...

最新文章

  1. 网管日志-06.09.08
  2. 【Scratch】青少年蓝桥杯_每日一题_3.17_蹦床
  3. java for循环_愉快地学Java语言:第五章 循环
  4. Http与WWW服务精解
  5. 《白鹿原》金句摘抄(七)
  6. Spring Retry 重试机制实现及原理
  7. python网络爬虫系列(0)——爬虫概述 http协议复习
  8. 苹果一键越狱工具_最新苹果越狱工具现世,可越狱所有iOS版本!
  9. forager有多少个机器人_诠视科技:VSLAM技术进展让移动机器人自主行驶有了更广阔的空间...
  10. 语法分析程序的设计与实现_编译工程7:语法分析(5)
  11. IDF 实验室 初探乾坤
  12. mysql sharding 知乎_分库分表系列(1)-shardingsphere核心概念
  13. WordPress我安装成功了,容易!
  14. 机械硬盘低级格式化软件_万能硬盘低格工具(支持所有IDE、SATA、移动硬盘)
  15. html状态码206,http状态码204/206/200理解
  16. 如何通俗的解释全微分?
  17. C/C++探秘(1)
  18. 数据恢复软件如何恢复电脑删除的文件
  19. native vlan设置错误导致无法访问的问题排查过程
  20. 向量的夹角余弦公式_两个向量的夹角的余弦值怎么求过程!! – 手机爱问

热门文章

  1. 江苏十二月份有计算机二级考试吗,2021年3月江苏计算机二级报名时间|网上报名入口【12月28日开通】...
  2. 神州数码交换机等设备如何与CRT连接
  3. 使用ChatGPT练习英语口语,用AI帮你设计场景练习
  4. 中国塑料加工工业协会已被法院列为老赖
  5. 计算几何学 | 逆时针方向 | Counter-Clockwise | C/C++实现
  6. windows找不到文件cmd?windows找不到文件cmd的解决办法
  7. 本地化Microsoft ReportViewer
  8. androidAPP 接入微信/支付宝支付,获取应用的签名(随笔)
  9. 【Android开发】范例2-开启新线程实现电子广告牌
  10. template标签用法(含vue-template的用法)