关于Python三大Web框架浅谈一嘴:
Django、Flask和Tornado三个框架都是Python Web应用的开发框架,虽然它们都能够开发Web应用,但在使用方式、适用领域和处理方式上还是有很多不同的。
Django——专栏地址:《Django框架从入门到实战》
Django是一个高层次(大而全)的Python Web框架,它采用了MVC模式,集成了ORM框架、自带的后台管理系统和认证框架,提供了丰富的应用程序接口(API),如:中间件、Form、session、缓存、信号、CSRF等。可以快速开发出功能齐全的Web应用程序,非常适合用于大规模的Web应用开发。
优势:
劣势:
Django是一个比较重量级的框架,对服务器资源和数据存储要求较高,适合处理大规模数据和高负载应用场景,但对小型应用程序来说则显得过于臃肿。
Django需要较长的学习时间,需要熟悉其体系结构,以及如何使用其模块进行开发和部署。
Flask——专栏地址:《Flask框架从入门到实战》
Flask是一个短小精悍、可扩展强、第三方组件非常丰富的轻量级的Python Web框架,它基于Werkzeug、Jinja2模板引擎和WSGI工具箱开发,相比Django更加灵活,功能和体积都较小,适用于中小型Web应用开发。
优势:
劣势:
Tornado——专栏地址:《tornado框架从入门到实战》
Tornado是一个短小精悍、异步非阻塞的Python Web框架,基于异步IO操作和协程实现数据同步,内部使用的是异步网络库(tornado.ioloop)和协程库(tornado.gen),能够高效处理高并发和大流量的Web服务。
优势:
劣势:
总结:
三大Web框架各自的适用场景:
值得一提的是,当1000个请求同时到来时,这三个框架在处理上各有不同(可能就是你的技术面一道题哦~):
Django的处理方式: Django是一个基于WSGI协议(wsgiref)的Web框架,由于它是同步阻塞的架构,每个请求的处理必须等待前一个请求的处理完成后才能开始。因此,当有大量请求同时到来时,Django会发生阻塞,导致请求超时或响应延迟等问题。
Flask的处理方式: Flask同样是一个基于WSGI协议(werkzeug)的Web框架,但是它采用的是基于线程的架构,即每个请求会在单独的线程中处理。因此,当有大量请求同时到来时,Flask可以利用多线程来处理请求,但由于线程上下文切换成本,也存在性能和效率上的问题。
Tornado的处理方式: Tornado是一个异步非阻塞的Web框架,采用单线程Reactor模型,通过事件循环机制处理请求。当有大量请求同时到来时,Tornado可以快速的将请求放到消息队列中,并且在请求的数据处理阶段和IO传输阶段均是异步的,因此不会造成阻塞和等待。在性能和并发上表现的非常优异。
因此,一千个请求同时到来时,Django和Flask处理速度可能会变慢,出现阻塞或线程饱和等问题,而Tornado凭借其异步非阻塞的方式,可以更好地处理并发请求,提高性能和吞吐量。使用Tornado可以更好的满足高并发的网站需求,在一些对性能有严格要求的场景下表现非常突出。
Flask就是在下面这段代码之上进行开发的一个web系统【下面会走进Flask源码看到类似的代码】。
from werkzeug.wrappers import Request, Response from werkzeug.serving import run_simple @Request.application def hello(request): return Response('hello world') if __name__ == '__main__': # 请求一旦进来,执行第三个参数加括号 run_simple('localhost', 4000, hello) # hello(xxx)
from flask import Flask app = Flask(__name__) # 一个Flask类对象 @app.route('/') def index(): return 'hello world' if __name__ == '__main__': app.run() # run_simple(host, port, app)
可以查看一下Flask源码【进入app.run()的run方法里】,来证实Flask是基于werkzeug开发的。
如上图,可以看到最终运行的就是werkzeug的run_simple()方法
而在werkzeug版本的hello world里说过请求一旦进来,就会执行run_simple()方法第三个参数加括号
此处是app对象调用的run()方法,所以第三个参数self就是app对象
app对象加括号就是调用对象的call()方法【留坑,后面会继续深究~】
以下是常用的Flask第三方组件的官方文档链接:
这些文档不仅包含了这些插件的使用说明,还提供了官方的API文档、示例和用法,可以快速了解和学习。