CBV和FBV

  1. FBV(function based view )

  2. CBV(class based view)

1. CBV的定义

  1. # 增加出版社 CBV
  2. from django.views import View
  3.  
  4. class AddPublisher(View):
  5. def get(self, request):
  6. pass
  7.  
  8. def post(self, request):
  9. pass

2. CBV使用

  1. url(r'^add_publisher/', views.AddPublisher.as_view()),

3. CBV的流程

  1. views.AddPublisher.as_view() 程序加载的时候执行 ——》 view函数

当请求到来的时候执行view函数:

  1. self = AddPublisher()

  2. self.request = request

  3. 执行self.dispatch方法

    1. 判断请求方式是否被允许

      1. 允许时,通过反射获取到AddPublisher中定义的get或者post方法 ——》handler

      2. 不允许时,self.http_method_not_allowed ——》handler

    2. 执行handler 拿到返回结果 Httpresponse对象

CBV的匹配原理:

通过查看View的源码,可以看到里面有很多提交方法

  1.  http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

使用ajax的时候这些方法都可以使用

这种根据url 来匹配的方法都是通过反射(getattr)获得的. 请求发过来之后,会先走一个dispatch的方法,这个方法在View类中

  1. def dispatch(self, request, *args, **kwargs):
  2.     # Try to dispatch to the right method; if a method doesn't exist,
  3.     # defer to the error handler. Also defer to the error handler if the
  4.     # request method isn't on the approved list.
  5.     if request.method.lower() in self.http_method_names:
  6.       handler = getattr(self, request.method.lower(),self.http_method_not_allowed)
  7.     else:
  8.       handler = self.http_method_not_allowed
  9.     return handler(request, *args, **kwargs)
  10.   request.method.lower()

将请求方式变成小写.  通过反射找到类中的对应方法

所有的框架,本质都是通过请求方式, 反射不同的函数

所以CBV的本质,其实还是用的FBV, 只不过用类封装了而已

4. 给CBV加装饰器 method_decorator

  1. from django.utils.decorators import method_decorator

       加载到某个get 或者 post的方法上:

  1. @method_decorator(timer)
  2. def get(self, request):

    加在self.dispatch方法上:

  1. @method_decorator(timer)
  2. def dispatch(self, request, *args, **kwargs):

    加在类上:

  1. @method_decorator(timer, name='post')
  2. @method_decorator(timer, name='get')
  3. class AddPublisher(View):

5. 区别

  1. 不使用method_decorator

func: <function AddPublisher.dispatch at 0x00000163735176A8>args :<app01.views.AddPublisher object at 0x00000163735F7EF0> <WSGIRequest: GET '/add_publisher/'>

  1. 使用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的属性和方法

  1. print(request.method) # 请求方式   GET 、POST
  2. print(request.GET) # get的请求数据 QueryDict{} url携带参数
  3. print(request.POST) # post的请求数据 QueryDict{} form表单提交的post数据
  4. 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中获取文件对象

  1. print(request.is_ajax()) #是否是ajax请求
  2. print(request.get_host())
  3. print(request.get_full_path()) # 路径信息 + 参数

response对象

  1. 1. HttpResponse("字符串") --->字符串
  2. 2. render(request,"模板文件名",{k:v}) ----->完整的页面
  3. 3. redirect("要跳转的地址")---> 本质是响应头:Location:url
  4. 1. ret=HttpResponse() ret["Location"]=url(设置响应头)
  5.  
  6. 4. JsonResponse({字典}) ContentType:application/json
  7. 1.传非字典类型的时候设置: safe=False

文件上传 

view.py

  1. # 上传文件
  2. def upload(request):
  3. if request.method == 'POST':
  4. # print(request.body)
  5. file = request.FILES.get('f1')
  6. with open(file.name, 'wb') as f:
  7. for chunk in file.chunks():
  8. f.write(chunk)
  9. return HttpResponse('上传成功')
  10.  
  11. return render(request, 'upload.html')
  12.  
  13. import json
  14. from django.http import JsonResponse
  15.  
  16. def json_test(request):
  17. data = {'name': 'alex', 'pwd': 'alexdsb'}
  18.  
  19. ret = HttpResponse(json.dumps(data))
  20. ret['Content-Type'] = 'application/json'
  21. ret['xxx'] = 'axxx'
  22. return ret
  23. # return HttpResponse(json.dumps(data), content_type='application/json') # Content-Type: text/html; charset=utf-8
  24. # return JsonResponse(data) # Content-Type: application/json

template

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="" method="post" enctype="multipart/form-data">
  9. {% csrf_token %}
  10. 文件:<input type="file" name="f1">
  11. <button>上传</button>
  12. </form>
  13. </body>
  14. </html>

上传文件注意事项:

  1. form表单的enctype = 'multipart/form-data'

  2. request.FILES中获取文件对象

  3. 使用文件对象的chunks()

JsonResponse 作用是做序列化的

服务器--->浏览器

Contenttype:json

  1. from django.http import JsonResponse
  2.  
  3. def json_test(request):
  4. data = {'name': 'alex', 'pwd': 'alexdsb'}
  5.  
  6. return JsonResponse(data) # Content-Type: application/json
  7. # return HttpResponse(json.dumps(data), content_type='application/json') # Content-Type: text/html; charset=utf-8

视图系统CBV 和 response的更多相关文章

  1. Django 视图系统

    Django 视图系统 概念 一个视图函数,简称视图,是一个简单的Python函数,用于接受Web请求并返回Web响应. 通常将视图函数写在project或app目录中的名为views.py文件中 简 ...

  2. Django框架详细介绍---视图系统

    Django视图系统 1.什么是视图 在Django中,一个视图函数/类,称为视图.实质就是一个用户自定义的简单函数,用来接收WEB请求并xing响应请求,响应的内容可以是一个HTML文件.重定向.一 ...

  3. Django框架简介-视图系统

    2.3 视图系统 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档 ...

  4. django框架--视图系统

    目录 一.视图函数的理解 二.视图函数的定位 三.请求对象HttpRequest 四.响应对象HttpResponse 一.视图函数的理解 视图函数的作用是,对指定的url执行业务逻辑,视图函数将会作 ...

  5. 运维开发笔记整理-基于类的视图(CBV)

    运维开发笔记整理-基于类的视图(CBV) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.FBV与CBV 1>.什么是FBV FBC(function base views ...

  6. django之视图系统 views.py-->主要内容(FBV和CBV、dispath、request对象和request.FILES、JsonResponse)

    一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 一 视图的实现可以基于两种方法: 1 基于函数的形式 FBV 使用装饰器装饰FBV  直接在上 ...

  7. Python学习(三十二)—— Django之视图系统

    转载自:http://www.cnblogs.com/liwenzhou/articles/8305104.html Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Pyth ...

  8. Django之视图系统

    Django的View(视图) 一个视图函数(类),简称视图,是一个简单的python函数(类),它接受web请求并返回web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,或者 ...

  9. python 终极篇 --- django 视图系统

    Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

随机推荐

  1. WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容

    原文:WPF实现选项卡效果(3)--自定义动态添加的AvalonDock选项卡内容 简介 在前面一篇文章里面,我们实现了AvalonDock选项卡的动态添加,但是对于选项卡里面的内容,我们并没有实现任 ...

  2. Angularjs 计数 $index

    $index可以在ng-repeat直接使用,从0开始计数 <div ng-repeat="item in vm.data"> <!--从0开始计数--> ...

  3. DotNetBar for Windows Forms 14.0.0.15_冰河之刃重打包版发布

    关于 DotNetBar for Windows Forms 14.0.0.15_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版------------- ...

  4. 读BeautifulSoup官方文档之与bs有关的对象和属性(2)

    上一节说到tag, 这里接着讲, tag有个属性叫做string, tag.string其实就是我们要掌握的四个对象中的第二个 ---- NavigableString,  它代表的是该tag内的te ...

  5. liunx 详细常用操作

    图片来自: http://www.cnblogs.com/zhangsf/archive/2013/06/13/3134409.html 公司新员工学习有用到,Vim官网的手册又太大而全,而网上各方资 ...

  6. C++得到当前进程所占用的内存

    原文地址:C++得到当前进程所占用的内存作者:雪碧狗 使用SDK的PSAPI (Process Status Helper)中的BOOL GetProcessMemoryInfo(  HANDLE P ...

  7. miniui autocomplete支持放大镜按钮(data-grid)

    <style type="text/css"> html body .searchbox .mini-buttonedit-close { background:url ...

  8. Inno Setup制作最简单的安装程序

    目标就是[把exe程序放到制定目录,然后自动把工程需要的dll放到system32目录下,自动注册注册表.] 实现上述需求,用Inno Setup可以非常方便快捷实现. 安装Inno Setup. 点 ...

  9. UWP的TextBox和PasswordBox使用输入范围更改触摸键盘InputScope

    原文:UWP的TextBox和PasswordBox使用输入范围更改触摸键盘InputScope 当你的应用运行在具有触摸屏的设备上时,触摸键盘可用于文本输入.当用户点击可编辑的输入字段(如 Text ...

  10. Mac OS下terminal的快捷键

    时隔2年又开始使用Mac OS系统,之前的很多快捷键和常用的命令都忘记了,使用起来确实不方便,效率也低,特别是terminal下,所以对于terminal又找了一下并整理如下,希望对后来的同学也有用: ...