python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)
12.33 Django框架简介:
MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点
Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。
Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
12.34 View(视图)
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。
12.341 CBV(class base view)
urls.py:
url(r'^add_class/$', views.AddClass.as_view()),
CBV版添加班级:
from django.shortcuts import HttpResponse, render, redirect
from django.views import View
from app01 import models
class AddClass(View):
def get(self, request):
return render(request, "add_class.html")
def post(self, request):
class_name = request.POST.get("class_name")
models.Classes.objects.create(name=class_name)
return redirect("/class_list/")
12.342 视图装饰器
装饰器装饰FBV:
def wrapper(func):
def inner(*args, **kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
print("used:", end_time-start_time)
return ret
return inner
# FBV版添加班级
@wrapper
def add_class(request):
if request.method == "POST":
class_name = request.POST.get("class_name")
models.Classes.objects.create(name=class_name)
return redirect("/class_list/")
return render(request, "add_class.html")
装饰器装饰CBV:
类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,需要先将其转换为方法装饰器。
Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器
# CBV版添加班级
from django.views import View
from django.utils.decorators import method_decorator
def wrapper(func):
def inner(*args, **kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
print("used:", end_time-start_time)
return ret
return inner
#@method_decorator(wrapper, name='post') 给post加方法装饰器
#@method_decorator(wrapper, name='dispatch') 给dispatch方法加装饰器,相当于给类下所有方法加装饰器
class AddClass(View): #http_method_names = ['get', ] #自定义可用的请求方法
@method_decorator(wrapper) #给get方法加装饰器
def get(self, request):
return render(request, "add_class.html")
def post(self, request):
class_name = request.POST.get("class_name")
models.Classes.objects.create(name=class_name)
return redirect("/class_list/")
使用CBV时要注意:请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。
class Login(View):
def dispatch(self, request, *args, **kwargs):
print('before')
obj = super(Login,self).dispatch(request, *args, **kwargs)
print('after')
return obj
def get(self,request):
return render(request,'login.html')
def post(self,request):
print(request.POST.get('user'))
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:
<body>
<h1>Django 上传文件示例</h1>
<form action="/upload/" method="post" enctype="multipart/form-data">
<input type="text" name="username">
<input type="file" name="touxiang">
<input type="submit" value="提交">
</form>
</body>
如果有上传文件,views.py中应该从request.FILES中取上传的文件对象
服务端接收文件:views.py
from django.shortcuts import render, HttpResponse
from django.http import JsonResponse
def upload(request):
if request.method == "POST":
#print(request.POST) #只能拿到字典里的文件名
#print(request.FILES) #拿到含有文件对象的字典
file_obj = request.FILES.get("touxiang") #得到文件对象
#print(file_obj, type(file_obj))
file_name = file_obj.name # 拿到文件名
with open(file_name, "wb") as f:
for line in file_obj.chunks(): # 从上传的文件对象中一点一点读取数据
f.write(line) # 写到新建的文件中
return HttpResponse("OK")
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格式数据的方法
from django.http.response import JsonResponse
def get_json_data(request):
data = {"name": "Egon", "hobby": "喊麦"}
# import json
# return HttpResponse(json.dumps(data),content_type='application/json')
#设置content_type,浏览器会自动反序列化json
<-等同于->
# ret = HttpResponse(json.dumps(data))
# ret['Content-type'] = 'application/json'
# return ret
return JsonResponse(data)
#return JsonResponse([1, 2, 3, 4], safe=False)
#JsonResponse默认只能传递字典类型,如果要传递非字典类型需要设置safe参数
python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)的更多相关文章
- Django视图函数函数之视图装饰器
FBV模式装饰器: 普通函数的装饰器(语法糖@) views.py from django.shortcuts import render def wrapper(f): def inner(*arg ...
- 【转】Django中的request与response对象
关于request与response 前面几个 Sections 介绍了关于 Django 请求(Request)处理的流程分析,我们也了解到,Django 是围绕着 Request 与 Respon ...
- python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解
python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...
- Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request对象方法,属性和Response对象,form表单的上传
Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request请求对象方法,属性和Response响应对象,form表单的上传 一丶CBV和FBV 在Django中存 ...
- Python自动化运维之6、函数装饰器
装饰器: 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大.装饰器一般接受一个函数对象作为参数, ...
- Python自动化面试必备 之 你真明白装饰器么?
Python自动化面试必备 之 你真明白装饰器么? 装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多小白来讲,这个功能 有点绕 ...
- python语法生成器、迭代器、闭包、装饰器总结
1.生成器 生成器的创建方法: (1)通过列表生成式创建 可以通过将列表生成式的[]改成() eg: # 列表生成式 L = [ x*2 for x in range(5)] # L = [0, 2, ...
- python函数之闭包函数与无参装饰器
一.global与nonlocal #global x = 1 def f1(): global x # 声明此处是全部变量x x = 2 print(x) f1() # 调用f1后,修改了全局变量x ...
- [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)
oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...
随机推荐
- UFUN函数 UF_ATTR函数(UF_ATTR_assign ,UF_ATTR_read_value )
UF_initialize(); tag_t ; ]="零件名称"; UF_ATTR_value_t value; value.type=UF_ATTR_string; value ...
- 通过redash query results 数据源实现跨数据库的查询
redash 提供了一个简单的 query results 可以帮助我们进行跨数据源的查询处理 底层数据的存储是基于sqlite的,期望后期有调整(毕竟处理能力有限),同时 query results ...
- linux patch 简单学习
使用patch 我们可以方便的进行软件补丁包处理,以下演示一个简单的c 项目补丁处理 原代码 app.c #include <stdio.h> int main(){ printf(&qu ...
- 【luoguP2999】 [USACO10NOV]巧克力牛奶Chocolate Milk
题目链接 考虑每条路径都经过的一个点,它可以到达每个出度为零点(终点),且每个入读为零点(起点)都能到达它, 拓扑排序记录下每个结点能到达的出度为零点的个数和沿反边能到达的入读为零点个数,判断是否等于 ...
- mysql 去除字符串中的空格
mysql> select " ddd dddee "; +--------------+ | ddd dddee | +--------------+ | ddd ddde ...
- 刷题记录:Shrine
目录 刷题记录:Shrine 刷题记录:Shrine 题目复现链接:https://buuoj.cn/challenges 参考链接:Shrine 解此题总结一下flask的SSTI:CTF SSTI ...
- 在IDEA上对SpringBoot项目配置Devtools实现热部署
spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. devtool ...
- AOP通知类型
AOP通知类型 前置通知 在目标方法执行之前进行操作 后置通知 在目标方法执行之后 进行操作 环绕通知 在目标方法执行之前 和之后进行操作 public Object arount() 异常抛出通知 ...
- Net core学习系列(二)——Net Core项目文件简介
一. ASP.NET Core 项目文件夹解读 ASP.NET Core 1.0 发布以来,相较于传统项目编码发布的行为,新项目中的操作已经有了很大的变化,如解析依赖,选择运行平台和Runtime等等 ...
- 第10组 Beta冲刺(5/5)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 将数据分析以可视化形式展示出来 新增数据分析展示等功能API 服务器后端部署, ...