Django框架之视图层(views)介绍

一、视图层类型

1.FBV与CBV

FBV:基于函数的视图

CBV:基于类的视图(学习重点)

#使用CBV时,路由层写法
urlpatterns = [
    #分析源码这里也可写成 url(r‘^mycls/‘, views.view),这种格式与FBV路由层中一致
    url(r‘^mycls/‘, views.MyCls.as_view()),]
‘‘‘
FBV与CBV中路由层都是:路由对应视图函数内存地址
‘‘‘

# 使用CBV时,首先在views文件中导入View模块
from django.views import View

#定义类,继承View
class MyCls(View):
    def get(self,request):
        return render(request,‘index.html‘)

    def post(self,request):
        return HttpResponse(‘post‘)

2、需要思考的问题

2.1 为什么能够根据前端请求类型执行对应方法?

2.2 路由层中 views.MyCls.as_view()是什么?

  MyCls是类,as_view是方法或者属性;通过MyCls.as_view()可以确定as_view应该是方法。与此同时MyCls类调用它,无参数传入,所以它并且是类方法。
当类点属性或方法时,它的查找顺序时:自身-->父类。在MyCls类中无as.view方法,因此它是父类View中的方法。
  我们在浏览器输入地址能够与 ^mycls/ 匹配成功时,执行MyCls.as_view(实际是拿到view的内存地址)函数。

#View中部分源码(看注释部分)
    @classonlymethod        #绑定给类的方法
    def as_view(cls, **initkwargs):    #cls是我们写的MyCls

        for key in initkwargs:
            if key in cls.http_method_names:
                raise TypeError("You tried to pass in the %s method name as a "
                                "keyword argument to %s(). Don‘t do that."
                                % (key, cls.__name__))
            if not hasattr(cls, key):
                raise TypeError("%s() received an invalid keyword %r. as_view "
                                "only accepts arguments that are already "
                                "attributes of the class." % (cls.__name__, key))

        def view(request, *args, **kwargs):  #定义在as_view内部,是闭包函数

            #cls表示引用了as_viewde1作用域,也就是我们写的MyCls类
            self = cls(**initkwargs)    #self相当于MyCls实例化的对象
            if hasattr(self, ‘get‘) and not hasattr(self, ‘head‘):
                self.head = self.get
            self.request = request
            self.args = args
            self.kwargs = kwargs
            #self是MyCls的对象,self中没有dispatch方法,MyCls中也没有,还要从View中找
            return self.dispatch(request, *args, **kwargs)
        view.view_class = cls
        view.view_initkwargs = initkwargs

        update_wrapper(view, cls, updated=())

        update_wrapper(view, cls.dispatch, assigned=())
        return view           #调用路由层中调用as_view,会拿到 view 的内存地址

    def dispatch(self, request, *args, **kwargs):
        # request.method获取请求类型,判断是否在self.http_method_names中
        if request.method.lower() in self.http_method_names:

        # 反射,self是MyCls的对象;获取MyCls中 get/post 方法,
            handler = getattr(self, request.method.lower(),
                              self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

MyCls继承的View类的部分源码,重点在注释部分

二、关于JsonResponse

  在开发过程中前端,后端使用的语言类型是不同的,那我们是怎么进行前后端数据交互的呢?或者说是否有一种通用的格式,能够都被前后端识别并做相互的转化?这里就需要使用Json数据交换的文本格式。

#返回给前端jason格式的字符串

#路由层
urlpatterns = [url(r‘^index/‘, views.index)]
#视图层
from django.shortcuts import HttpResponse
import json

#手动序列化
def index(request):
    res = {‘name‘:‘Bob‘,‘password‘:123}
    return HttpResponse(json.dumps(res)) #前端结果{"name":"Bob","password",123}

     res = {‘name‘:‘Bob大帅比‘,‘password‘:123}
    return HttpResponse(json.dumps(res))#前端显示结果不能识别中文

    #将dumps中ensure_ascli参数改为Flase,序列化时保证数据内容不变
    return HttpResponse(json.dumps(res),ensure_ascii=False)

# django自行序列化
from django.http import JsonResponse
def index(request):
    res={‘name‘:‘Bob大帅比‘,‘password‘:123}
    return JsonResponse(res,json_dumps_params={‘ensure_ascii‘:False})

三、简单的文件上传

前端需要注意的点:     1.method需要指定成post   2.enctype需要改为formdata格式
<form action="{% url app01_index %}" method="post" enctype="multipart/form-data">
    <input type="file" name="my_file">
    <input type="submit">
后端暂时需要注意的是   1.配置文件中注释掉csrfmiddleware中间件   2.通过request.FILES获取用户上传的post文件数据
def upload_file(request):
    if request.method == ‘POST‘:
        print(‘path:‘,request.path)
        print(‘full_path:‘,request.get_full_path())
        # print(request.FILES)
        file_obj = request.FILES.get(‘my_file‘)
        print(file_obj.name)
        with open(file_obj.name,‘wb‘) as f:
            for line in file_obj.chunks():
                f.write(line)
        return HttpResponse(‘OK‘)
    return render(request,‘index.html‘)

原文地址:https://www.cnblogs.com/yuanlianghong/p/11001164.html

时间: 2024-08-30 12:20:15

Django框架之视图层(views)介绍的相关文章

Django 框架之视图函数(Views)

http请求中产生的两个核心对象: http请求: HttpRequest对象 http响应: HttpResponse对象 所在位置: django.http HttpRequest 对象的属性和方法: path: 请求页面的全路径,不包括域名; method: 请求中使用的HTTP方法的字符串表示(全大写表示,例如:GET,POST); GET: 包含所有HTTP GET参数的类字典对象; POST: 包含所有HTTP POST参数的类字典对象; COOKIES:包含所有cookies的标志

Django框架之视图

Django框架之视图层 什么是视图函数 视图函数,属于Django的视图层,默认定义在views.py文件中,是用来处理web请求信息以及返回响应信息的函数.并且这里的视图函数并不仅仅指代函数,也包括类. 请求对象 Django将http协议请求报文中的请求行.首部信息.内容主体封装到了HttpRequest对象中.将HttpRequest对象当做参数传给视图函数中去,在视图函数中,通过访问该对象的属性便可以提取http协议的请求数据 常用属性 method 获取请求方式 GET 获取GET请

django框架The view account.views.register didn&#39;t return an HttpResponse object.错误的解决办法

对提交方法不是POST的方法没有添加分支进行判断 1. 注意# 判断post/get 分支判断提交方法 django框架The view account.views.register didn't return an HttpResponse object.错误的解决办法 原文地址:https://www.cnblogs.com/bigfacecatovo/p/11980389.html

django框架之视图系统和路由系统

内容回顾: 1. tags         1. for循环            {% for name in name_list %}                {{ name }}            {% endfor %}                        {% for name in name_list %}                {{ name }}            {% empty %}                空空如也          

Django框架之---视图

视图 视图的功能 视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者. 使用视图的过程 视图就是一个python函数,被定义在"应用/views.py"文件中. 使用视图时需要进行两方面操作,两个操作不分先后. 1)在"应用/views.py"中定义视图. 在booktest/views.py中定义视图函数index: def index(request): return HttpResponse("

Django框架1——视图和URL配置

三个命令 1.创建一个django项目 在cmd中:django-admin.py startproject project_name D:\python\django_site>django-admin startproject first_site 2.创建应用 python manage.py startapp app_name D:\python\django_site\first_site>python manage.py startapp app001 3.运行django项目 p

Django框架之类视图

所谓类视图就是用类定义的视图,其主要支持客户端在用不同的请求方式发起的HTTP请求. 首先,我们需要明确一下类视图的好处: 1.代码可读向高: 2.相对于视图函数具有更高的代码复用性: 3.便于维护. 类视图的定义格式如下: # 1. 导入视图模块from django.views.generic import View class ObjectView(View): """2. 定义一个类视图""" # 3.编写视图函数 def get(sel

tp框架---View视图层---模板继承(举例说明)

当我们做动态页面时,我们会发现一个网站的头部和尾部是相同的,那么我们如何用tp框架来做模板呢 ? 先看一下注意事项: (1)每个区块由<block></block>标签组成 (2)子模板中使用extend标签继承模板 (3)注释语法:{/* 注释内容 */ } 或 {// 注释内容 }  一.看一下基本的模板继承 (1)先做出模板页面  Ceshi/View/Main/base.html <!DOCTYPE html> <html> <head>

Django框架之模型层 常用字段和参数

目录 一.Django ORM 常用字段和参数 1.1 常用字段 1.2 所有字段(争取记忆) 1.2.1 orm字段与MySQL字段对应关系 1.3 自定义字段 1.3 字段参数 1.3.1 DateField和DateTimeField的字段参数 二.关系字段 2.1 ForeignKey 2.1.1 字段参数 2.1.2 其余字段参数 2.2 OneToOneField 2.2.1 字段参数 2.3 ManyToManyField 2.3.1 字段参数 一些说明: 表的名称是自动生成的,如

Django框架——模型(models)层之ORM查询(二)

1.聚合查询 聚合函数 关键字:aggregate from django.db.models import Max,Min,Sum,Count,Avg 2.分组查询 关键字:annotate 统计每一本书的作者个数 models.Book.objects.annotate(author_num = Count('author')).values('title') 统计每一个出版社卖的最便宜的书的价格 models.Book.objects.annotate(price_min=Min('boo