《Django By Example》

【Django】视图篇:视图系统、装饰器、Requset对象 V

2019-08-08  本文已影响11人  Alcazar
关于Django的视图系统

【定义】:一个视图函数(或类),简称为视图,是一个简单的python函数或类,它接受web请求并且返回web响应。

响应:可以是一张网页的html内容,一个重定向,一个404错误,一个hxml 文档,或一张图片。

无论视图本身包含什么逻辑,都要返回响应,代码写在那里都无所谓,只要它在你当前项目目录下面。为了将代码放在某处,大家预定成俗将视图放在项目project或应用程序app目录中的名为views.py的文件中。

Django使用请求和响应对象来通过系统传递状态。

当浏览器向服务端请求一个页面是,Django创建一个HttpRequest对象,该对象包含关于请求的元数据,然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数,每个视图函数负责返回一个HttpResponse对象。

常见的render,redirect,HttpResponse对象返回的都是一个HttpResponse对象。


视图编码分类

给视图加装饰器

(1)FBV加装饰器
常用的一种方式:在函数上方加装饰器 @wrapper_name;

(2)CBV加装饰器

【必须导入】:

from django.utils.decorators import method_decorator

【方式】:
 2.1、直接在方法上加:

@method_decorator(wapper_name)
def  get(self,request):pass

2.2、给自定义的dispatch方法加:

@method_decorator(wrapper_name) 
def  dispatch(self,request,*args,**kwargs)</pre>

2.3、类上加装饰器

@method_decorator(wapper_name, name='post')    #给方法post加装饰器
@method_decorator(wapper_name, name='get')
class AddClass(View)

#【注】:其实也可以直接给View中的dispatch方法加装饰器,这样同样可以实现给自己类下的所有方法加装饰器(自己未定义dispatch方法时)
@method_decorator(wapper_name, name='dispatch')
class AddClass(View)

【提升】:
为视图加装饰器或者保护csrf_token

rom django.views.decorators.csrf import csrf_exempt,csrf_protect

Requset对象 VS Respondse对象
request对象

当一个页面被请求时,Django会形成一个包含被请求信息的对象;
Django会将这个对象自动传递给响应的视图函数,一般视图函数预定俗称的使用request参数承接这个对象。

请求相关的常用值

请求常用值 作用
path_info 返回用户访问的url,不包含域名,仅path不带参数
get_full_path() 返回完整路径,不含域名
method 请求中使用的HTTP方法的字符串表示,全大写表示
GET 包含所有HTTP GET参数的类字典对象
POST 包含所有HTTP POST参数的类字典对象
body 请求体,byte类型的request.POST的数据就是从body里面提取到的
FILES 上传文件,{} 注意form标签加enctype="multipart/form-data"属性
HTTP_REFERER 跳转到上次访问的页面,用户在未登录前要访问的页面,登录后跳转到该页面, redirect(request.Meta.get('HTTP_REFERER','')

属性

django将请求报文中的请求行、头部信息、内容主体封装成 HttpRequest 类中的属性。

请求(属性) 作用
HttpRequest.scheme 表示请求方案的字符串
HttpRequest.body 一个字符串,代表请求报文的主体
HttpRequest.POST 要处理表单数据的时候(推荐使用),一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
HttpRequest.GET 一个类似于字典的对象,包含 HTTP GET 的所有参数。
HttpRequest.path 一个字符串,表示请求的路径组件(不含域名)。
HttpRequest.method 一个字符串,表示请求使用的HTTP 方法。
HttpRequest.encoding 一个字符串,表示提交的数据的编码方式(默认为 utf-8
HttpRequest.COOKIES 一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
HttpRequest.FILES 一个类似于字典的对象,包含所有的上传文件信息。
HttpRequest.META 一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器
HttpRequest.session 一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。

【拎出来详谈】HttpRequest.META:是 一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器

头部信息示例 具体意义
CONTENT_LENGTH 请求的正文的长度(是一个字符串)。
CONTENT_TYPE 请求的正文的MIME 类型。
HTTP_ACCEPT 响应可接收的Content-Type。
HTTP_ACCEPT_ENCODING 响应可接收的编码。
HTTP_ACCEPT_LANGUAGE 响应可接收的语言。
HTTP_HOST 客服端发送的HTTP Host 头部。
HTTP_REFERER Referring 页面。
HTTP_USER_AGENT 客户端的user-agent 字符串。
QUERY_STRING 单个字符串形式的查询字符串(未解析过的形式)。
REMOTE_ADDR 客户端的IP 地址。
REMOTE_HOST 客户端的主机名。
REMOTE_USER 服务器认证后的用户。
REQUEST_METHOD 一个字符串,例如"GET" 或"POST"。
SERVER_NAME 服务器的主机名。
SERVER_PORT 服务器的端口(是一个字符串)。

请求方法 具体作用
HttpRequest.get_host() 根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False)和 HTTP_HOST 头部信息返回请求的原始主机。
HttpRequest.get_full_path() 返回 path
HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。
HttpRequest.is_secure() 如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的。
HttpRequest.is_ajax() 请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest'。

Respondse对象

我们写的每个视图都需要实例化,填充和返回一个HttpResponse。HttpResponse类位于django.http模块中。具体属性见下表

属性 作用
HttpResponse.content: 响应内容
HttpResponse.charset: 响应内容的编码
HttpResponse.status_code: 响应的状态码

render()

结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
【】

参数 作用
request 用于生成响应的请求对象。
template_name 要使用的模板的完整名称,可选的参数
context 添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
content_type 生成的文档要使用的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。默认为'text/html'
status 响应的状态码。默认为200。
useing 用于加载模板的模板引擎的名称。

【简单的实例】

from django.http import HttpResponse
from django.template import loader

def my_view(request):
    # 视图代码写在这里
    t = loader.get_template('myapp/index.html')
    c = {'foo': 'bar'}
    return HttpResponse(t.render(c, request))

redirect()

【参数】:

默认情况下,redirect() 返回一个临时重定向;传递permanent=True 可以返回一个永久的重定向。

上一篇下一篇

猜你喜欢

热点阅读