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请求')

最新文章

  1. vue2.0---组件
  2. CI 资源文件加入模板
  3. java.lang.classNotFound:明明已经导入了jar包,包里也有该类,却找不到的解决方法
  4. time_t 获取的是UCT时间,有时差
  5. VS2015 Xamarin for iOS
  6. hduoj 4712 Hamming Distance 2013 ACM/ICPC Asia Regional Online —— Warmup
  7. 《NFS文件共享服务的搭建》RHEL
  8. 九度OJ 1468 Sharing -- 哈希
  9. Unity5 的新旧延迟渲染Deferred Lighting Rendering Path
  10. jsp-forward跳转
  11. 跟着鬼哥学so改动,二,进行篇
  12. 格式化输出prettify()
  13. 使用nginx sticky实现基于cookie的负载均衡
  14. Python2 与 Python3 的编码对比
  15. Contest2154 - 2019-2-28 高一noip基础知识点 测试1 题解版
  16. iptables之NAT端口转发设置
  17. python的if条件判断
  18. python 全栈开发,Day96(Django REST framework 视图,django logging配置,django-debug-toolbar使用指南)
  19. 图的 储存 深度优先(DFS)广度优先(BFS)遍历
  20. C++ —— 重载、覆盖和隐藏

热门文章

  1. Python pylint requires Python '>=3.4.*' but the running Python is 2.7.12
  2. Shadertoy 教程 Part 5 - 运用SDF绘制出更多的2D图形
  3. LOTO虚拟示波器软件功能演示之——FIR数字滤波
  4. Go语言核心36讲(Go语言实战与应用四)--学习笔记
  5. Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试
  6. 双非本科进大疆(SP)!
  7. printf(&quot;%d\n&quot;,printf(&quot;%d&quot;,printf(&quot;%d&quot;,i)));
  8. InnoDB 索引详解
  9. [noi253]A
  10. 第05章 MySQL排序与分页