zoukankan      html  css  js  c++  java
  • 视图

    CBV和FBV

    基于函数的
    def add_class(request):
        if request.method == "POST":  #判断请求方式
            class_name = request.POST.get("class_name")  #拿到数据
            models.Classes.objects.create(name=class_name) #数据库中创建
            return redirect("/class_list/") #重定向
        return render(request, "add_class.html") #如果是get请求,返回页面
    基于类的
    from django.views import View
    class AddClass(View):  
    
        def get(self, request):  #get请求
            return render(request, "add_class.html")
    def post(self, request): #post请求 class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
    注意:使用CBV时候.urls.py中也要相应的做出修改
    url(r'^add_class/$', views.AddClass.as_view()), #urls.py

    给视图函数加装饰器

    FBV本身就是一个函数,所以和给普通函数加装饰器无差别

    def wrapper(func):
        def inner(*args,**kwargs):
            start_time = time.time()
            ret = func(*args, **kwargs)
            end_time = time.time()
            print("used:", end_time-start_time)
            return ret
        return inner 
    # FBV版添加班级
    @wrapper
    def add_class(request):
        if request.method == "POST":
            class_name = request.POST.get("class_name")
            models.Classes.objects.create(name=class_name)
            return redirect("/class_list/")
        return render(request, "add_class.html")

    装饰器装饰CBV

    类中的方法和独立函数不完全相同,因此不能直接应用于类中的方法,要先将其转换为方法装饰器
    django 提供了 method_decorator装饰器用于将函数装饰器转换为方法装饰器
    # CBV版添加班级
    from django.views import View
    from django.utils.decorators import method_decorator  
    class AddClass(View):
        @method_decorator(wrapper)
        def get(self, request):
            return render(request, "add_class.html")
        def post(self, request):
            class_name = request.POST.get("class_name")
            models.Classes.objects.create(name=class_name)
            return redirect("/class_list/")
    扩展 装饰器 CBV
    使用CBV时要注意,请求过来后会先执行dispatch()这个方法,
    如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,
    这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。
    class Login(View): def dispatch(self, request, *args, **kwargs): print('before') obj = super(Login,self).dispatch(request, *args, **kwargs) print('after') return obj def get(self,request): return render(request,'login.html') def post(self,request): print(request.POST.get('user')) return HttpResponse('Login.post')

    request 对象 和 response 对象

    request对象,当一个页面被请求时,django就会创建一个包含本次请求原信息的HttpRequest对象
    django会将这个对象自动传递给响应的视图函数,一般views函数使用request参数接收这个对象
    常用的相关值:
    path_info  返回url,不含域名
    method     HTTP方法的字符串表示,全大写
    GET          包含所有HTTP  GET参数的类字典对象
    POST        包含所有HTTP POST参数的类字典对象
    body         请求体,byte类型request.POST的数据就是从body里面提取到的

    HttpRequest.COOKIES 一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
    HttpRequest.FILES
      一个类似于字典的对象,包含所有的上传文件信息。
       FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
      注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会
       包含数据。否则,FILES 将为一个空的类似于字典的对象
    上传文件
    def upload(request):
        """
        保存上传文件前,数据需要存放在某个位置。默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。从内存读取一次,写磁盘一次。
        但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。
        """
        if request.method == "POST":
            # 从请求的FILES中获取上传文件的文件名,file为页面上type=files类型input的name属性值
            filename = request.FILES["file"].name 
            with open(filename, "wb") as f:      #项目目录下新建文件
                for chunk in request.FILES["file"].chunks()  #一点点读            
                    f.write(chunk)  #写入本地文件
            return HttpResponse("上传OK")
    HttpRequest.META
       一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器
    
    
    HttpRequest.session
       一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用

    方法

    1.HttpRequest.get_host()  "127.0.0.1:8000"
    2.HttpRequest.get_full_path() 
      "/music/bands/the_beatles/?print=true"
    3.HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
     返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。
    
      如果提供 default 参数,将不会引发异常并返回 default 的值。
    
      可选参数salt 可以用来对安全密钥强力攻击提供额外的保护。max_age 参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age 秒。
    4.HttpRequest.is_secure()
    如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的
    5.HttpRequest.is_ajax()
    如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest'
    
    注意: 键值对的值是多个的话,比如CheckBox类型的input,select标签,需要用:
    request.Post.getlist('hobby')'

    response 对象

    HttpResponse.content:响应内容

    HttpResponse.charset:响应内容的编码

    HttpResponse.status_code:响应的状态码

    JsonResponse 对象

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

    from django.http import JsonResponse
    response = JsonResponse({'foo':'bar'})
    print(response.content)
    
    b'{"foo":"bar"}
    默认只能传字典,若要传递别的类型小设置一下safe关键字参数
    response = JsonResponse([1,2,3],safe=False)

    Django shortcut functions

    from django.shortcuts import render,reverse,redirect,HttpResponse
    
    def add_day(request):
        xxx
        return render(request,'xx.html',{键:值})
        return redirect('/xxx/')
        return redirect('http://www.baidu.com/')
    
    默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向
    
    响应状态码
    302 -临时重定向
    301 -永久重定向
  • 相关阅读:
    .netcore3.1添加swagger及JWT Authorize 验证
    Quartz.Net实现简单定时任务调度
    基于.Net Framework进行配置Swagger
    升级anaconda的python版本命令
    使用jmeter自带的html查看测试报告
    软件质量模型的6大特性和27个子特性
    PyQt5基础教程及官方文档
    使用jmeter进行下载并发测试
    selenium官方入门文档
    web driver 驱动配置位置
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10445431.html
Copyright © 2011-2022 走看看