12.33 Django框架简介:

MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点

Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。

Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。

  1. Model(模型):负责业务对象与数据库的对象(ORM)
  2. Template(模版):负责如何把页面展示给用户
  3. View(视图):负责业务逻辑,并在适当的时候调用ModelTemplate

此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

12.34 View(视图)

一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。

响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。

12.341 CBV(class base view)

urls.py:

  1. url(r'^add_class/$', views.AddClass.as_view()),

CBV版添加班级:

  1. from django.shortcuts import HttpResponse, render, redirect
  2. from django.views import View
  3. from app01 import models
  4. class AddClass(View):
  5. def get(self, request):
  6. return render(request, "add_class.html")
  7. def post(self, request):
  8. class_name = request.POST.get("class_name")
  9. models.Classes.objects.create(name=class_name)
  10. return redirect("/class_list/")
12.342 视图装饰器

装饰器装饰FBV:

  1. def wrapper(func):
  2. def inner(*args, **kwargs):
  3. start_time = time.time()
  4. ret = func(*args, **kwargs)
  5. end_time = time.time()
  6. print("used:", end_time-start_time)
  7. return ret
  8. return inner

  9. # FBV版添加班级
  10. @wrapper
  11. def add_class(request):
  12. if request.method == "POST":
  13. class_name = request.POST.get("class_name")
  14. models.Classes.objects.create(name=class_name)
  15. return redirect("/class_list/")
  16. return render(request, "add_class.html")

装饰器装饰CBV:

类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,需要先将其转换为方法装饰器。

Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器

  1. # CBV版添加班级
  2. from django.views import View
  3. from django.utils.decorators import method_decorator
  4. def wrapper(func):
  5. def inner(*args, **kwargs):
  6. start_time = time.time()
  7. ret = func(*args, **kwargs)
  8. end_time = time.time()
  9. print("used:", end_time-start_time)
  10. return ret
  11. return inner

  12. #@method_decorator(wrapper, name='post') 给post加方法装饰器
  13. #@method_decorator(wrapper, name='dispatch') 给dispatch方法加装饰器,相当于给类下所有方法加装饰器
  14. class AddClass(View):
  15.  
  16. #http_method_names = ['get', ] #自定义可用的请求方法

  17. @method_decorator(wrapper) #给get方法加装饰器
  18. def get(self, request):
  19. return render(request, "add_class.html")

  20. def post(self, request):
  21. class_name = request.POST.get("class_name")
  22. models.Classes.objects.create(name=class_name)
  23. return redirect("/class_list/")

使用CBV时要注意:请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。

  1. class Login(View):
  2.  
  3. def dispatch(self, request, *args, **kwargs):
  4. print('before')
  5. obj = super(Login,self).dispatch(request, *args, **kwargs)
  6. print('after')
  7. return obj
  8.  
  9. def get(self,request):
  10. return render(request,'login.html')
  11.  
  12. def post(self,request):
  13. print(request.POST.get('user'))
  14. return HttpResponse('Login.post')
12.342 request对象

当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象,Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象

path_info 返回用户访问url的路径,不包括域名和参数:/music/bands/the_beatles/  
method 请求中使用的HTTP方法的字符串表示,全大写表示:"GET"、"POST"  
GET 包含所有HTTP GET参数的类字典对象  
POST 包含所有HTTP POST参数的类字典对象  
body 请求体,byte类型 request.POST的数据就是从body里面提取到的  
get_full_path() 返回URL中的路径和参数:/music/bands/the_beatles/?print=true  
12.343 上传文件示例

如果有上传文件,html文件中的form表单一定要加 enctype="multipart/form-data"

upload_demo.html:

  1. <body>
  2. <h1>Django 上传文件示例</h1>
  3. <form action="/upload/" method="post" enctype="multipart/form-data">
  4. <input type="text" name="username">
  5. <input type="file" name="touxiang">
  6. <input type="submit" value="提交">
  7. </form>
  8. </body>

如果有上传文件,views.py中应该从request.FILES中取上传的文件对象

服务端接收文件:views.py

  1. from django.shortcuts import render, HttpResponse
  2. from django.http import JsonResponse
  3. def upload(request):
  4. if request.method == "POST":
  5. #print(request.POST) #只能拿到字典里的文件名
  6. #print(request.FILES) #拿到含有文件对象的字典
  7. file_obj = request.FILES.get("touxiang") #得到文件对象
  8. #print(file_obj, type(file_obj))
  9. file_name = file_obj.name # 拿到文件名
  10. with open(file_name, "wb") as f:
  11. for line in file_obj.chunks(): # 从上传的文件对象中一点一点读取数据
  12. f.write(line) # 写到新建的文件中
  13. return HttpResponse("OK")
  14. return render(request, "upload_demo.html")
12.344 Response对象

每个视图都需要实例化,填充和返回一个HttpResponse,本质上render,redirect也是返回了HttpResponse对象

HttpResponse.content:响应内容 HttpResponse.charset:响应内容的编码 HttpResponse.status_code:响应的状态码

JsonResponse对象:JsonResponse是HttpResponse的子类,Django封装的一个专门用来返回JSON格式数据的方法

  1. from django.http.response import JsonResponse
  2. def get_json_data(request):
  3. data = {"name": "Egon", "hobby": "喊麦"}
  4. # import json
  5. # return HttpResponse(json.dumps(data),content_type='application/json')
  6. #设置content_type,浏览器会自动反序列化json
  7. <-等同于->
  8. # ret = HttpResponse(json.dumps(data))
  9. # ret['Content-type'] = 'application/json'
  10. # return ret
  11. return JsonResponse(data)

  12. #return JsonResponse([1, 2, 3, 4], safe=False)
  13. #JsonResponse默认只能传递字典类型,如果要传递非字典类型需要设置safe参数

python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)的更多相关文章

  1. Django视图函数函数之视图装饰器

    FBV模式装饰器: 普通函数的装饰器(语法糖@) views.py from django.shortcuts import render def wrapper(f): def inner(*arg ...

  2. 【转】Django中的request与response对象

    关于request与response 前面几个 Sections 介绍了关于 Django 请求(Request)处理的流程分析,我们也了解到,Django 是围绕着 Request 与 Respon ...

  3. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...

  4. Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request对象方法,属性和Response对象,form表单的上传

    Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request请求对象方法,属性和Response响应对象,form表单的上传 一丶CBV和FBV       在Django中存 ...

  5. Python自动化运维之6、函数装饰器

    装饰器: 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大.装饰器一般接受一个函数对象作为参数, ...

  6. Python自动化面试必备 之 你真明白装饰器么?

    Python自动化面试必备 之 你真明白装饰器么? 装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多小白来讲,这个功能 有点绕 ...

  7. python语法生成器、迭代器、闭包、装饰器总结

    1.生成器 生成器的创建方法: (1)通过列表生成式创建 可以通过将列表生成式的[]改成() eg: # 列表生成式 L = [ x*2 for x in range(5)] # L = [0, 2, ...

  8. python函数之闭包函数与无参装饰器

    一.global与nonlocal #global x = 1 def f1(): global x # 声明此处是全部变量x x = 2 print(x) f1() # 调用f1后,修改了全局变量x ...

  9. [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)

    oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...

随机推荐

  1. learning java 重定向标准输入输出

    output redirectionOut: public class RedirectOut { public static void main(String[] args) throws File ...

  2. forEach, map, filter方法区别

    听说for循环已经成了菜鸟标配...? 瑟瑟发抖 赶紧找来资料补一补 1, forEach循环,循环数组中每一个元素并采取操作, 没有返回值, 可以不用知道数组长度 2, map函数,遍历数组每个元素 ...

  3. semantic ui要装什么才能使用

    作者:呆呆笨笨链接:https://www.zhihu.com/question/32233356/answer/196799506来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  4. rust变量与可变性

    fn main() { //let x = 5; let mut x = 5; //通过const定义常量名称要大写,并且值不可更改 const Y:i32=6; println!("Y i ...

  5. 刷题记录:[CISCN2019 华北赛区 Day1 Web2]ikun

    目录 刷题记录:[CISCN2019 华北赛区 Day1 Web2]ikun 一.涉及知识点 1.薅羊毛逻辑漏洞 2.jwt-cookies伪造 Python反序列化 二.解题方法 刷题记录:[CIS ...

  6. Jmeter5.11安装

    jmeter5.11要对应jdk1.8以上版本 1.选择zip后缀进行下载 2.配置环境变量 (1)电脑桌面---->"计算机"图标---->鼠标右键选择"属 ...

  7. 剑指offer:整数中1出现的次数

    题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了 ...

  8. Linux零拷贝技术 直接 io

    Linux零拷贝技术 .https://kknews.cc/code/2yeazxe.html   https://zhuanlan.zhihu.com/p/76640160 https://clou ...

  9. Sharding-Jdbc 自定义分库分表-复合分片算法自定义实现

    Sharding-JDBC中的分片策略有两个维度,分别是: 数据源分片策略(DatabaseShardingStrategy) 表分片策略(TableShardingStrategy) 其中,数据源分 ...

  10. python带参数的类装饰器

    # -*- coding: utf-8 -*- # author:baoshan # 带参数的类装饰器(和不带参数的类装饰器有很大的不同) # 类装饰器的实现,必须实现__call__和__init_ ...