[Django框架之视图层]

视图层

Django视图层, 视图就是Django项目下的views.py文件,它的内部是一系列的函数或者是类,用来专门处理客户端访问请求后处理请求并且返回相应的数据,相当于一个中央情报处理系统

小白必会三板斧

  • HttpResponse

    • 返回字符串类型的数据
  • render

    • 返回html页面,还可以使用模板语法
  • redirect

    • 重定向

三板斧本质

django视图函数必须要返回一个HttpResponse对象? 正确!

django视图函数必须有一个返回值,并且返回值的数据类型必须是HttpResponse对象

# 研究三者源码可以得出结论
# HttpResponse
class HttpResponse(HttpResponseBase):
"""
An HTTP response class with a string as content.
# 以字符串作为内容的HTTP响应类
This content that can be read, appended to or replaced.
# 可以读取、添加或替换的内容
"""
streaming = False def __init__(self, content=b'', *args, **kwargs):
super(HttpResponse, self).__init__(*args, **kwargs)
# 内容是一个字节串。参见' content '属性方法
# Content is a bytestring. See the `content` property methods.
self.content = content # render
def render(request, template_name, context=None, content_type=None, status=None, using=None):
"""
Returns a HttpResponse whose content is filled with the result of calling
django.template.loader.render_to_string() with the passed arguments.
# 返回一个HttpResponse,它的内容中填充了调用的结果
# django.template.loader.render_to_string()和传递的参数
"""
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status) # redirect内部是继承了HttpRespone类

JsonResponse

给前端返回json格式的字符串

方式1:自己序列化

import json
def func(request):
d = {'user':'jason好帅','password':123}
res = json.dumps(d,ensure_ascii=False)
return HttpResponse(res)

方式2: JsonResponse

from django.http import JsonResponse
def func(request):
d = {'user':'jason好帅','password':123}
return JsonResponse(d)
# return JsonResponse(d,json_dumps_params={'ensure_ascii':False} ) ps:额外参数补充
json_dumps_params={'ensure_ascii':False} # 看源码
safe=False # 看报错信息 # JsonResponse返回的也是HttpResponse对象

上传文件

前端form表单上传文件注意事项
1.method必须是post
2.enctype参数需要修改为multipart/form-data 后端暂时需要注意的是
1.配置文件中注释掉csrfmiddleware中间件
2.通过request.FILES获取用户上传的post文件数据
def func3(request):
if request.method == 'POST':
print(request.POST)
file_obj = request.FILES.get('myfile')
print(file_obj.name) # 获取文件名称
with open(r'%s'%file_obj.name,'wb') as f:
for chunks in file_obj.chunks():
f.write(chunks)
return render(request,'func3.html')

FBV与CBV

FBV		基于函数的视图
FBV使用频率较低(基础阶段) CBV 基于类的视图
CBV实际开发项目使用频率较高(高级阶段) views.py视图层
视图函数
不仅仅可以是函数也可以是类
1.面向过程式编程
2.面向对象式编程

FBV基于函数的视图(Function base view)我们前面写的视图函数都是FBV

CBV基于类的视图(Class base view)

视图文件中除了用一系列的函数来对应处理客户端请求的数据逻辑外,还可以通过定义类来处理相应的逻辑

CBV基本使用

# views.py
from django.shortcuts import render,HttpResponse,redirect
from django.views import View
class MyView(View):
def get(self,request):
return HttpResponse("get方法")
def post(self,request):
return HttpResponse("post方法") # urls.py
url(r'^func4',views.MyView.as_view())
"""为什么能够自动根据请求方法的不同执行不同的方法"""

1. CBV与FBV路由匹配本质

# urls.py
urlpatterns = [
url(r'^func4',views.MyView.as_view()) # CBV写法
# 等价 CBV路由配置本质跟FBV一样
url(r'^func4',views.view) # FBV写法
]

2. CBV与FBV区别之突破口

知识点:函数名/方法名:加括号执行优先级最高

CBV写的是 as_view() 加括号意味着在项目启动就会执行
那么我们大胆猜测:
要么是被@staicmethod修饰的静态方法,就是个普通函数没有形参
要么是被@classmethod修饰的类方法,类来调自动将类当做第一个参数传入

3. 研究一下源码

@classonlymethod  # 类方法,就把它看成@classmethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs): # view是as_view的闭包
self = cls(**initkwargs) # self = MyView()生成一个我们自己写的类的对象
"""
实例化出一个View类的对象,返回一个dispatch()函数,看着跟我们之前写的
视图函数几乎一毛一样,那么我们找一下函数的上级函数没有这个方法,最后在类
里发现了这个dispatch()函数
"""
return self.dispatch(request, *args, **kwargs)
return view # 返回一个函数的内存地址 def dispatch(self, request, *args, **kwargs):
# 获取当前请求并判断是否属于正常的请求(8个)
if request.method.lower() in self.http_method_names:
# get请求 getattr(对象,'get') handler = 我们自己写的get方法
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # 执行我们写的get方法并返回该方法的返回值
# 结论:as_view()最终干的事情就是根据request请求方式来执行视图类的不同请求方法

总结:以后会经常需要看源码,但是在看Python源码的时候,一定要时刻提醒自己面向对象属性方法查找顺序,先从对象自己找,再去产生对象的类里面去找,之后再去父类找,看源码只要看到了self点一个东西,一定要问自己当前这个self到底是谁。

[Django框架之视图层]的更多相关文章

  1. 微信小程序学习笔记(5)--------框架之视图层

    这一系列转载:http://blog.csdn.net/zsp45212/article/details/53518238 视图层 框架的视图层由wxml与wxss编写,由组件进行展示.将逻辑层的数据 ...

  2. 小程序框架之视图层 View~事件系统~WXS响应事件

    WXS响应事件 基础库 2.4.4 开始支持,低版本需做兼容处理. 背景 有频繁用户交互的效果在小程序上表现是比较卡顿的,例如页面有 2 个元素 A 和 B,用户在 A 上做 touchmove 手势 ...

  3. 小程序框架之视图层 View

    (1)视图层View 框架的视图层由 WXML 与 WXSS 编写,由组件来进行展示. 将逻辑层的数据反应成视图,同时将视图层的事件发送给逻辑层. WXML(WeiXin Markup languag ...

  4. Django 学习 之 视图层(views)

    一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何 ...

  5. 小程序框架之视图层 View~基础组件

    框架为开发者提供了一系列基础组件,开发者可以通过组合这些基础组件进行快速开发.详细介绍请参考组件文档. 什么是组件: 组件是视图层的基本组成单元. 组件自带一些功能与微信风格一致的样式. 一个组件通常 ...

  6. Django的日常-视图层

    目录 Django的日常-3 JsonResponse form表单上传文件 CBV的源码分析 视图层 模板传值 过滤器 标签 自定义过滤器和标签 Django的日常-3 JsonResponse 在 ...

  7. Django学习之视图层

    视图层 小白必会三板斧 HttpResponse render redirect django视图函数必须要给返回一个HttpResponse对象(render和redirect内部返回的也是一个Ht ...

  8. Django基础之视图层

    内容概要 小白必会三板斧 request对象方法初识 form表单上传文件 Jsonresponse FBV与CBV 内容详细 1 小白必会三板斧 HttpResponse render redire ...

  9. 小程序框架之视图层 View~获取界面节点信息

    获取界面上的节点信息 WXML节点信息 节点信息查询 API 可以用于获取节点属性.样式.在界面上的位置等信息. 最常见的用法是使用这个接口来查询某个节点的当前位置,以及界面的滚动位置. 示例代码: ...

随机推荐

  1. io流(io流的引入与文件字节流)

    io流的引入与文件字节流 io流:就是一根吸管,插入后,可以操作目标文件 io流的分类: 按方向:输入,输出 按大小:字节,字符 按处理方式: 处理流:"管套着管" --- 流结合 ...

  2. sqli-labs系列——第五关

    less5 更改id后无果,不能用union联合查询 此处用报错注入 报错注入的概念:(1). 通过floor报错 and (select 1 from (select count(*),concat ...

  3. Python基础之:Python中的类

    目录 简介 作用域和命名空间 class 类对象 类的实例 实例对象的属性 方法对象 类变量和实例变量 继承 私有变量 迭代器 生成器 简介 class是面向对象编程的一个非常重要的概念,python ...

  4. PE学习前的一些小知识

    位移运算 1.与运算 & 2.或运算 | 3.非运算 ~ 4.异或运算 ^ 5.移位运算 <<  >> 内存分配,文件读写 宏定义说明 一.无参数的宏定义的一般形式为: ...

  5. QT实现OPC_UA客户端程序以及与OPC_UA服务器通信

    1.OPC_UA服务器准备工作 1.关于OPC_UA服务器的搭建可以参考前面一篇文章:https://blog.csdn.net/xipengbozai/article/details/1150809 ...

  6. BUAA_OS lab2 难点梳理

    BUAA_OS lab2 难点梳理 实验重点 所列出的实验重点为笔者在进行lab2过程中认为需要深刻理解的部分. 进行内存访问的流程 熟悉mips内存映射布局,即理解mmu.h内图 二级页表的理解和实 ...

  7. Centos下搭建DNS域名解析服务器

    Centos下搭建DNS域名解析服务器 DNS  即Domain Name System(域名系统)的缩写,它是一种将ip地址转换成对应的主机名或将主机名转换成与之相对应ip地址的一种机制.其中通过域 ...

  8. Spring Boot+MySQL+Spring Data JPA一个Web的Demo

    2020.06.23 更新 1 概述 一个简单的web项目配合MySQL+Hibernate+Tomcat的简单示例demo,很容易在此基础上扩展成自己的项目. 2 创建工程 笔者IDE为Intell ...

  9. 有了CopyOnWrite为何又要有ReadWriteLock?

    引言 前文我们有介绍<看了CopyOnWriteArrayList后自己实现了一个CopyOnWriteHashMap> 关于CopyOnWrite容器的,但是它也有一些缺点: 内存占用问 ...

  10. [BUAA2021软工助教]案例分析作业总结

    目录 一.作业链接 二.优秀作业推荐 A+作业推荐 A作业推荐 三.总结 所有案例分析总结 特色与优点 问题与建议 不同类产品案例分析Bug汇总 CSDN问答社区.Stack Overflow.Seg ...