首页 > 其他分享 >视图层

视图层

时间:2023-08-01 17:24:18浏览次数:24  
标签:return get self request 视图 def view

三板斧问题

在视图函数写函数跟普通函数不一样,它需要传一个request参数给形参,而这个参数只能在函数中局部使用

所有视图函数不能够没有返回值,并且返回值还必须是httpresponse对象

The view app01.views.index didn't return an HttpResponse object. It returned None instead.
翻译:视图app01.views。index没有返回HttpResponse对象它返回None。

三板斧返回的都是httpresponse对象

flask中request使用的就是全局变量

from ... import request
def index():
    pass

def func():
    pass

JSONResponse序列化

JSON格式的数据的作用

主要就是实现跨语言数据传输

现在实现跨语言数据的传输使用的都是json,在以前使用的是xml(微信支付朝微信的后端发送参数的时候,使用的就是xml)

JSON格式的数据特点:数据里面使用的是双引号

{"username":"kevin","age":18}

Python中的序列化

import json
json.dumps 序列化
json.loads    反序列化

JS中的序列化

JSON.stringify()序列化
JSON.parse() 反序列化

Django中的序列化

from django.shortcuts import render,HttpResponse
from django.http import JsonResponse


# Create your views here.
def index(request):
    import json
    d = {'username': 'kevin哈喽', 'age': 18}
    # d_json = json.dumps(d, ensure_ascii=False)
    # return HttpResponse(d_json)
    return JsonResponse(d,json_dumps_params={'ensure_ascii':False})

其他数据类型 需要把safe参数改为false

 l = [1, 2 , 3, 4]

return JsonResponse(l,safe=False)

from表单上传文件

前提

  1请求方式必须是post

  2.enctype必须是from-data

后端代码

def a_file(request):
    # post只能拿到文件数据之外的数据
    # print(request.POST)
    # 接搜文件数据
    print(request.FILES)
    if request.method=='POST':
        file_obj = request.FILES.get('myfile')
        print(file_obj)
        with open(file_obj.name,'wb') as f:
            for i in file_obj:
                f.write(i)
    return render(request, 'form_file.html')

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <title>Title</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
    <input type="submit" value="提交">
</form>
</body>
</html>

request对象的其他方法

request.GET 
request.POST
request.FILES

request.path_info  #  /ab_request/ 获取路径
reqeust.path       #  /ab_request/  获取路径
request.get_full_path() # /ab_request/  /ab_request/? username=kevin&age=11获取路径以及详细信息
request.body # 现在先不学,它能够接收浏览器发过来的二进制数据,BBS项目中学

CBV的书写和FBV的写法

目前写的都是FBV:function based view 基于函数的视图
在视图文件中书写类 CBV:class based view 基于类的视图

postman的官网地址:https://www.postman.com/downloads/
apizza的挂网地址:http://www.apizza.net/

Django中所有类必须继承Django的View类

导入模块:from django.views import View

类里面的方法名字不能够随便写,目前只能写get post

URLs文件:

url(r'^a_file/', views.a_file.as_view()),


   # 访问这个地址必须是get请求方式
    def get(self, request):
        # get() takes 1 positional argument but 2 were given
        print("get")
        return HttpResponse("get")
# 访问这个方法必须是psot请求方式
    # 通过form表单发送post请求
    # 出了form表单,我们还可以使用工具来模拟
    def post(self,request):
        print("post")
        return HttpResponse("post")

cbv的源码分析

面试题:你都看过Django的哪些源码,简单说说

 CBV的源码、settings的源码、权限、频率、认证的、签发token的源码 

类名可以调用哪些方法:
1. 方法被@classmethod装饰器修饰的方法
类名来调用类方法有什么特殊之处:
会把类名自动当成第一个参数传递给方法的第一个形参cls
对象调用方法把对象自己当成第一个参数传给方法的第一个形参self

2. 被@staticmethod装饰器修饰的方法

 

看源码的步骤是先找到源码的入口
CBV的入口在哪里呢?

path('login/', views.MyLogin.as_view()),

views.MyLogin.as_view()

步骤

# 第一步
@classonlymethod
    def as_view(cls, **initkwargs):
        # cls:MyLogin
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            self.setup(request, *args, **kwargs)
            if not hasattr(self, 'request'):
                raise AttributeError(
                    "%s instance has no 'request' attribute. Did you override "
                    "setup() and forget to call super()?" % cls.__name__
                )
            return self.dispatch(request, *args, **kwargs)
    
        return view
    
# 第二步:
path('login/', View.view),

# 第三步:
当请求来的时候,开始匹配路由login,就会调用View.view()

# 第四步
        def view(request, *args, **kwargs):
            # self = MyLogin(**initkwargs)
            self = cls(**initkwargs)
            """
                self: MyLogin()
            """
            return self.dispatch(request, *args, **kwargs) # 这句话是最重要的
 # 第五步:self.dispatch(request, *args, **kwargs) 
# 第六步:找到了View类里面的dispatch方法
第七步:
    def dispatch(self, request, *args, **kwargs):
            # getattr: 反射
            # 反射
            # getattr setattr delattr hasattr
            # handler = getattr(self, 'get', self.http_method_not_allowed)
            # handler = getattr(self, 'post', self.http_method_not_allowed)
            # handler就是方法名,对象
            # hander = get
            # hander = post
            # hander = self.http_method_not_allowed
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

 

问题:如何让我写的CBV类只支持get请求或者只支持post请求?

class MyLogin(View):
    http_method_names = ['get',] 让列表里面只有get请求即可
    # 类里面的方法名字不能够随便写,目前只能写get post等
    # 访问这个地址必须是get请求方式
    def get(self, request):
        # get() takes 1 positional argument but 2 were given
        print("get")
        return HttpResponse("get")

ps:源码是用来看的,不是用来改的,有时候也能够改,但是你不行,你这个阶段先不要想着改人家源码的

模版层

模板变量之分配

1.模板中取值一定使用的是句点符.
2.模板中的函数一定不能够加括号,他们会自动帮你加括号调用

后端代码

def func(request):
    d = {'kevin': 123}
    b = [1, 2, 3]

    def index():
        return HttpResponse('OK')

    return render(request, 'func.html', context=locals())

前端页面

def func(request):
    d = {'kevin': 123}
    b = [1, 2, 3]

    def index():
        return HttpResponse('OK')

    return render(request, 'func.html', context=locals())

 

模板之过滤器

Django自带的过滤器有好几十、但是我们没必要全部记住,只需要记住几个就行了
语法:
{{ obj|过滤器名称:参数 }} 变量名字|过滤器名称:变量

    default 默认值
    length    长度
        data 日期
    {#{{ res|default:'你很好啊' }}#}
    {#{{ res|length }}#}
    {#{{ res|filesizeformat }}#}
    {#{{ res|date:'Y-m-d' }}#}
    {#{{ res|truncatechars:9}}#}
    {#{{ res|safe }}#}    

 

 

 

标签:return,get,self,request,视图,def,view
From: https://www.cnblogs.com/shanghaipudong/p/17598207.html

相关文章

  • Python Jenkins-调用_get_view_jobs方法获取指定视图下的Job名称
    一、pythonjenkins库api简介1.1、连接Jenkins服务器server=jenkins.Jenkins(url,username=None,password=None,timeout=30)url:指的是所连接的Jenkins的网络地username/password:username/password默认值是None,在内网中不传参数也是可以连接成功的,但应该......
  • Flutter学习之视图体系
    一、前言Flutter是一种全新的响应式跨平台的移动开发框架,越来越多的开发者参与学习或者研究中,确实在iOS和Android平台上能够用一套代码构建出性能比较高的应用程序。我刚开始接触FlutterFlutter中文网看到这么一句话:Widget是Flutter应用程序用户界面的基本构建块。每个Widget都是用......
  • Python-Django-Django视图和URL
    Python-Django学习目录:环境搭建和基础知识:包括安装Python和Django、了解Python基础语法、掌握Django框架的基本概念和工作原理等。模型和数据库:包括创建模型、定义字段、使用DjangoORM进行数据库操作等。视图和URL:包括定义视图函数、URL路由配置、模板渲染等。表单和验证:包括表单......
  • Mysql高级6-视图
    一、视图介绍视图(View):是一种虚拟存在的表,视图中的数据并不在数据库中实际存在,行和列数据来自,定义视图时查询使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SQL逻辑,不保存查询的结果。 二、创建视图2.1语法create[orreplace]view视图名称......
  • 图形视图体系结构——Graphics View
    GraphicsView框架结构的特点、主要包含元素及坐标系统。1、特点GraphicsView框架结构的主要特点如下。(1) GraphicsView框架结构中,系统可以利用Qt绘图系统的反锯齿、OpenGL工具来改善绘图性能。(2) GraphicsView支持时间传播体系结构,可以使图元在场景(scene)中的......
  • mongodb 创建视图
    MongoDB创建视图什么是MongoDB视图?MongoDB是一个非关系型数据库,它以文档的形式存储数据。通常,我们使用MongoDB中的集合(Collection)来存储和查询数据。但有时候,我们需要根据特定的查询条件创建一个虚拟的集合,这个虚拟的集合被称为视图(View)。视图是基于一个或多个集合的查询......
  • 【8.0】DRF之DRF视图扩展类
    【一】5个视图扩展类GenericAPIView+5个视图扩展类+序列化类+Response写接口【1】5个视图扩展类对应五个方法查询所有数据新增一条数据查询单条数据修改一条数据删除一条数据【2】写5个类的好处就是解耦合,提高代码的可扩展性这五个类不叫视图类,叫视图扩展......
  • 【六】DRF之视图组件
    【一】视图的主要作用DjangoRESTframwork提供的视图的主要作用:控制序列化器的执行(检验、保存、转换数据)控制数据库查询的执行【二】视图继承关系视图的方法与属性:【三】视图RESTframework提供了众多的通用视图基类与扩展类,以简化视图的编写。【1】2......
  • 09-索引和视图
    09-索引和视图课程目标掌握索引原理、索引的应用、视图的概念、创建视图、修改视图、删除视图。9.1索引原理索引被用来快速找出在一个列上某一特定值的行。没有索引,MySQL不得不首先以第一条记录开始,然后读完整个表直到它找出相关的行。表越大,花费时间越多。对于一个有序字段,可以......
  • django(视图层)
    一、三板斧'''HttpResponse返回字符串类型render返回html页面,并且在返回给浏览器之前还可以给html文件传值redirect重定向'''#视图函数必须返回一个HttpResponse对象正确#看三者的源码(render和redirect继承HttpResponse类)Theviewapp01.views.in......