一、CBV和FBV

  1. FBV:functoin based view,基于函数的view

    • 我们之前写过的都是基于函数的view
  2. 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())
  3. 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)
          • 返回响应 --> 浏览器

二、视图加装饰器

  1. 装饰器示例:

    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
  2. FBV

    • 直接在函数上加装饰器
    @timer
    def publisher_list(request):
    pass
  3. 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
  4. 类的方法上也可以直接用@timer,效果等同于使用@method_decorator(timer)

    • 使用@timer和使用@method_decorator(timer)的区别:

      • 使用@timer:

        • 使用装饰器,取参数时【def inner(*args, **kwargs)】,第一个参数默认是self,第二个参数才是request对象
      • 使用@method_decorator(timer):
        • 使用装饰器,取参数时【def inner(*args, **kwargs)】,第一个参数就是request对象
    • 注意:之后取request对象做操作时,注意使用装饰器的方式,对应取request对象的方式也不同

三、 request对象

  1. 属性:

    • 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
  2. 方法:

    • request.get_host():获取主机的ip和端口
    • request.get_full_path():url的路径,不包含ip和端口,包含参数
    • request.is_ajax():判断是否是ajax请求,是返回Ture,否返回False
  3. 上传文件示例:

    • 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对象

  1. Response对象:render, redirect, HttpResponse

    from django.shortcuts import render, redirect, HttpResponse
    HttpResponse('字符串') # 返回字符串
    render(request,'模板的文件名',{k1:v1}) # 返回一个完整的HTML页面
    redirect('重定向的地址') # 返回重定向,Location:地址
  2. 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的更多相关文章

  1. django框架--视图系统

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

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

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

  3. Django之视图系统

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

  4. Django 基础 视图系统

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

  5. 【Django】视图系统

    目录 FBV 与 CBV 给视图加装饰器 使用装饰器装饰CBV 关于dispatch()方法 Request对象 与 Response对象 request对象 response对象 @ *** 一个视 ...

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

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

  7. Django的视图系统

    视图(views)概述 在前几篇文章中介绍了,client端通过http请求——去url的路由找到相应的视图函数——触发视图函数——再去modes取数据——取到数据后——再通过创建模——views函数 ...

  8. 03 Django之视图函数

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

  9. Django框架——基础之视图系统(View.py)

    Django框架之View.py(视图文件) 1. 视图简介 视图层是Django处理请求的核心代码层,我们大多数Python代码都集中在这一层面. 它对外接收用户请求,对内调度模型层和模版层,统合数 ...

随机推荐

  1. lf 前后端分离 (2) 课程数据获取,Serializer的返回

    一.关于课程数据的返回 在进行前后端分离时,会通过def 进行前后端传值, 本质上遵循rest 网址规范  增删改查查 get,post,put,del get(\d+) 1.在从数据库获取数据后,进 ...

  2. appium自动化常用API

    常用函数 一.获得信息类API (1)获取当前页面的activity名,比如: (.ui.login.ViewPage)  current_activity() 比如我们需要实现这个登录的功能时,主要 ...

  3. 201871010104-陈园园 《面向对象程序设计(java)》第十二周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第十二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  4. 【oracle】substr函数 字符截取

  5. 【redis】安装redis

    1.什么是redis? 非关系型数据库 2.为什么用redis? 非关系型数据库的一些优势,我这里用于缓存 3.怎么用redis? 安装,配置,用 4.怎么安装? 下载:http://download ...

  6. es启动失败

    Aug 09 21:43:23 10921114-elklogserver elasticsearch[30152]: 2018-08-09 21:43:23,068 main ERROR Null ...

  7. ASP.NET CoreMVC 中的视图

    ASP.NET Core MVC 中的视图 MVC 中的视图 用于显示Controller提供给它的 Model 的业务数据. 视图是带有嵌入 Razor 标记的 HTML 模板. 如果编程语言是 C ...

  8. Linux性能优化实战学习笔记:第二十七讲

    一.案例环境描述 1.环境准备 2CPU,4GB内存 预先安装docker sysstat工具 2.温馨提示 案例中 Python 应用的核心逻辑比较简单,你可能一眼就能看出问题,但实际生产环境中的源 ...

  9. 刷完欧拉计划中难度系数为5%的所有63道题,我学会了Rust中的哪些知识点?

    我为什么学Rust? 2019年6月18日,Facebook发布了数字货币Libra的技术白皮书,我也第一时间体验了一下它的智能合约编程语言MOVE,发现这个MOVE是用Rust编写的,看来想准确理解 ...

  10. mybatis使用associaton进行分步查询

    Employee类 public class Employee { private Integer id; private String lastName; private String email; ...