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

关于Django的视图系统

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

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

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

  • (1)、每个视图函数,都使用HttpRequest对象作为第一个参数,并且通常称之为request。

  • (2)、每个视图函数,都会返回一个HttpResponse对象,其中包含生成的响应。

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

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

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


视图编码分类
  • FBV(function based view):就是将业务逻辑写在一个函数中
  • CBV(class based view): 就是以类的方式写;

给视图加装饰器

(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()

【参数】:

  • 一个模型:将调用模型的get_absolute_url() 函数
  • 一个视图:可以带有参数,将使用urlresolvers.reverse 来反向解析名称
  • 一个绝对的或相对的URL,将原封不动的作为重定向的位置。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • 前言 视图:即一个python函数,可以叫 视图函数,或者简称 视图,定义在 应用/views.py 文件中。作用...
    NewForMe阅读 334评论 0 2
  • 一、概要 视图可以一个python函数,可以叫视图函数,或者简称视图,也可以是是一个类,定义在views.py 文...
    唯老阅读 460评论 0 8
  • 目录 一、中间件简介 在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合...
    CaiGuangyin阅读 764评论 0 3
  • 什么是Django的View 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求...
    Pope_Li阅读 413评论 0 0
  • 自强学堂Django教程 目录 Django是目前最流行的Python Web框架。 一、Django的MTV模式...
    CaiGuangyin阅读 1,154评论 4 3