Django视图(View)

Django 视图

声明:文章部分内容来源https://www.cnblogs.com/maple-shaw/articles/9285269.html

  • 视图的概念:一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片
  • 视图的规范:无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。

简单的视图

from django.http import HttpResponse
import datetime
#从 django.http模块导入了HttpResponse类,以及Python的datetime模块。

def current_datetime(request):
    #定义了current_datetime函数。它就是视图函数。每个视图函数都使用HttpRequest对象作为第一个参数,并且通常称之为request。
    now = datetime.datetime.now()
    #获取当前时间
    html = "<html><body>It is now %s.</body></html>" % now
    #定义一个变量等于后面的字符串
    return HttpResponse(html)
#返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。

Django使用请求和响应对象来通过系统传递状态。

当浏览器向服务端请求一个页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据。然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数。

每个视图负责返回一个HttpResponse对象。

CBV和FBV

FBV:基于函数的视图
  • fbv基础格式
from django.http import HttpResponse
#导入HttpResponse模块,这个模块可以帮我们把字符串返回给网页
def add_class(request):
    if request.method == "POST":
        return HttpResponse("POST")
    return HttpResponse('GET')
#实现效果,如果发过来的是GET请求就返回GET,如果是POST请求就返回POST
CBV:基于类的视图
  • cbv的基础格式
from django.http import HttpResponse
from django.views import View
#导入HttpResponse和View导入视图模块,方便我们创建类时继承View
class AddClass(View):

    def get(self, request):#处理get请求
        return HttpResponse('get')

    def post(self, request):#处理post请求
        return HttpResponse('post')
#实现效果,如果发过来的是GET请求就返回GET,如果是POST请求就返回POST    
  • 使用cbv的优点可以根据接收的不同请求,执行相应的方法,在fbv中需要更多if判断,不如cbv,看起来方便
  • 使用cbv时,url的配置
#在url中的修改配置
url(r'^add_class/$', views.要使用的类的名字.as_view())

给视图加装饰器

给FBV加装饰器
  • FBV本身就是一个函数,所以根普通的函数加装饰器方法无差别:

    def wrapper(func):
      def inner(*args, **kwargs):
          start_time = time.time()#在执行前计算时间戳
          ret = func(*args, **kwargs)
          end_time = time.time()#执行后的时间戳
          print("函数执行时间是:", end_time-start_time)
          return ret
      return inner
    #装饰器作用,求出函数执行的时间,并输出
    
    @wrapper
    def add_class(request):
      if request.method == "POST":
          return HttpResponse("POST")
      return HttpResponse('GET')    
给CBV加装饰器
  • Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。

    from django.utils.decorators import method_decorator#导入方法
    def timer(func):
      def inner(*args, **kwargs):
          start_time = time.time()#在执行前计算时间戳
          ret = func(*args, **kwargs)
          end_time = time.time()#执行后的时间戳
          print("函数执行时间是:", end_time-start_time)
          return ret
      return inner
    
    #直接加在类中方法上
    @method_decorator(timer)括号内为装饰器自己写的装饰器名字
    def get(self, request, *args, **kwargs):
    
    #加在dispatch方法上
    #方式一
    @method_decorator(timer)
    def dispatch(self, request, *args, **kwargs):
      # print('before')
      ret = super().dispatch(request, *args, **kwargs)
      # print('after')
      return ret
    #方式二
    @method_decorator(timer,name='dispatch')
    class AddPublisher(View):
    
    #加在类上
    #@method_decorator(timer,name='post')name代表要加在类中方法的名字
    @method_decorator(timer,name='get')
    class AddPublisher(View):
  • 当然直接给类中方法加装饰器也是可以的,不过和通过使用method_decorator的有一些区别,下面我们就通过代码看下具体区别吧

    直接装饰,打印func,args结果:
    func结果:<function AddClass.get at 0x03DF5390> 
    args结果:(<app.views.AddClass object at 0x040D8D10>, <WSGIRequest: GET '/cbv'>)
    
    通过method_decorator装饰,打印func,args结果:
    func结果:<function method_decorator.<locals>._dec.<locals>._wrapper.<locals>.bound_func at 0x045ED540> 
    args结果:(<WSGIRequest: GET '/cbv'>,)
    
    区别:通过上面代码,我们可以看出直接加装饰器的话,装饰器的args是有两个值的,后面的值才是request对象,使用时需要取索引位置1的值才能够调用request对象,
    而通过method_decorator装饰,装饰器args只有一个值,使用request时只需要取索引位置0的值就能够调用request对象,所以我们使用时需要注意加装饰器的方法和args到底应该取得哪个位置!!!!!

request对象

request属性 作用
request.methot 请求方式
request.path_info URL的路径 不包含ip和端口 不包含参数
request.POST POST请求提交的数据
request.body 请求体, byte类型 request.POST的数据就是从body里面提取到的
request.FILES 上传的文件
request.META 请求头
request.COOKIES 后面讲
request.session 后面讲
request.encoding 表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
  • request.body

      一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
    
      但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。
    
      另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read() 。
  • request.FILES

    一个类似于字典的对象,包含所有的上传文件信息。
     FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
    
      注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会
     包含数据。否则,FILES 将为一个空的类似于字典的对象。
    • 上传文件实例
    def file(request):#定义一个函数
        if request.method == "POST":#如果类型为post
            fname = request.FILES.get('f1')#取出发送来的对象
            with open(fname.name,'wb') as f:#fname.name方法能够取出上传的文件名称
                for i in fname.chunks():#fname.chunks()方法能够取出上传的数据,进行for循环
                    f.write(i)#把循环的值写入打开的文件
                return HttpResponse('上传ok')#上传完毕后返回成功
        return render(request,'sc.html')#如果不是post请求返回sc.html页面
  • request.META

      一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
    
      CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
      CONTENT_TYPE —— 请求的正文的MIME 类型。
      HTTP_ACCEPT —— 响应可接收的Content-Type。
      HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
      HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
      HTTP_HOST —— 客服端发送的HTTP Host 头部。
      HTTP_REFERER —— Referring 页面。
      HTTP_USER_AGENT —— 客户端的user-agent 字符串。
      QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
      REMOTE_ADDR —— 客户端的IP 地址。
      REMOTE_HOST —— 客户端的主机名。
      REMOTE_USER —— 服务器认证后的用户。
      REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
      SERVER_NAME —— 服务器的主机名。
      SERVER_PORT —— 服务器的端口(是一个字符串)。
      从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
      都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_  前缀。
      所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。
    
    #注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
    request.POST.getlist("")取值
request方法 作用
request.get_full_path() URL的路径 不包含ip和端口 包含参数
request.is_ajax() 判断是不是ajax请求

Httpresponse对象

  • 与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。
  • HttpResponse类位于django.http模块中。
Httpresponse属性 作用
HttpResponse.content 响应内容
HttpResponse.charset 响应内容的编码
HttpResponse.status_code 响应的状态码
  • JsonResponse对象

    • JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。

    • 实例
    from django.shortcuts import render, redirect, HttpResponse
    HttpResponse('字符串')    ——》  ’字符创‘
    render(request,'模板的文件名',{k1:v1})   ——》 返回一个完整的TML页面
    redirect('重定向的地址')    ——》 重定向   Location : 地址
    
    from django.http.response import JsonResponse
    JsonResponse({})
    JsonResponse([],safe=False)
    • JsonResponse默认只能传递字典类型,如果非要传非字典类型需要设置safe关键字参数

猜你喜欢

转载自blog.51cto.com/11985686/2411645