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.META
print(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. python框架Django中MTV框架之Template(模板/界面)

    MTV框架之Template(模板/界面) 关注公众号"轻松学编程"了解更多. 1.模板目录位置 应用下 不需要注册 无法跨应用地进行复用 工程下 需要注册 settings.py ...

  2. python框架Django中MTV之Model(数据模型)

    MTV框架之Model(数据模型) 关注公众号"轻松学编程"了解更多. 1.连接MySQL数据库 项目中的settings.py设置范例 # 配置数据库 DATABASES = { ...

  3. 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用

    写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...

  4. python框架Django中的MTV架构

    MTV架构 关注公众号"轻松学编程"了解更多. ​ 通过V对M和T进行连接,用户通过T(界面)对服务器进行访问(发送请求),T把请求传给V(调度),V调用M(数据模型)获取数据,把 ...

  5. python框架django中结合vue进行前后端分离

    一:创建django项目 1.django-admin startproject mysite # 创建mysite项目 2.django-admin startapp app01# 创建app01应 ...

  6. 测试开发之Django——No4.Django中前端框架的配置与添加

    我们在开发一个web项目的时候,虽然我们不是专业开发,但是我们也想要做出来一个美美的前端页面. 这种时候,百度上铺天盖地的前端框架就是我们的最好选择了. 当然,在网上直接下载的框架,我们是不能直接用的 ...

  7. Python—在Django中使用Celery

    一.Django中的请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下: http请求发起 经过中间件 http handling(request解析) ur ...

  8. python django中restful框架的使用

    在使用django进行前后台分离开发时通常会搭配django-rest-framework框架创建RESTful风格的接口API.框架介绍及版本要求可参考官方地址:https://www.django ...

  9. 在python的web框架Django中使用SQL Server

    在pycharm中安装 安装pyodbc和Django——pyodbc是一个用python写的ODBC引擎 安装Django-pyodbc-azure                  在后方网址中查 ...

随机推荐

  1. Apache HTTP Server 2.2.34安装

    Windows 下载 安装方式有自己编译源码和下载别人编译好的,这里选择从第三方下载,官网地址http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/bin ...

  2. Python练习题 017:三支乒乓球队出赛名单

    [Python练习题 017] 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比.请编程序找 ...

  3. Python练习题 013:求解a+aa+aaa……

    [Python练习题 013] 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入. 这题倒也 ...

  4. IDEA2020版最佳优化思路(中文界面)

    IDEA优化 基于当前最新版idea 2020.1版本进行设置 设置中文 在idea 2020.1版本后官方是支持中文啦 先上效果图 设置方法 这里需要下载官方的中文包 鼠标悬停提示 效果图 设置方法 ...

  5. 注册表“CLSID”下面的“InprocServer32”子键是什么?

    这个键值有什么用?每个CLSID下基本都有,即使没有其它项也会有此项.谁能详细说下,"InprocServer32"子键起什么作用?谢了. 刚好遇到这问题了,这是我找到的:Inpr ...

  6. 2020我终于成功搭建了Metasploitable3靶机

    0x00前言 在学习metasploit时我们往往需要一个靶场,下面为大家介绍一下如何在虚拟机中安装metasploitable 3靶场.Metasploitable3是Metasploitable2 ...

  7. This is Riv3r1and.

    总是要弄个博客来搞的嘛.

  8. 008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字

    008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字 关键字 关键字就是一些有特殊意义的词 之前学习的程序中涉及到的关键字 Java中 ...

  9. lens distortion

    来源:http://michel.thoby.free.fr/Fisheye_history_short/International_Standards_about_Distortion.html H ...

  10. Java (一)下载APACHE Commons IO

    一,进入APACHE的官网,在首页往下找APACHE PROJECT LIST > Commons,点击进入. 二,进入Apache Commons页面,找IO组件,点击进入. 三.点击链接Do ...