day06 视图层

今日内容

  • 视图层

    小白必会三板斧
    JsonResponse
    form表单发送文件
  • FBV与CBV

    FBV基于函数的视图
    CBV基于类的视图
  • 模板层

    模板语法的传值
    模板语法之过滤器
    模板语法之标签
    自定义过滤器、标签、inclusion_tag
    模板的继承与导入

HttpResponse对象

# 视图函数必须返回一个HttpResponse对象
为什么这么说呢? HttpResponse
class HttpResponse: # 直接定义一个HttpResponse类
pass render
def render(...):
return HttpResponse(...) # 返回一个HttpResponse类 redirect
def redirect(...)
# redirect_class是继承HttpResponse子类
return redirect_class(...)

JsonResponse

# 向前端返回一个json格式字符串的两种方式

第一种方式:
import json
dic = {'name':'meng','age':18,'gender':'男'}
json_str = json.dumps(dic,ensure_ascii=False) # json格式默认会对中文字符进行转码,加上参数不转码
return HttpResponse(json_str) 第二种方式:
from django.http import JsonResponse
def index(request):
dic = {'name':'meng','age':18,'gender':'男'}
return JsonResponse(dic,json_dumps_params={'ensure_ascii':False})
# 由源代码中**kwargs打散成 ensure_ascii=False list = [1,2,3,4,5]
return JsonResponse(list,safe=False) # 要想传入列表,必须把safe设置False # 注:只有json格式打印出来才会是""双引号

form表单文件上传

想要form表单提交文件的前提有两个:
1.method必须是post
2.enctype参数必须是multipart/form-data
request.POST无法获取到文件类型的数据
request.FILES获取文件类型的数据 # 使用这个获取出普通数据外的数据 后端:
def index(request):
if request.method == 'POST':
# print(request.POST)
# print(request.FILES) # <MultiValueDict: {'file': [<InMemoryUploadedFile: 生命周期流程图.png (image/png)>]}>
file_obj = request.FILES.get('file') # 与request.POST.get('file') 一个意思
print(file_obj.name)
with open(file_obj.name,'wb') as f:
for line in file_obj:
f.write(line)
return render(request,'index.html') 前端:
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file" > # 不加multiple参数只能选一个
<input type="file" name="file" multiple> # 加上可以选多个上传

FBV与CBV

# CBV基于类的视图(Class base view)和FBV基于函数的视图(Function base view)

FBV:基于函数的视图
# FBV
url(r'^index/',views.index),
def index(request):
pass CBV:基于类的视图函数
# CBV
url(r'^login/',views.Mylogin.as_view()) # as_view经过变形之后返回view,加上括号调用 from django.views import View
class Mylogin(View):
def get(self,request):
return HttpResponse('get请求') def post(self,request):
return HttpResponse('post请求')
# CBV会自动判断当前请求方法并自动匹配类中的方法执行

对象查找属性或方法的顺序(***)

# 对象查找属性或方法的顺序
永远都是先从自己身上找
然后去产生对象的类中找
再去类的父类中找 如果都没有才会报错

CBV源码剖析

"""
函数名或者方法名遇到括号执行优先级最高 对象查找属性或方法的顺序
永远都是先从自己身上找
然后去产生对象的类中找
再去类的父类中找 如果都没有才会报错 闭包函数
定义在函数内部并且使用了外层函数名称空间中的名字
"""
# 其实FBV与CBV在路由匹配上本质其实是一样的,都是正则表达式对应函数名 # 经过变形后:url(r'^login',views.view) ,看源码发现返回view
# 当匹配到login,自动调用view加括号执行
url(r'^login/',views.Mylogin.as_view()) 源代码:
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
# cls使我们自定义的类 MyLogin
self = cls(**initkwargs) # 产生一个MyLogin类的对象 obj
return self.dispatch(request, *args, **kwargs) # 调用disoatch函数
return view def dispatch(self, request, *args, **kwargs):
# 判断当前的请求方法是否在这八个方法内
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) # 执行这个方法 # 用自己的话说:
1、路由匹配url调用了一个绑定给类的as_view()函数
2、as_view()里面定义了一个view函数,调用了dispatch函数
3、在dispatch函数中判断发来的请求方式是否在 http_method_names变量名
4、在的话,用getattr方法去自己定义的类产生的对象寻找
5、在自己定义的类找的对应的请求方法,并执行相应请求下面的代码
class Mylogin(View):
def get(self,request):
return HttpResponse('get请求') def post(self,request):
return HttpResponse('post请求')

day06 视图层的更多相关文章

  1. web框架开发-Django视图层

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

  2. django 实战篇之视图层

    视图层(views.py) django必会三板斧 HttpResponse >>> 返回字符串 render >>> 支持模板语法,渲染页面,并返回给前端 red ...

  3. Django视图层

    本文目录 1 视图函数 2 HttpRequest对象 3 HttpResponse对象 4 JsonResponse 5 CBV和FBV 6 简单文件上传 回到目录 1 视图函数 一个视图函数,简称 ...

  4. $Django 虚拟环境,2.0、1.0路由层区别,Httprequest对象,视图层(fbv,cbv),文件上传

    1 虚拟环境:解决问题同一台机器上可以运行不同版本的django,  1 用pychanrm创建--->files-->newproject--->选择虚拟环境  2 setting ...

  5. springboot整合视图层之jsp

    在springboot中不推荐视图层使用jsp展示,但是人们以前已经习惯使用jsp,所以对jsp也有支持,但是是解耦性的.也就是说并没有像其他组件一样直接集成到启动器中,所以像jsp引擎之类的需要额外 ...

  6. 小程序学习笔记三:页面文件详解之视图层WXML、WXS、WXSS文件

      视图层:Pages主要有 wxml页面文件和模板文件.wxs脚本文件.wxss样式文件:component是抽取出来的业务单元,同样拥有wxml页面文件和模板文件.wxs脚本文件.wxss样式文件 ...

  7. DjangoMTV模型之视图层views及模板层template

    Django视图层中views的内容 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容(render),也可以是一个重定向( ...

  8. python 全栈开发,Day69(Django的视图层,Django的模板层)

    昨日内容回顾 相关命令: 1 创建项目 django-admin startproject 项目名称 2 创建应用 python manage.py startapp app名称 3 启动项目 pyt ...

  9. ORM之视图层

    1.request对象 前台POST传来的数据,包装到POST字典中request.POST 前台浏览器窗口携带的数据,包装到GET字典中request.GET 前台请求的方式,request.met ...

随机推荐

  1. CPU使用率和平均负载

    转载: https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247487782&idx=3&sn=3f04bb053d ...

  2. 确定两串乱序同构 牛客网 程序员面试金典 C++ Python

    确定两串乱序同构 牛客网 程序员面试金典 C++ Python 题目描述 给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串.这里规定大小写为不同字符,且考虑字符串中 ...

  3. Python gpu 显卡小工具 gpu

    安装 pip install gpustat 或者 换源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade gpust ...

  4. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

  5. pvcreate vgcreate lvcreate 扩容

    centos6 服务器磁盘扩容 1.创建物理卷 /dev/sdb #pvcreate /dev/sdb 参数:/dev/sdb 设备名 2.创建卷组 vg_02 #vgcreate  vg_02  / ...

  6. 第2章-6 求交错序列前N项和 (15分)

    第2章-6 求交错序列前N项和 (15分) 本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+- 的前N项之和. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在 ...

  7. 【数据结构&算法】10-串基础&KMP算法源码

    目录 前言 串的定义 串的比较 串的抽象类型数据 串与线性表的比较 串的数据 串的存储结构 串的顺序存储结构 串的链式存储结构 朴素的模式匹配算法 模式匹配的定义 朴素的匹配方法(BRUTE FORC ...

  8. Part 28 AngularJS default route

    At the moment the problem is that, if you try to navigate to a route that is not configured, you wil ...

  9. ES6-正则新增(复习+学习)

    ES6-正则 昨天,复习了正则的基本知识,今天学习ES6新增的正则的知识,做一个总结笔记,大家可以先看4,5对应的方法然后再从头看,话不多说直接上: 1.RegExp构造函数的区别 2.新增的修饰符 ...

  10. Ubuntu系统下《汇编语言》环境配置

    说明 1.系统:Ubuntu codists@pc:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Des ...