Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request请求对象方法,属性和Response响应对象,form表单的上传

一丶CBV和FBV

      在Django中存在存在两种url和视图对应的形式:类和函数

CBV:类视图

  1. ##### class based view 基于类
  2. ### 出版社添加 urls.py中填写url和类的对应关系.
  3. #PublishAdd是类,要执行as_view()方法
  4. url('^publish_add',views.PublishAdd.as_view()), # CBV
  5. ### 添加出版社,在app下的views.py写代码
  6. class PublishAdd(View):
  7. def get(self, request): # 执行get请求 , request手动传参
  8. return render(request, 'publish_add.html')
  9. def post(self, request): # 执行post请求
  10. pname = request.POST.get('pname')
  11. paddr = request.POST.get('paddr')
  12. if not pname:
  13. error = '内容不允许为空'
  14. elif models.Publish.objects.filter(pname=pname):
  15. error = '出版社已存在'
  16. else:
  17. # 往数据库中插入数据
  18. models.Publish.objects.create(pname=pname, paddr=paddr)
  19. return redirect(to='/publish_list/')
  20. res = {'error': error, 'pname': pname, 'paddr': paddr}
  21. return render(request, 'publish_add.html', res)

FBV:函数视图

  1. ## function based view 基于函数
  2. #出版社添加
  3. url('^publish_add',views.publish_add), # FBV
  4. ### publish_add 函数
  5. def publish_add(request):
  6. error, pname, paddr = '', '', ''
  7. if request.method == 'POST': # 判断请求的方式是不是post
  8. pname = request.POST.get('pname')
  9. paddr = request.POST.get('paddr')
  10. if not pname:
  11. error = '内容不允许为空'
  12. elif models.Publish.objects.filter(pname=pname):
  13. error = '出版社已存在'
  14. else:
  15. # 往数据库中查数据
  16. models.Publish.objects.create(pname=pname, paddr=paddr)
  17. return redirect(to='/publish_list/')
  18. res = {'error': error, 'pname': pname, 'paddr': paddr}
  19. return render(request, 'publish_add.html', res)

二丶CBV的运行流程

  1. 1. 项目启动时,运行urls.py
  2. url(r'^publisher_add/',views.AddPublisher.as_view() ),
  3. AddPublisher.as_view() 执行 ——》 执行当前类的as_view方法,如果没有当前类没有,就执行父类的View函数.
  4. 2. 请求到来时,实行view函数:
  5. 1. 实例化AddPublisher ——》 self
  6. 2. self.request = request
  7. 3. 执行Viewself.dispatch(request, *args, **kwargs)
  8. 1. 判断请求方式是否被允许
  9. 1. 允许
  10. 通过反射获取请求方式对应的方法 ——》 handler
  11. 2. 不允许
  12. self.http_method_not_allowed ——》 handler
  13. 2. 执行handler 获取到响应
  1. ### 源码:
  2. ### view 函数
  3. def view(request, *args, **kwargs): # 执行view函数
  4. self = cls(**initkwargs) # 实例化一个当前类对象,cls指的是当前类名.加()实例化对象
  5. if hasattr(self, 'get') and not hasattr(self, 'head'):
  6. self.head = self.get # 给对象封装属性
  7. self.request = request
  8. self.args = args
  9. self.kwargs = kwargs
  10. return self.dispatch(request, *args, **kwargs) #### 重点:执行调遣函数,确认是执行哪一个方法.
  11. view.view_class = cls
  12. view.view_initkwargs = initkwargs
  13. # take name and docstring from class
  14. update_wrapper(view, cls, updated=())
  15. # and possible attributes set by decorators
  16. # like csrf_exempt from dispatch
  17. update_wrapper(view, cls.dispatch, assigned=())
  18. return view # 返回一个view函数执行的结果
  19. ### despatch函数
  20. def dispatch(self, request, *args, **kwargs):
  21. # 判断请求是否被允许
  22. if request.method.lower() in self.http_method_names:
  23. # 通过反射去执行具体的请求方法对应的请求函数.
  24. handler = getattr(self, request.method.lo
  25. handler = self.http_method_not_allowed
  26. return handler(request, *args, **kwargs) # 把结果交给handler处理 ,handler是执行的是http_method_not_allowed方法

三丶给视图加装饰器

CBV加装饰器

  1. PS:# get方法上也可以直接加上装饰器.也能实现额外的功能,但是不推荐使用.最好是使用method_decorator()进行'加工'装饰
  2. from django.utils.decorators import method_decorator # 给方法加上装饰器
  3. ### 计时间装饰器
  4. def timmer(func):
  5. def inner(*args, **kwargs):
  6. # print('查看是方法还是函数:',func)
  7. # print('查看参数的类型:',args,type(args))
  8. # print(kwargs)
  9. start_time = time.time()
  10. ret = func(*args, **kwargs)
  11. print(f'当前函数运行时间:{time.time() - start_time}')
  12. return ret
  13. return inner
  14. @method_decorator(timmer, name='dispatch') # 在类上指定具体的某个方法加上装饰器
  15. class PublishAdd(View):
  16. # @timmer # 这种方式也可以实现功能,但是传递的参数不一样,不推荐使用. 参数回到计时装饰器查看
  17. # 函数 : 这是一个函数 <function PublishAdd.dispatch at 0x000001F6B675CEA0>
  18. # 参数 : 不能直接获取WSGIRequest对象 (<app01.views.PublishAdd object at 0x000001F6B6898B38>, <WSGIRequest: GET '/publish_add/'>)
  19. # @method_decorator(timmer) # 给所有的请求方法都加上了装饰器
  20. # 绑定方法: <function method_decorator.<locals>._dec.<locals>._wrapper.<locals>.bound_func at 0x0000019DB9AE2D08>
  21. # 参数: (<WSGIRequest: GET '/publish_add/'>,) <class 'tuple'>
  22. def dispatch(self, request, *args, **kwargs):
  23. ret = super(PublishAdd, self).dispatch(request, *args, **kwargs)
  24. return ret
  25. def get(self, request):
  26. return render(request, 'publish_add.html')
  27. def post(self, request):
  28. pname = request.POST.get('pname')
  29. paddr = request.POST.get('paddr')
  30. if not pname:
  31. error = '内容不允许为空'
  32. elif models.Publish.objects.filter(pname=pname):
  33. error = '出版社已存在'
  34. else:
  35. # 往数据库中插入数据
  36. models.Publish.objects.create(pname=pname, paddr=paddr)
  37. return redirect(to='/publish_list/')
  38. res = {'error': error, 'pname': pname, 'paddr': paddr}
  39. return render(request, 'publish_add.html', res)

FBV加装饰器

  1. # 由于是函数可以直接加上装饰器
  2. ### 计时间装饰器
  3. def timmer(func):
  4. def inner(*args, **kwargs):
  5. # print('查看是方法还是函数:',func)
  6. # print('查看参数的类型:',args,type(args))
  7. # print(kwargs)
  8. start_time = time.time()
  9. ret = func(*args, **kwargs)
  10. print(f'当前函数运行时间:{time.time() - start_time}')
  11. return ret
  12. return inner
  13. @timmer
  14. def publish_add(request):
  15. error, pname, paddr = '', '', ''
  16. if request.method == 'POST': # 判断请求的方式是不是post
  17. pname = request.POST.get('pname')
  18. paddr = request.POST.get('paddr')
  19. if not pname:
  20. error = '内容不允许为空'
  21. elif models.Publish.objects.filter(pname=pname):
  22. error = '出版社已存在'
  23. else:
  24. # 往数据库中查数据
  25. models.Publish.objects.create(pname=pname, paddr=paddr)
  26. return redirect(to='/publish_list/')
  27. res = {'error': error, 'pname': pname, 'paddr': paddr}
  28. return render(request, 'publish_add.html', res)

四丶Request请求 -- 属性和方法

  1. ret2 = request.method # 获得请求方式
  2. ret3 = request.GET # GET请求方式,url上携带的参数
  3. ret4 = request.POST # POST请求方式,post请求提交的参数
  4. ret5 = request.path_info #路径信息 (不包含IP和端口 也不包含查询参数)
  5. ret6 = request.body # 请求体的信息
  6. ret7 = request.COOKIES # cookie信息
  7. ret8 = request.session # session信息
  8. ret9 = request.FILES # 获得上传文件信息
  9. ret10 = request.META # 获得所有的头信息
  10. ret11 = request.is_ajax()
  11. ret12 = request.get_full_path()

五丶form表单上传文件

  1. ###input框的类型为file ,需要在 form表单设置method提交方式 'post' 和 enctype='multipart/form-data'
  2. <form class="form-inline" action="" method="post" enctype="multipart/form-data">
  3. <div class="form-group">
  4. <label for="exampleInputName2">文件上传</label>
  5. <input type="file" class="form-control" id="" name="file-upload" multiple>
  6. </div>
  7. <button type="submit" class="btn btn-default">上传</button>
  8. </form>
  1. ## 上传文件的后端代码
  2. def post(self,request):
  3. file_data=request.FILES.get('file-upload') # 使用FILES获得上传文件
  4. print(file_data,type(file_data)) # 打印类型
  5. upload_file_dirs=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  6. print(upload_file_dirs)
  7. with open(os.path.join(upload_file_dirs,'upload',file_data.name),'wb') as f:
  8. for line in file_data.chunks():
  9. f.write(line)
  10. return redirect(to='/index_test/')

六丶Response响应

  1. # HttpResponse 返回字符串
  2. # render 返回一个页面 ,基于HttpResponse
  3. # redirect 重定向 ,基于HttpResponse
  4. # JsonResponse 返回json格式的数据 ,基于HttpResponse
  5. ### 最终都返回的是HttpResponse的字符串

      JsonResponse的使用

  1. from django.http.response import JsonResponse # 导入模块
  2. def json_response(request):
  3. data={'name':'abc','age':18} # 字典类型的数据,默认支持
  4. data2=['1','2','3'] # 默认不支持列表或其他类型的数据.需要设置一个条件,safe=False
  5. # 如:JsonResponse(data2,safe=False)
  6. return JsonResponse(data)

Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request对象方法,属性和Response对象,form表单的上传的更多相关文章

  1. Django基础之给视图加装饰器

    1. 使用装饰器装饰FBV FBV本身就是一个函数,所以和给普通的函数加装饰器无差: def wrapper(func): def inner(*args, **kwargs): start_time ...

  2. Django 基于Ajax & form 简单实现文件上传

    前端实现 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="U ...

  3. django中form表单的提交:

    一,关于表单: 表单在百度百科的解释:   表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域 ...

  4. Django的form表单之文件上传

    在生成input标签的时候可以指定input标签的类型为file类型 <!DOCTYPE html> <html lang="en"> <head&g ...

  5. Django中三种方式写form表单

    除了在html中自己手写form表单外,django还可以通过 继承django.forms.Form 或django.forms.ModelForm两个类来自动生成form表单,下面依次利用三种方式 ...

  6. django基础之FBV与CBV,ajax序列化补充,Form表单

    目录: FBV与CBV ajax序列化补充 Form表单(一) 一.FBV与CBV 1.什么是FBV.CBV? django书写view时,支持两种格式写法,FBV(function bases vi ...

  7. python自动化开发-[第二十天]-form表单,CBV和FBV,序列化

    1.CBV和FBV的用法 2.序列化用法 3.form表单 一.CBV和FBV 1.cbv是 class based view(基于类),fbv是function based view(基于函数) 2 ...

  8. Django CBV加装饰器、Django中间件、auth模块

    一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...

  9. JsonResponse类的使用、form表单上传文件补充、CBV和FBV、HTML的模板语法之传值与过滤器

    昨日内容回顾 Django请求生命周期 # 1.浏览器发起请求 到达Django的socket服务端(web服务网关接口) 01 wsgiref 02 uwsgi + nginx 03 WSGI协议 ...

随机推荐

  1. TL-WDN5200H无线usb网卡在Linux上的使用

    买了个TL-WDN5200H无线usb网卡,但是发现它居然不支持Linux,但是我有时需要在Linux上使用,这就尴尬了.于是到网上搜索资料,终于解决了这个问题. 首先编译安装:https://git ...

  2. 我以为我对Kafka很了解,直到我看了此文章

    Kafka 是一个消息系统,原本开发自 LinkedIn,用作 LinkedIn 的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础. 现在它已被多家不同类型的公司 ...

  3. sqlyog 下载

    https://www.cnblogs.com/givemelove/p/7777975.html

  4. LeetCode 1123. Lowest Common Ancestor of Deepest Leaves

    原题链接在这里:https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves/ 题目: Given a rooted b ...

  5. CSP 2019游记 & 退役记

    扶苏让我记录他AK CSP 的事实 ZAY NB!!! "你不配" 两年半的旅行结束了,我背着满满的行囊下了车,望着毫不犹豫远去的列车,我笑着哭了,笑着翻着我的行囊-- 游记 Da ...

  6. Spring Boot 知识笔记(整合Mybatis)

    一.pom.xml中添加相关依赖 <!-- 引入starter--> <dependency> <groupId>org.mybatis.spring.boot&l ...

  7. C++判断计算式是大端存储模式,还是小端存储模式

    小端存储:数据的低字节存储在地址空间的低字节位,数据的高字节存储在地址空间的高字节位. 大端存储:数据的低字节存储在地址空间的高字节位,数据的高字节存储在地址空间的低字节位. 判断计算机是小端还是大端 ...

  8. express框架,使用 static 访问 public 内静态文件

    使用 express 生成 node 服务器后,我们需要访问放在public文件夹内的静态文件,如上传的图片 我们需要在app.js中添加配置项: app.use('/public',express. ...

  9. OpenCV+TensorFlow图片手写数字识别(附源码)

    初次接触TensorFlow,而手写数字训练识别是其最基本的入门教程,网上关于训练的教程很多,但是模型的测试大多都是官方提供的一些素材,能不能自己随便写一串数字让机器识别出来呢?纸上得来终觉浅,带着这 ...

  10. POJ-动态规划-典型问题模板

    动态规划典型问题模板 一.最长上升子序列(Longest increasing subsequence) 状态(最关键):f[N]为动规数组,f[i]表示从第一个字符开始,以a[i]为最后一个字符的序 ...