Django和Flask的对比
目前学过Django和Flask,之前也看过很多博客上对两种框架的对比,但其实都没有讲得非常详细。我是想从每一个细节去对比两者。
- 核心思想;
- 总体结构;
- 请求响应流程;
- 内置服务器;
- 路由规则;
- 视图函数;
- 信号机制;
- 配置文件;
- 模板;
- session。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
上面我要展开学习的方面,每一点都要展开深入研究。下面是我之前写的,请忽略。
一、核心思想
从FLask和Django的代码以及架构来看,两种框架的出发点是不同的。
FLask只提供你一个包含基本核心功能的框架,其他的功能可以由开发者自由的扩展,比如邮件啊,缓存啊,用户管理啊等等,这也是为什么Flask自称微框架;然而Django却不同,我感觉它的思想和苹果公司差不多,就是我提供你一整套东西,除了IOS,你还是别去外边得瑟了,这是一个相对封闭的系统。Django内置了ORM,内置了用户认证系统,邮件系统,缓存系统等等很多需要的功能模块,它真是包罗万象的感觉。其实它自己的定位也是中大型Web。
看到了上面的基本思想对比,这也就不难发现,Django适合快速的开发,因为它包含几乎所有你想要的功能;而Flask需要自己去扩展,相对来说,还是需要一定功力和时间。但是FLask适合我们系统得去学习。
知乎上有人说过这么一句话,我觉得很形象:Django是一家精装修的房子,屋里的整体设计已经完成,你只需要在相应的模块进行点缀即可;而Flask是一家毛坯房,给你一个总体架构,里面所有的设计需要你一个人完成。
我这里摘抄了一个哥们写的整体对比,写的比较好,原文:Flask入门指南
(1)Flask
- Flask确实很“轻”,不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过
- Flask自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的Python库
- 入门简单,即便没有多少web开发经验,也能很快做出网站
- 非常适用于小型网站
- 非常适用于开发web服务的API
- 开发大型网站无压力,但代码架构需要自己设计,开发成本取决于开发者的能力和经验
- 各方面性能均等于或优于Django
- Django自带的或第三方的好评如潮的功能,Flask上总会找到与之类似第三方库
- Flask灵活开发,Python高手基本都会喜欢Flask,但对Django却可能褒贬不一
- Flask与关系型数据库的配合使用不弱于Django,而其与NoSQL数据库的配合远远优于Django
- Flask比Django更加Pythonic,与Python的philosophy更加吻合
(2)Django
- Django太重了,除了web框架,自带ORM和模板引擎,灵活和自由度不够高
- Django能开发小应用,但总会有“杀鸡焉用牛刀”的感觉
- Django的自带ORM非常优秀,综合评价略高于SQLAlchemy
- Django自带的模板引擎简单好用,但其强大程度和综合评价略低于Jinja
- Django自带ORM也使Django与关系型数据库耦合度过高,如果想使用MongoDB等NoSQL数据,需要选取合适的第三方库,且总感觉Django+SQL才是天生一对的搭配,Django+NoSQL砍掉了Django的半壁江山
- Django目前支持Jinja等非官方模板引擎
- Django自带的数据库管理app好评如潮
- Django非常适合企业级网站的开发:快速、靠谱、稳定
- Django成熟、稳定、完善,但相比于Flask,Django的整体生态相对封闭
- Django是Python web框架的先驱,用户多,第三方库最丰富,最好的Python库,如果不能直接用到Django中,也一定能找到与之对应的移植
- Django上手也比较容易,开发文档详细、完善,相关资料丰富
二、总体架构
这个看代码结构就可以了。
三、请求响应流程
我之前写了两篇博客,分别介绍了Django和Flask的响应处理流程,有兴趣的可以参考一下:Flask响应处理流程 Django响应处理流程。
其实两者处理流程大致上是一致的,主要的几部:
- 构造请求类。不同的是Flask会将request压入栈中(LocalStack),这和Django将Request类当做参数传入的概念是完全不同的。
- 执行钩子函数,在Django中叫做中间件,这两者都定义了process_request;
- 根据路由规则,对于path_info获得对应的视图函数或者视图类。只是两者路由的思想还是有所不同的,Flask会在app中定义一个url_map,该Map列表含有所有的URL Rule,然后当匹配是会根据URLAdapter的match方法去匹配。Django是创建一个RegexResovler,用来在指定的url模块(ROOT_URLCONF)的urlpatterns列表中匹配对应的url。
- 执行视图函数或视图类、process_view;
- 得到视图函数的返回值,并执行process_response;
- 构造标准的Reponse类(满足WSGI)
上面的流程中,其实还有在处理开始和响应结束时分别发送的信号,我在上面没说。
..............................................分割线.....................................................................
后续慢慢写
2、Django使用内置的模板语言,简称DTL,不过也可以用Jinja。Flask就是基于Jinja2的。
3、Django中捕获的参数永远是字符串
urlpatterns = [url(r'^blog/$', views.page),url(r'^blog/page(?P<num>[0-9]+)/$', views.page),]
# View (in blog/views.py)
def page(request, num="1")
:# Output the appropriate page of blog entries, according to num.
而在Flask中可以定义字符串,整数等不同类型的参数:
@article.route('/<int:article_id>')
@cache.cached(timeout=50)
def view(article_id):
pass
4、模板处理无效变量
Django模板处理无效变量和Flask中的JInja2不同,Django会认为无效的变量为空,即不显示,它不会抛出异常。但是JInja2不同,如果变量不存在,它会抛出异常,提示是无效的变量。
5、请求预处理,请求后
在Django中,使用中间件实现请求的预处理和请求或处后,具体方法分别为process_request以及process_response;在Flask中,使用before_request和after_request装饰器实现对应的处理函数。
参考: 框架对比 正在学习Django,后续会不断补充两者的不同之处。
微信分享/微信扫码阅读