Django 是一个实现了 MVT 处理模式的、功能全面而强大的、主要应用于企业级 web 项目开发的 web 框架。
M:Model 数据模型
V:View 视图
T:Template 模板
MVT 是在 MVC 处理模式的基础上衍生出来的一种处理模式,将控制器 C 部分封装并提供了 路由配置,通过 MV 之间的路由映射关系完成复杂的功能,通过重用模板 T 来达到视图的复 用以提高开发效率的操作过程。
视图操作
视图作为软件和用户最直接交互的一部分,其界面的重要性以及操作功能的完整性需要非常高的保障,一个完善的视图操作可以给用户带来一份非常愉悦的使用体验!
视图处理函数
通常情况下的视图操作,主要由 Django 项目中的视图模块 views.py 进行处理,针对用户的URL请求定义不同的处理函数进行处理,在处理函数中就可以返回对应的视图View。
下面是一个最原始的视图处理方式,编辑 mysite/views/views.py
# 需要HttpResponse对象返回普通视图页面 |
定义好视图处理函数之后,就可以在模块路由中添加视图函数和 URL 地址的映射关系了 修改 mysite/views/urls.py 如下:
from django.conf.urls import url from . import views urlpatterns = [ url(r"^view1#34;,views.view1,name="view1"), ] |
在根模块的主路由配置文件中,注册添加 views模块应用中的子路由配置 修改 mysite/mysite/urls.py 如下:
# 导入视图文件 from . import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/',include("blog.urls")), url(r'^views/',include("views.urls")), url(r"^.*#34;,views.index,name="index"), ] |
通过路由和处理函数的结合,就完成了一个完整的视图模块的定义。
测试代码:
那么请思考下面的问题!!!
路由到底是什么东西? 它起到了什么作用? 视图函数到底是一个什么样的函数? 路由就是一个 url 请求分发器,根据具体的配置信息,将 web 服务器接收到的 url 请求关联并调用执行指定的函数(视图函数),这样的一个操作过程称为路由 路由的核心作用就是关联URL地址和视图处理函数之间的映射关系! 路由的配置在 Django 项目中,主要是通过应用下面的 urls.py 文件进行配置,所有的路由信息会 包含在一个变量名称为 urlpatterns 的列表中,每个独立的路由都是通过 url()来进行设置操作 的,url()有三个参数,如下: url(r"^#34;, views.index, name="index") 参数1:一个正则表达式,用来匹配 url 请求路径,不包含项目路径和参数,不包含前分隔符/ 参数2:一个指定的视图函数,主要在参数 1匹配成功时调用执行 参数3:给当前路由的一个字符串名称 视图处理函数就是定义在视图模块 views.py中的普通函数,函数的参数request表示一个 请求对象,包含了浏览器发送的请求中的所有信息 |
响应视图的处理
我们也知道,一般视图都是HTML页面在充当,如果要返回HTML页面,我们还使用上面的字符串去写,这样无形之中增加了很大的开发成本,所以Django也为大家提供了如下几种视图相应处理方式。
? 普通响应视图 (了解) ? 响应网页视图 (了解) ? 返回网页视图快捷操作方式 (重要,掌握) |
普通响应视图
返回一个简单的字符串渲染网页:
# 需要HttpResponse对象返回普通视图页面 from django.http import HttpResponse # 定义视图处理函数 def view1(request): # 返回一个字符串展示的视图,会在浏览器网页中打印展示给用户 # 如果有参数,则可以使用字符串拼接的方式完成 msg = "刘建宏真帅" return HttpResponse("<h1>使用普通字符串传递页面%s</h1>" %msg) |
响应网页视图
在 views/模块应用下创建目录 templates/(固定的,以后都是这个名字)。
在 templates 目录中创建二级目录 views/(一定要创建,路径隔离),在其中创建网页 index.html。
目录结构如:mysite/views/templates/views/index.html,编辑内容:
<!DOCTYPE html> <h2>{{msg}}</h2> |
接下来在视图处理函数中,我们重新定义返回视图:
# 导入一个解析模板的loader对象 from django.template import loader def view2(request): # 使用loader加载页面,注意路径问题, # loader会自动去templates文件夹下查询页面 temp = loader.get_template("views/index.html") context = {"msg": "刘建宏是个大帅锅"} # 上下文参数 return HttpResponse(temp.render(context,request)) |
此时我们通过http://127.0.0.1:8000/views/view2 再次访问服务器就会得到一个开发的网页视图:
网页视图快捷操作方式
通过响应对象渲染返回的网页,功能非常强大,但是编码略显复杂。 Django 框架作为一个功能强大的 web 框架,不会让开发人员做大量重复的工作,所以已经将 HTML 网页的渲染返回进行了快捷的处理,方便了开发人员的使用。
改造上述视图处理函数如下:
# 引入需要的render对象 from django.shortcuts import render def view3(request): # render函数可以将视图快速返回 return render(request,"views/list.html",{"msg": "刘建宏就是我的欧巴~~~"}) |
创建list.html,运行代码:
Django的视图返回就是这么简单,我们需要大家对简单字符串返回和loader加载会简单使用即可,但是shortcuts快捷方式必须掌握和熟练使用。
RESTful 参数处理
我们都知道,视图是展示数据的,但是在真正的项目中,我们一般展示数据的同时,也会由页面传递数据到服务器,如:注册、登录等。
当前的技术,进行数据传输到服务器的主要有两种方式,一种是传统的get或者post协议中携带数据,一种就是最近比较流行的RESTful方式,RESTful参数处理,就是通过将参数包含在 URL 地址中 作为地址的一部分出现,在一定程度上能有非常好的参数混淆的作用,对于网站安全性的提升是非常友好的一种操作,两种比较如下:
get 方式发送参数:发送的参数名称为 wd,参数的值为 刘建宏 http://www.baidu.com?wd=刘建宏 RESTful 风格发送参数: http://www.baidu.com /liujianhong/wd |
Django也实现了RESTful 风格发送参数是将参数包含在 url 地址中,所以参数的接收定义就会在路由中进行配置,参数的配置接收主要有两种方式如下,我们推荐第二种方式:
? 第一种方式:位置参数 ?
? 第二种方式:关键字参数
两种方式的配置代码如下,在url.py中配置,在视图处理函数中获取参数:
# 利用正则的分组,第一个括号表示第一个参数 url(r"^(\w+)/param1#34;,views.param1,name="param1"), # 使用命名参数 url(r"^(?P<username>\d+)/param2#34;,views.param2,name="param2"), |
视图函数如下:
# url(r"^(\w+)/param1",views.param1,name="param1"), # 第一个参数就是正则分组的参数 def param1(request,name): print("前端传输的name:", name) return HttpResponse("这个是使用位置参数方式") # 这个是使用命名参数 # url(r"^(?P<username>\d+)/param2",views.param2,name="param2"), def param2(request,username): print("前端传输的username:", username) return HttpResponse("这个是使用命名参数方式") |
我们可以通过如下的方式进行访问并传递数据:
http://127.0.0.1:8000/views/liujianhong/param1 http://127.0.0.1:8000/views/123456/param2 |
request对象
上面介绍了 RESTful 风格的数据参数操作,但是在网页中更多的数据请求方式还是通过 get 和 post 表单请求发送进行发送的,此时我们就需要对我们发送的请求 Request 这个特殊的对象进行分析,并从中得到我们想要的数据。
Request是web开发中的请求头对象,它携带者请求者的大多数信息,这些信息有些是我们需要的。
首先在视图处理函数中,第一个参数被 Django 自动设置成了包含浏览器发送的请求数据的请求对象,对于请求对象 Request,有如下的属性值得我们思考。
? path: 一个表示完整访问路径的字符串,不包含域名,就是URI ? method:一个表示请求方式的字符串 ? encoding:一个表示请求编码方式的字符串 2 如果为 None 表示使用浏览器默认 utf8 编码 ? GET:一个像dict的对象,包含了 get 方式请求的所有参数数据 ? ? POST: 一个像dict的对象,包含了 post 方式请求的所有参数数据 ? ? FILES: 一个像dict的对象,包含了所有的上传的文件 ? ? COOKIES:一个字典对象,包含所有的 cookie 值 ? ? session:一个 like dict 对象,用于表示当前会话,Django 启用会话支持时可用 ? 等等…… |
查看这些常见的request方法和属性:
def req(request): print("request===>",request) #请求对象request print("request===>",dir(request)) #request中的方法和属性 print("method===>",request.method) #请求的方法类型 print("GET===>",request.GET) # get请求的参数 print("POST===>",request.POST) # post请求的参数 print("FILES===>",request.FILES) # 二进制文件 print("session===>",request.session) # session对象 print("COOKIES===>",request.COOKIES) # cookie对象 print("path===>",request.path) # 路径URI print("encoding===>",request.encoding) #编码方式,如果为None,则默认为utf-8 return HttpResponse("这个是request对象") |
运行代码,控制台上输入信息:
那么我们如果要获取前端页面传递过来的数据就简单了。
def req_params(request): if request.method == "GET": print("get方式提交数据") name = request.GET["name"] pwd = request.GET["pwd"] # 如果页面传递的是多个数据,则不能使用这种方式接受 # 而应该使用下面的getlist方法来接受 favs = request.GET["fav"] print(name,pwd,favs) ################################################ # 也可以这样获取,第二个参数表示如果没有值默认的值 name = request.GET.get("name","默认值") pwd = request.GET.get("pwd") # 获取多个数据使用getlist方法 favs = request.GET.getlist("fav") print(name,pwd,favs) elif request.method == "POST": name = request.POST.get("name", "默认值") pwd = request.POST.get("pwd") # 获取多个数据使用getlist方法 favs = request.POST.getlist("fav") print(name, pwd, favs) return HttpResponse("获取页面的参数") |
响应对象 Response
我们刚刚学习了Request对象,这个是请求头对象,主要封装用户请求的信息,下面我们来看Response对象,这个是服务器相应客户端的相应对象。
Django 中的 Response 响应对象,主要用来进行浏览器响应数据的处理。
响应数据的处理包括两部分:响应对象本身和响应返回视图操作。
响应对象的属性和方法操作
属性操作 | |
content | 响应的数据内容 |
charset | 数据编码格式 |
status_code | HTTP 响应状态码 |
content-type | 指定输出内容类型 |
方法操作 | |
init() | 使用网页内容创建 HttpResponse 对象 |
write(content) | 以文件的方式写入数据 |
flush() | 以文件的方式刷新推送数据 |
set_cookie(k,v,m_a,e) | 设置 cookie 中存储数据 k:key,变量名称 v:value,变量中存放的值 m_a:max_age,cookie 过期时间,单位秒s e:expires,过期时间 datetime 类型 |
测试代码如下:
def resp_params(request): print("HttpResponse===>",HttpResponse) print("HttpResponse===>",dir(HttpResponse)) return HttpResponse("相应头信息") |