django视图系统

request对象

  • 常用属性和方法
      print(request) #wsgirequest对象
print(request.path) #请求路径 /index/
print(request.method) #请求方法 POST GET
print(request.POST) #post请求提交的数据<QueryDict:{'username':['root']}>
print(request.GET) #获取url中的查询参数 路径后面?a=1&b=1 返回 <QueryDict:{'a':['1'],'b':['2']}> 不是针对get请求的
print(request.body) #获取http请求消息格式的请求数据部分的内容 bytes类型 b''
print(request.META) #请求头信息
print(request.get_full_path()) #获取完整路径(包含查询参数) /index/?a=1
print(request.FILES) #上传的文件对象数据
print(request.FILES.get('file')) #返回文件对象 获取文件名可以用文件对象.name
#注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会
包含数据。否则,FILES 将为一个空的类似于字典的对象。
print(request.POST.get('username')) #获取键对应的值
print(request.GET.get('sex')) # 获取键对应的值
#多选提交来的数据通过getlist来获取
print(request.POST.getlist('hobby')) #['2','3']

response响应

常用方法

      from django.shortcuts import render,HttpResponse,redirect
return HttpResponse('你好') #回复字符串
return render(request,'home.html') #回复html页面
#重定向方法,参数是个路径
return redirect('/home/') #封装了302状态码,以及浏览器要重定向的路径

添加响应头键值对

      ret = render(request,'home.html')
ret['a'] = 'b' #添加响应头键值对
return ret

添加响应状态码

      ret = render(request,'home.html',status=202)#render修改状态码还可以这样改
ret.status_code = 201 #添加响应状态码
return ret #回复html页面

CBV和FBV

  • 两种视图逻辑的写法方法
      FBV:全称function based view,就是基于函数来写视图逻辑
CBV:全称class based view,就是基于类来写视图
  • 基于函数的写法
      urls.py写法
url(r'^index/(\d+)',views.index) views.py写法
def index(request,xx):
if request.method == 'get':
return render(request,'index.html')
elif rquest.method == 'post':
return HttpResponse('你好')
  • 基于类的视图写法
      urls.py文件写法
#类视图的url
url(r'^login/',views.LoginView.as_view()) views.py文件写法
#需要导入View这个类,然后继承View这个类
from django.views import View
#登录需求
class LoginView(View): #继承这个View父类
#get请求 获取login页面
def get(self,request):
return render(request,'login.html') #post请求,获取post请求提交的数据,并校验等
def post(self,request):
print(request.POST)
#<QueryDict:{'uname',['wei'],'pwd':['123']}>
return render(request,'login.html')

CBV源码重点(反射)

      from django.views import View
View里面的dispatch方法中的反射逻辑,实现了不同的请求方法,找到我们视图类中的对应方法执行
#源码如下:
@classonlymethod
def as_view(cls, **initkwargs):
"""
Main entry point for a request-response process.
"""
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError("You tried to pass in the %s method name as a "
"keyword argument to %s(). Don't do that."
% (key, cls.__name__))
if not hasattr(cls, key):
raise TypeError("%s() received an invalid keyword %r. as_view "
"only accepts arguments that are already "
"attributes of the class." % (cls.__name__, key)) def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
view.view_class = cls
view.view_initkwargs = initkwargs # take name and docstring from class
update_wrapper(view, cls, updated=()) # and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
return 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:
#http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) def http_method_not_allowed(self, request, *args, **kwargs):
logger.warning(
'Method Not Allowed (%s): %s', request.method, request.path,
extra={'status_code': 405, 'request': request}
)
return http.HttpResponseNotAllowed(self._allowed_methods())

FBV和CBV加装饰器

  • FBV和普通函数加装饰方式一样
      #装饰器函数
def outer(f):
def inner(request,*args,**kwargs):
print('执行之前做的事')
ret = f(request,*args,**kwargs)
print('执行之后做的事')
return ret
return inner
#使用装饰器
@outer
def books(request):
print('FBV执行了')
return HttpResponse('OK')
  • CBV加装饰器
      from django.utils.decorators import method_decorator #加装饰器需要导入这个类
from django.views import View #类视图需要导入这个View类,并继承这个父类 #装饰器函数
def outer(f):
def inner(request,*args,**kwargs):
print('执行之前')
ret = f(request,*args,**kwargs)
print('执行之后')
return ret
return inner
# 方法一 在每个方法上加装饰器
class LoginView(View):
@method_decorator(outer)
def get(self,request):
print('get方法')
return render(request,'home.html') @method_decorator(outer)
def post(self,request):
print('post方法')
return HttpResponse('ok') 方法二:统一加一个装饰器
class LoginView(View):
# 给类方法统一加装饰器,借助dispatch方法(父类的dispatch方法,
# 就是通过反射来完成不同的请求方法找到并执行我们自己定义的视图类的对应方法)
@method_decorator(outer)
def dispatch(self, request, *args, **kwargs):
print('调用方法之前')
ret = super().dispatch(request,*args,**kwargs) #重写父类的方法 返回的结果就是调用下面的get 或 post方法
print('调用方法之后')
return ret def get(self,request):
print('get方法执行啦')
return render(request,'home.html') def post(self,request):
print('post方法执行啦')
return HttpResponse('ok')
执行顺序:get方法和post方法
执行之前
调用方法之前
get方法执行啦
调用方法之后
执行之后 #方法三 在类上面加装饰器
@method_decorator(outer,name='post')
@method_decorator(outer,name='get')
class LoginView(View):
def get(self,request):
print('get方法来啦')
return render(request,'home.html') def post(self,request):
print('post方法来啦')
return HttpResponse('ok')

django学习第二天---django视图系统,基于类的视图写法,FBV和CBV加装饰器的更多相关文章

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

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

  2. django的FBV和CBV的装饰器例子

    备忘 def auth(func): def inner(request,*args,**kwargs): u = request.COOKIES.get('username111') if not ...

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

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

  4. Django-给视图加装饰器

    给FBV加装饰器 FBV:function based view FBV本身就是一个函数,所以跟普通函数加装饰器是一样的 # 装饰函数是要在APP文件中定义,本例是在app01\templatetag ...

  5. Django笔记&教程 7-1 基于类的视图(Class-based views)介绍

    Django 自学笔记兼学习教程第7章第1节--基于类的视图(Class-based views)介绍 点击查看教程总目录 1 介绍 Class-based views (CBVs) are view ...

  6. Django学习笔记之Django视图View

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

  7. Django——基于类的视图(class-based view)

    刚开始的时候,django只有基于函数的视图(Function-based views).为了解决开发视图中繁杂的重复代码,基于函数的通用视图( Funcation-based generic vie ...

  8. Django编写RESTful API(三):基于类的视图

    欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章中,主要讲的是请求和响应,项目里面views.py中的视图函数都是基于函数的,并且我们介绍了@api_view这个很有用的装 ...

  9. Django REST FrameWork中文教程3:基于类的视图

    我们也可以使用基于类的视图编写我们的API视图,而不是基于函数的视图.我们将看到这是一个强大的模式,允许我们重用常用功能,并帮助我们保持代码DRY. 使用基于类的视图重写我们的API 我们将首先将根视 ...

  10. django 中基于类的视图

    django 视图 分为两种: 1.  FBV  基于函数的视图      function   based  view 2.  CBV  基于类的视图         class   based  ...

随机推荐

  1. 【转帖】eBay 云计算“网”事:网络超时篇

    https://www.infoq.cn/article/JmCbkA0XX9NqrcX6loIo eBay技术荟 2020-06-19 本文字数:5508 字 阅读完需:约 18 分钟 导读 eBa ...

  2. [转帖]2022年 SRE、DevOps技能图谱

    https://zhuanlan.zhihu.com/p/568752990 在过去一段时间,我面试过一些 DevOps 相关从业者,并且曾经收到过一些知乎小伙伴的提问,针对于 DevOps 以及相关 ...

  3. 使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理

    背景 在上一篇文章中,我们已经了解到华为即将发布的鸿蒙操作系统纯血版本--鸿蒙 Next,以及各个互联网厂商开展鸿蒙应用开发的消息.其中,Taro作为一个重要的前端开发框架,也积极适配鸿蒙的新一代语言 ...

  4. vue3动态组件的展示

    需求描述 有些时候,我们需要做这样的处理. 点击A按钮的时候,出现组件A 点击B按钮的时候,出现组件B 点击C按钮的时候,出现组件C 这个时候,我们就可以使用动态组件了 动态组件 <templa ...

  5. IDM全版本激活工具

    前往IDM官网下载IDM IDM官网 下载破解工具 IDM激活工具.zip 解压打开激活工具选择1 然后回车耐心等待激活完成即可

  6. PicoPixel贴图查看器

    Pico Pixel Pico Pixel是一款纹理查看器,支持查看以下文件格式:TGA,BMP,JPG,DDS,PNG,OpenEXR, KTX, HDR, GIF, TIF. 此外,Pico Pi ...

  7. ShardingSphere

    目录 1.ShardingSphere分表与分库分表 2.ShardingSphere分库分表查询 3.自定义分片算法实现range查询 4.SPI扩展机制概述 5.stand通过SPI实现range ...

  8. 【深度学习项目五】:利用LSTM网络进行情感分析(NLP)

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别](https://blog.csdn.net/sinat_39620217/article/details/116749255?sp ...

  9. Centos安装Python3.8

    最直白的centos8安装python3.8yum install -y update安装 gcc和make插件:yum install gcc gcc-c++yum -y install gcc a ...

  10. SpringAOP配置要点

    一.基于配置文件 1.关于aop配置文件相关 <!--配置aop--> <aop:config> <!--配置切入点表达式--> <aop:pointcut ...