Django的视图系统:View
一、CBV和FBV
FBV:functoin based view,基于函数的view
- 我们之前写过的都是基于函数的view
CBV:class based view,基于类的view
- 定义CBV:
from django.views import View class AddPublisher(View):
def get(self,request):
"""处理get请求"""
pass def post(self,request):
"""处理post请求"""
pass
- 使用CBV:
url(r'^add_publisher/', views.AddPublisher.as_view())
as_view的流程
- 项目启动加载ur.py时,执行类.as_view() --> view函数
- 请求到来的时候执行view函数:
- 实例化类 --> self
- self.request = request
- 执行self.dispatch(request, *args, **kwargs)
- 判断请求方式是否被允许:
- 允许:通过反射获取到对应请求方式的方法 --> handler
- 不允许:self.http_method_not_allowed --> handler
- 执行handler(request,*args,**kwargs)
- 返回响应 --> 浏览器
- 判断请求方式是否被允许:
- 实例化类 --> self
二、视图加装饰器
装饰器示例:
def timer(func):
def inner(request, *args, **kwargs):
start = time.time()
ret = func(request, *args, **kwargs)
print("函数执行的时间是{}".format(time.time() - start))
return ret
return inner
FBV
- 直接在函数上加装饰器
@timer
def publisher_list(request):
pass
CBV
- 导入
from django.utils.decorators import method_decorator
- 方法一:直接在方法上加装饰器
- 作用:只作用于加了装饰器的方法
@method_decorator(timer)
def get(self, request, *args, **kwargs):
pass
- 方法二:在dispatch方法上加装饰器
- 作用:作用于类里面的所有方法
@method_decorator(timer)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
- 方法三:在类上加装饰器,要指定name,即要加装饰器的方法名
- 作用:只作用于name指定的方法
@method_decorator(timer,name='get')
class AddPublisher(View):
pass
- 特殊:等效于方法二,相当于给dispatch方法上了装饰器,作用于类里面的左右方法
@method_decorator(timer,name='dispatch')
class AddPublisher(View):
pass
类的方法上也可以直接用@timer,效果等同于使用@method_decorator(timer)
- 使用@timer和使用@method_decorator(timer)的区别:
- 使用@timer:
- 使用装饰器,取参数时【def inner(*args, **kwargs)】,第一个参数默认是self,第二个参数才是request对象
- 使用@method_decorator(timer):
- 使用装饰器,取参数时【def inner(*args, **kwargs)】,第一个参数就是request对象
- 使用@timer:
- 注意:之后取request对象做操作时,注意使用装饰器的方式,对应取request对象的方式也不同
- 使用@timer和使用@method_decorator(timer)的区别:
三、 request对象
属性:
- request.methot:当前请求方式,GET/POST
- request.GET:url上携带的参数
- request.POST:POST请求提交的数据
- request.path_info:url的路径,不包含ip和端口,不包含参数
- request.body:请求体,byte类型,request.POST的数据是从boby里提取的
- request.FILES:上传的文件,类似字典
- request.META:请求头,标准的Python字典,包含左右HTTP首部
- request.COOKIES:cookie
- request.session:session
方法:
- request.get_host():获取主机的ip和端口
- request.get_full_path():url的路径,不包含ip和端口,包含参数
- request.is_ajax():判断是否是ajax请求,是返回Ture,否返回False
上传文件示例:
- urls.py
url(r'^upload/', views.upload)
- views.py
def upload(request):
if request.method == 'POST':
# 获取文件
# print(request.FILES)
f1 = request.FILES.get('f1')
# 保存文件
with open(f1.name, 'wb') as f:
for i in f1.chunks():
f.write(i)
return render(request, 'upload.html')
- upload.html
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="f1">
<button>上传</button>
</form>
四、 response对象
Response对象:render, redirect, HttpResponse
from django.shortcuts import render, redirect, HttpResponse
HttpResponse('字符串') # 返回字符串
render(request,'模板的文件名',{k1:v1}) # 返回一个完整的HTML页面
redirect('重定向的地址') # 返回重定向,Location:地址
JsonResponse对象
- 普通示例:
import json
def json_data(request):
data = {'name': 'alex', 'age': 73}
return HttpResponse(json.dumps(data))
# Content-Type: text/html; charset=utf-8
- 使用JsonResponse对象示例:
from django.http.response import JsonResponse
def json_data(request):
data = {'name': 'alex', 'age': 73}
return JsonResponse(data)
# Content-Type: application/json
Content-Type:响应头
- Content-Type: application/json好处在于:告诉前端这是json类型,便于做相应操作
- 默认Content-Type: text/html; charset=utf-8,更改直接使用参数content_type='application/json'
import json
def json_data(request):
data = {'name': 'alex', 'age': 73}
return HttpResponse(json.dumps(data),content_type='application/json')
# 此时,Content-Type: application/json
JsonResponse对象默认只能传递字典,对于非字典类型,设置参数safe=False
from django.http.response import JsonResponse
def json_data(request):
data = [1, 2, 3, 4]
return JsonResponse(data,safe=False)
Django的视图系统:View的更多相关文章
- django框架--视图系统
目录 一.视图函数的理解 二.视图函数的定位 三.请求对象HttpRequest 四.响应对象HttpResponse 一.视图函数的理解 视图函数的作用是,对指定的url执行业务逻辑,视图函数将会作 ...
- Python学习(三十二)—— Django之视图系统
转载自:http://www.cnblogs.com/liwenzhou/articles/8305104.html Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Pyth ...
- Django之视图系统
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的python函数(类),它接受web请求并返回web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,或者 ...
- Django 基础 视图系统
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
- 【Django】视图系统
目录 FBV 与 CBV 给视图加装饰器 使用装饰器装饰CBV 关于dispatch()方法 Request对象 与 Response对象 request对象 response对象 @ *** 一个视 ...
- django之视图系统 views.py-->主要内容(FBV和CBV、dispath、request对象和request.FILES、JsonResponse)
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 一 视图的实现可以基于两种方法: 1 基于函数的形式 FBV 使用装饰器装饰FBV 直接在上 ...
- Django的视图系统
视图(views)概述 在前几篇文章中介绍了,client端通过http请求——去url的路由找到相应的视图函数——触发视图函数——再去modes取数据——取到数据后——再通过创建模——views函数 ...
- 03 Django之视图函数
一.Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python函数(类),它接受WEB请求并返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
- Django框架——基础之视图系统(View.py)
Django框架之View.py(视图文件) 1. 视图简介 视图层是Django处理请求的核心代码层,我们大多数Python代码都集中在这一层面. 它对外接收用户请求,对内调度模型层和模版层,统合数 ...
随机推荐
- ansible 软件相关模块,剧本
软件相关模块 yum rpm和yum的区别 rpm:redhat package manager yum 可以解决依赖关系 yum 源配置 使用yum下载时需要先下载epel [epel] name= ...
- react知识点
http://www.cocoachina.com/webapp/20150721/12692.html http://blog.csdn.net/slandove/article/details/5 ...
- github配置密钥
我们在githob创建项目后,本地使用git 克隆代码 需要在githob配置密钥,才可以 步骤: 下载git,进行安装,安装好后.点击桌面,右键,选择>>git bash 在弹出的黑框 ...
- 前端学习笔记--CSS布局--层定位
1.层定位概述: z-index:前后叠加顺序 2.position属性: 3.fixed: 2.relative: 移动后: static没有往上移动占据box1的位置. 3.absolute: 移 ...
- WordPress自定义查询WP_Query使用方法大全
自定义调用文章在网站建设中很常用,wordpress也很人性化,用新建查询new WP_Query就能实现相关功能.WP_Query怎么用呢?随ytkah一起来看看吧 我们知道wordpress的主循 ...
- Oracle告Google输了
Oracle告Google输了 boxi • 2016-05-27 • 大公司 Google表示,陪审团的认定代表了Android生态体系.Java开发社区以及依靠开放免费编程语言开发创新消费者产品的 ...
- 使用CSS来渲染HTML的表单元素
效果: 实现: <!DOCTYPE html> <html> <head> <title>使用CSS来渲染HTML的表单元素</title> ...
- C++面向对象程序设计学习笔记(4)
类与对象(2) string类 C++不仅向下兼容C的字符表示方法,也声明了一种更方便的字符串类型,即string类. 想要使用string类,必须包括头文件string,即要声明 #include& ...
- Taro/JS/H5/小程序:纯前端解决小程序微信支付统一下单和调起支付
这个文章不会说具体0到1的代码流程,我会着重讲几个问题的解决 准备以下依赖 "md5": "^2.2.1", "xml-js": " ...
- streamsets 测试框架说明
streamsets 团队为了方便进行sdc以及sdh 的测试基于streamsets python sdk 开发了 streamsets Test Framework 安装 注意python 3.7 ...