python框架Django中MTV框架之VIew(业务控制器)
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’^hehe/(\d+)/’, views.hehe_user, name=‘hehe’)
- 将特定路由派发给子路由表
- url(r’^app/’, include(‘App.urls’, namespace=‘app’))
- 将所有/app/xxx派发给App下的urls.py处理
- namespace=‘app’
- 上述子路由表被命名为’app’
- url(r’^app/’, include(‘App.urls’, namespace=‘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
- HttpResponse
- 属性和方法
- 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(业务控制器)的更多相关文章
- python框架Django中MTV框架之Template(模板/界面)
MTV框架之Template(模板/界面) 关注公众号"轻松学编程"了解更多. 1.模板目录位置 应用下 不需要注册 无法跨应用地进行复用 工程下 需要注册 settings.py ...
- python框架Django中MTV之Model(数据模型)
MTV框架之Model(数据模型) 关注公众号"轻松学编程"了解更多. 1.连接MySQL数据库 项目中的settings.py设置范例 # 配置数据库 DATABASES = { ...
- 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用
写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...
- python框架Django中的MTV架构
MTV架构 关注公众号"轻松学编程"了解更多. 通过V对M和T进行连接,用户通过T(界面)对服务器进行访问(发送请求),T把请求传给V(调度),V调用M(数据模型)获取数据,把 ...
- python框架django中结合vue进行前后端分离
一:创建django项目 1.django-admin startproject mysite # 创建mysite项目 2.django-admin startapp app01# 创建app01应 ...
- 测试开发之Django——No4.Django中前端框架的配置与添加
我们在开发一个web项目的时候,虽然我们不是专业开发,但是我们也想要做出来一个美美的前端页面. 这种时候,百度上铺天盖地的前端框架就是我们的最好选择了. 当然,在网上直接下载的框架,我们是不能直接用的 ...
- Python—在Django中使用Celery
一.Django中的请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下: http请求发起 经过中间件 http handling(request解析) ur ...
- python django中restful框架的使用
在使用django进行前后台分离开发时通常会搭配django-rest-framework框架创建RESTful风格的接口API.框架介绍及版本要求可参考官方地址:https://www.django ...
- 在python的web框架Django中使用SQL Server
在pycharm中安装 安装pyodbc和Django——pyodbc是一个用python写的ODBC引擎 安装Django-pyodbc-azure 在后方网址中查 ...
随机推荐
- 快速删除XMind指定层级的方法
在使用xmind梳理知识点的时候,因为长期积累,单个文件的节点数可能超过1000个,层级可能超过6层.但在我们做文件分享时,可能只需要提供3层的思维导图,这时候就需要对子节点进行删除.原始的方法,就是 ...
- Electron安装过程深入解析(读完此文解决Electron应用无法启动,无法打包的问题)
1. 安装Electron依赖包 开发者往往通过npm install(或 yarn add)指令完成为Node.js工程安装依赖包的工作, 安装Electron也不例外,下面是npm和yarn的安装 ...
- [vue-webpack-template] webpack配置全局less引入
1. 项目模板webpack vue init webpack <项目名> 2. 安装依赖 除了less所需的less less-loader两个包以外,还需要安装style-resour ...
- BeautifulSoup使用手册(查询篇)
目录 开始使用呢 解析器 四种对象 tag对象 标签名(name) 属性值(Attributes) 多值属性 内容 Comment对象 prettify()方法 find_all方法 contents ...
- puts()和gets()函数
puts()和gets()函数 1. puts()函数 puts()函数用来向标准输出设备(屏幕)写字符串并换行, 其调用格式为: puts(s); 其中s为字符串变量(字符串数组名或字符串指针). ...
- 8-kubernetes-安全
kubernetes安全框架 访问K8S集群的资源需要过三关:认证.鉴权.准入控制,任意一个不通过都会失败 普通用户若要安全访问集群API server,往往需要证书.token或者用户名+密码,po ...
- java的各种集合为什么不安全(List、Set、Map)以及代替方案
我们已经知道多线程下会有各种不安全的问题,都知道并发的基本解决方案,这里对出现错误的情况进行一个实际模拟,以此能够联想到具体的生产环境中. 一.List 的不安全 1.1 问题 看一段代码: publ ...
- mysql5.7.23 解压版 密码忘记了咋办??
mysql 5.7.23 err文件: 查看log中保存的 密码 记下密码,重新启动MySQL服务,并进入CMD命令行,在此使用mysql -u root -p登陆,键入密码 进入数据库后,使用se ...
- 代码上传多个git仓库,切换过remote后导致 can't update
问题描述: 因为代码上传到github和coding 切换了 git--> rmote的地址:后来update失败 问题解决: 重新配置git解决:按提示操作就好 git fetch git p ...
- MeteoInfoLab脚本示例:闪电位置图
这个脚本示例读取文本格式的闪电数据,读出每条闪电记录的经纬度和强度,在地图上绘制出每个闪电的位置,并用符号和颜色区分强度正负.数据格式如下:0 2009-06-06 00:01:16.6195722 ...