视图系统CBV 和 response
CBV和FBV
FBV(function based view )
CBV(class based view)
1. CBV的定义
# 增加出版社 CBV
from django.views import View class AddPublisher(View):
def get(self, request):
pass def post(self, request):
pass
2. CBV使用
url(r'^add_publisher/', views.AddPublisher.as_view()),
3. CBV的流程
views.AddPublisher.as_view() 程序加载的时候执行 ——》 view函数
当请求到来的时候执行view函数:
self = AddPublisher()
self.request = request
执行self.dispatch方法
判断请求方式是否被允许
允许时,通过反射获取到AddPublisher中定义的get或者post方法 ——》handler
不允许时,self.http_method_not_allowed ——》handler
执行handler 拿到返回结果 Httpresponse对象
CBV的匹配原理:
通过查看View的源码,可以看到里面有很多提交方法
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
使用ajax的时候这些方法都可以使用
这种根据url 来匹配的方法都是通过反射(getattr)获得的. 请求发过来之后,会先走一个dispatch的方法,这个方法在View类中
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
request.method.lower()
将请求方式变成小写. 通过反射找到类中的对应方法
所有的框架,本质都是通过请求方式, 反射不同的函数
所以CBV的本质,其实还是用的FBV, 只不过用类封装了而已
4. 给CBV加装饰器 method_decorator
from django.utils.decorators import method_decorator
加载到某个get 或者 post的方法上:
@method_decorator(timer)
def get(self, request):
加在self.dispatch方法上:
@method_decorator(timer)
def dispatch(self, request, *args, **kwargs):
加在类上:
@method_decorator(timer, name='post')
@method_decorator(timer, name='get')
class AddPublisher(View):
5. 区别
不使用method_decorator
func: <function AddPublisher.dispatch at 0x00000163735176A8>args :<app01.views.AddPublisher object at 0x00000163735F7EF0> <WSGIRequest: GET '/add_publisher/'>
使用method_decorator
func:<function method_decorator.<locals>.dec.<locals>.wrapper.<locals>.bound_func at 0x0000019664B4A378>arsgs: <WSGIRequest: GET '/add_publisher/'>
简而言之:
不使用method_decorator的时候, 第二个参数是request
使用method_decorator的时候, 第一个参数是request
request对象(常用的) **
需要记几个常用的request的属性和方法
print(request.method) # 请求方式 GET 、POST
print(request.GET) # get的请求数据 QueryDict{} url携带参数
print(request.POST) # post的请求数据 QueryDict{} form表单提交的post数据
print(request.path_info) # 路径信息 不包含IP和端口、参数
print(request.path) #获取请求路径信息
print(request.body) #获取的是请求体里的数据
print(request.FILES) #上传的文件
上传文件注意事项:
form表单的enctype:multipart/form-data;
method="post";
name="作为键";
{%csrf_token%};
取文件对象的方法: chunks();
request.FILES中获取文件对象
print(request.is_ajax()) #是否是ajax请求
print(request.get_host())
print(request.get_full_path()) # 路径信息 + 参数
response对象
1. HttpResponse("字符串") --->字符串
2. render(request,"模板文件名",{k:v}) ----->完整的页面
3. redirect("要跳转的地址")---> 本质是响应头:Location:url
1. ret=HttpResponse() ret["Location"]=url(设置响应头)
4. JsonResponse({字典}) ContentType:application/json
1.传非字典类型的时候设置: safe=False
文件上传
view.py
# 上传文件
def upload(request):
if request.method == 'POST':
# print(request.body)
file = request.FILES.get('f1')
with open(file.name, 'wb') as f:
for chunk in file.chunks():
f.write(chunk)
return HttpResponse('上传成功') return render(request, 'upload.html') import json
from django.http import JsonResponse def json_test(request):
data = {'name': 'alex', 'pwd': 'alexdsb'} ret = HttpResponse(json.dumps(data))
ret['Content-Type'] = 'application/json'
ret['xxx'] = 'axxx'
return ret
# return HttpResponse(json.dumps(data), content_type='application/json') # Content-Type: text/html; charset=utf-8
# return JsonResponse(data) # Content-Type: application/json
template
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
文件:<input type="file" name="f1">
<button>上传</button>
</form>
</body>
</html>
上传文件注意事项:
form表单的enctype = 'multipart/form-data'
request.FILES中获取文件对象
使用文件对象的chunks()
JsonResponse 作用是做序列化的
服务器--->浏览器
Contenttype:json
from django.http import JsonResponse def json_test(request):
data = {'name': 'alex', 'pwd': 'alexdsb'} return JsonResponse(data) # Content-Type: application/json
# return HttpResponse(json.dumps(data), content_type='application/json') # Content-Type: text/html; charset=utf-8
视图系统CBV 和 response的更多相关文章
- Django 视图系统
Django 视图系统 概念 一个视图函数,简称视图,是一个简单的Python函数,用于接受Web请求并返回Web响应. 通常将视图函数写在project或app目录中的名为views.py文件中 简 ...
- Django框架详细介绍---视图系统
Django视图系统 1.什么是视图 在Django中,一个视图函数/类,称为视图.实质就是一个用户自定义的简单函数,用来接收WEB请求并xing响应请求,响应的内容可以是一个HTML文件.重定向.一 ...
- Django框架简介-视图系统
2.3 视图系统 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档 ...
- django框架--视图系统
目录 一.视图函数的理解 二.视图函数的定位 三.请求对象HttpRequest 四.响应对象HttpResponse 一.视图函数的理解 视图函数的作用是,对指定的url执行业务逻辑,视图函数将会作 ...
- 运维开发笔记整理-基于类的视图(CBV)
运维开发笔记整理-基于类的视图(CBV) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.FBV与CBV 1>.什么是FBV FBC(function base views ...
- django之视图系统 views.py-->主要内容(FBV和CBV、dispath、request对象和request.FILES、JsonResponse)
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 一 视图的实现可以基于两种方法: 1 基于函数的形式 FBV 使用装饰器装饰FBV 直接在上 ...
- Python学习(三十二)—— Django之视图系统
转载自:http://www.cnblogs.com/liwenzhou/articles/8305104.html Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Pyth ...
- Django之视图系统
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的python函数(类),它接受web请求并返回web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,或者 ...
- python 终极篇 --- django 视图系统
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
随机推荐
- PHP中的序列化
接口 Serializable { abstract public string serialize (void); abstruact public void unserialize (string ...
- 利用winIO3.0进行windows10 64bit端口读取
一.winIO介绍 WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作.通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,它绕过了Windows系统的保 ...
- VS2013环境里安装QT插件-“X86”与目标计算机类型“x64”冲突
在VS2013环境里搭载QT老是出现模块计算机类型“X86”与目标计算机类型“x64”冲突 2.解决方案2.1 项目右键,属性>配置管理选择>x64,没有的话新建:2.2 项目右键,属性 ...
- Python爬虫: "追新番"网站资源链接爬取
“追新番”网站 追新番网站提供最新的日剧和日影下载地址,更新比较快. 个人比较喜欢看日剧,因此想着通过爬取该网站,做一个资源地图 可以查看网站到底有哪些日剧,并且随时可以下载. 资源地图 爬取的资源地 ...
- 浏览器中实现3D全景浏览
如果你用过网页版的百度地图,你大概3D全景图浏览是一种怎样的酷炫体验:在一个点可以360度环顾周围的建筑.景色,当然也可以四周移动,就像身临其境. 科普 全景图共分为三种: ①球面全景图 利用一张全景 ...
- ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Deskto ...
- Window上安装kafka
kafka在windows上的安装.运行 - 进阶者ryan-su - CSDN博客 https://blog.csdn.net/u010283894/article/details/77106159 ...
- configure -help
http://www.360doc.com/content/14/1215/17/18578054_433158382.shtml http://blog.csdn.net/mociml/articl ...
- Delphi Thread.Queue与Synchronize的区别(差别: Synchronize是阻塞,Queue是非阻塞)
前话: 其实大家要学会看源码, 我接下来要说的这些东东,与其等别人讲,还不如自己搞几个代码试一下,印象还深刻点 TThread.Queue和TThread.Synchronize的区别, 效果上:二 ...
- 任何一件事,如果你不投入时间和精力去驯养,就不可能产生真正的兴趣和热爱(Focus Feedback FixIt的原理) good
这两本书和我们说的兴趣结合起来,为我们指明了精进的道路: 选择一个你感兴趣的方向 刻意练习 持续投入时间和精力 所谓刻意练习,简单说就是“3F”,即: Focus Feedback Fix it Fo ...