一、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. Go语言goroutine调度器初始化(12)

    本文是<Go语言调度器源代码情景分析>系列的第12篇,也是第二章的第2小节. 本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调 ...

  2. linux基础-ssh服务

    SSH ssh 服务是实现管路服务器的一种方式: 本地管理(安装系统,故障修复),ssh 远程连接 linux 可以是实现远程连接的方式:ssh 命令 windows 可以实现远程连接方式: xshe ...

  3. 201871010106-丁宣元 《面向对象程序设计(java)》第十三周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第十三周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...

  4. SpringBoot注解分析解释

    使用注解的优势: 1.采用纯java代码,不在需要配置繁杂的xml文件 2.在配置中也可享受面向对象带来的好处 3.类型安全对重构可以提供良好的支持 4.减少复杂配置文件的同时亦能享受到springI ...

  5. Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务

    实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...

  6. [Python] Python 模拟登录,并请求

    Python 模拟登录,并请求 # encoding: utf- import requests import socket import time socket.setdefaulttimeout( ...

  7. 7.18 NOIP模拟测试5 星际旅行+砍树+超级树

    T1 星际旅行 题意:n个点,m条边,无重边,有自环,要求经过m-2条边两次,2条边一次,问共有多少种本质不同的方案.本质不同:当且仅当至少存在一条边经过次数不同. 题解:考试的时候理解错题,以为他是 ...

  8. [TJOI2019]唱,跳,rap,篮球(生成函数,组合数学,NTT)

    算是补了个万年大坑了吧. 根据 wwj 的题解(最准确),设一个方案 \(S\)(不一定合法)的鸡你太美组数为 \(w(S)\). 答案就是 \(\sum\limits_{S}[w(S)=0]\). ...

  9. oracle--CRS-0215 : Could not start resource 'ora.node2.ons'.

    01,问题描述 安装10G+RAC集群,在node2进行vipca操作的时候发现这个问题 02,问题解决 原因是少了host的回环地址,当时删除错了 添加进去即可 127.0.0.1 localhos ...

  10. win10 连接samba 账号密码不正确,win7可以访问

    1.本地安全策略,本地策略-安全选项,需要修改成默认的值的修改方式: 查找注册表浏览到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA ...