一、概要
视图可以一个python函数,可以叫视图函数,或者简称视图,也可以是是一个类,定义在views.py 文件中。
主要用于接收并处理请求,调用模型层和模板层,响应请求(返回HttpResponse或其子类)每一个用户请求,都对应着一个视图(和url地址),由视图处理请求后,再返回html页面内容给浏览器显示。在http请求中产生两个核心对象,所在位置是,django.http
二、核心对象
- http请求:HttpRequest对象
- http响应:HttpResponse对象
三、HttpRequest对象
1、说明
当请求一个页面时,Django 创建一个 HttpRequest对象包含原数据的请求。然后 Django 加载适当的视图,通过 HttpRequest作为视图函数的第一个参数。每个视图负责返回一个HttpResponse目标
2、属性
2.1、GET
- 说明
一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象 - 举个栗子
value = request.GET.get('key',default=None)
2.2、POST
- 说明
一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。 - 栗子
value = request.POST.get('key',default=None)
2.3、path
- 说明
请求页面的全路径,不包括域名和参数 - 栗子
/index/ /shop/list/
2.4、method
- 说明
请求中使用的HTTP方法的字符串表示。全大写表示 - 示例
if request.method=='GET': #这里是get请求 elif request.method ='POST': #这里是post请求
2.5、COOKIES
- 说明
包含所有cookies的标准Python字典对象;keys和values都是字符串。 - 示例代码
查看会话机制专题
2.6、session
- 说明
唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。 - 栗子
查看会话机制专题
2.7、FILES
- 说明
包含所有上传文件的类字典对象;
FILES中的每一个Key都是'<input type="file" name="" />'标签中 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象
注意,FILES 只有在请求的方法为POST 且提交的<form>
带有enctype="multipart/form-data"
的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象 - 栗子
查看文件上传相关
2.8、user
- 说明
一个AUTH_USER_MODEL
类型的对象,表示当前登录的用户。
如果用户当前没有登录,user
将设置为django.contrib.auth.models.AnonymousUser
的一个实例。你可以通过is_authenticated()
- 栗子
具体查看用户认证 if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users.
2.9、encoding
- 说明
一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
2.10、META
- 说明
一个标准的Python字典包含所有可用的HTTP头。可用标题取决于客户端和服务器
- 栗子
- CONTENT_LENGTH
请求体的长度(一个字符串)。 - CONTENT_TYPE
请求体的类型。 - HTTP_ACCEPT
为响应–可以接受的内容类型。 - HTTP_ACCEPT_ENCODING
接受编码的响应 - HTTP_ACCEPT_LANGUAGE
接受语言的反应 - HTTP_HOST
客户端发送的HTTP主机头。 - HTTP_REFERER
参考页面 - HTTP_USER_AGENT
客户端的用户代理字符串。 - QUERY_STRING
查询字符串,作为一个单一的(分析的)字符串。 - REMOTE_ADDR
客户端的IP地址 - REMOTE_HOST
客户端的主机名 - REMOTE_USER
用户通过Web服务器的身份验证 - REQUEST_METHOD
字符串,如"GET"或"POST" - SERVER_NAME
服务器的主机名 - SERVER_PORT
服务器的端口(一个字符串)
- CONTENT_LENGTH
3、方法
3.1、get_host()
- 说明
根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False)和 HTTP_HOST 头部信息返回请求的原始主机。
注意:当主机位于多个代理后面时,get_host() 方法将会失败。除非使用中间件重写代理的首部。 - 栗子
# 假如要访问的地址是 http://127.0.0.1:8000/user/login/
3.2、get_full_path()
- 说明
返回 path,如果可以将加上查询字符串。 - 举个栗子
# 完整的请求地址 http://127.0.0.1:8000/user/list/?page=1&size=10 print(request.get_full_path()) # 输出 /user/list/?page=1&size=10
3.3、is_secure()
- 说明
如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的。
3.4、is_ajax()
- 说明
判断是否是ajax请求
四、HttpResponse对象
1、说明
对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象
2、主要的属性
- content:表示返回的内容,字符串类型
- charset:表示response采用的编码字符集,字符串类型
- status_code:响应的HTTP响应状态码,默认是200
- content-type:指定输出的MIME类型
3、主要的方法
- init
使用页内容实例化HttpResponse对象 - write(content)
以文件的方式写 - flush():
以文件的方式输出缓存区 - set_cookie
设置Cookie,具体的使用看会话章节
4、HttpResponse的常见的子类
4.1、JsonResponse
- 说明
这个类是HttpRespon的子类,返回json类型的数据,它的默认Content-Type 被设置为: application/json - 构造方法
JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
- 参数说明
- data
一个字典类型的数据 - encoder
json生成器 - safe
默认的safe 参数是 True. 如果你传入的data数据类型不是字典类型,那么它就会抛出 TypeError的异常,如果设置为False ,那data可以填入任何能被转换为JSON格式的对象,比如list, tuple, set。 - json_dumps_params
一个字典,它将调用json.dumps()方法并将字典中的参数传入给该方法
- data
- 示例代码
# 使用HttpResponse def index(request): data={ 'name':'hello', 'age':18, } return HttpResponse(json.dumps(data),content_type="application/json") # 使用JsonResponse 直接将字典传递过去 def index(request): data={ 'name':'hello', 'age':18, } return JsonResponse(data)
# 如果返回的是 list类型 def index(request): data=[1,2,3,4,5] return JsonResponse(data,safe=False) ''' 注意: 如果不设置safe=False 将会抛出 TypeError错误 '''
4.2、TemplateResponse
- 说明
是SimpleTemplateResponse
的子类,而SimpleTemplateResponse又继承自HttpResponse
主要的作用是将模板渲染成HTML字符串返回给客服端,具体看快捷方法中的render函数
4.3、HttpResponseRedirect
- 说明
重定向,服务器端跳转
具体看细节看重定向章节
五、快捷方法
1、说明
- 页面渲染:render(推荐),render_to_response,
- 页面跳转:redirect
- locals: 可以直接将对应视图函数中所有的变量传给模板
2、render
- 方法
render(request, template_name, context=None, content_type=None, status=None,using=None)
- 参数说明
- request
请求 - template_name(必选)
一个模板的使用或模板序列名称全称。如果序列是给定的,存在于第一个模板将被使用 - context(可选)
一组字典的值添加到模板中。默认情况下,这是一个空的字典。 - content_type(可选)
MIME类型用于生成文档。 - status (可选)
为响应状态代码。默认值为200 -
using
用于加载模板使用的模板引擎的NAME。
- request
- 示例代码
# 纯静态界面渲染 def index(request): return render(request,'index.html') #向用户显示一个html页面
# 配合传递数据配合模板语法使用 def index(request): data={'user':{'name':'小明',age:18}} return render(request,'index.html',context=data) #向用户显示一个html页面
# 也可以使用简写方式 locals()函数,他会将视图函数中的所有局部变量封装到字典中 # 主要在开发中尽量不要使用,尤其数据比较复杂的时候,因为有可能有的数据不一定会使用 # 所以当你确定你的视图函数中的定义的所有变量都要传递给视图的时候,你可以使用这个函数 def index(request): user = {'name':'小明',age:18} # 生成的数据context = {'user': user} return render(request,'index.html',locals()) #向用户显示一个html页面
3、redirect 函数
- 说明
具体查看重定向章节
六、FBV与CBV
- 说明
FBV、CBV是Django视图路由处理模型,当用户请求送达路由系统URL后,由其转发给视图view来分析并处理
CBV全称是class base views,中文名字类通用视图
FBV全称是function base views,中文名字视图函数 - FBV实例
#urls.py from django.conf.urls import url, include urlpatterns = [ url(r‘^index/‘, views.index), ]
#views.py from django.shortcuts import render def index(request): if request.method == ‘POST‘: print(‘method is :‘ + request.method) elif request.method == ‘GET‘: print(‘method is :‘ + request.method) return render(req, ‘index.html‘)
#index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <form action="" method="post"> <input type="text" name="A" /> <input type="submit" name="b" value="提交" /> </form> </body> </html>
- CBV实例
from mytest import views urlpatterns = [ # url(r‘^index/‘, views.index), url(r‘^index/‘, views.Index.as_view()), #注:url(r‘^index/‘, views.Index.as_view()), 是固定用法 ]
#views from django.views import View class Index(View): def get(self, request): print(‘method is :‘ + request.method) return render(request, ‘index.html‘) def post(self, request): print(‘method is :‘ + request.method) return render(request, ‘index.html‘)
<!--index.html --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <form action="" method="post"> <input type="text" name="A" /> <input type="submit" name="b" value="提交" /> </form> </body> </html>