1,Django
Python 界最流行的 web 框架,据说,在2018年下半年,已被Flask超过。
1998年,最流行的网站开发方式是CGI,简单理解为代码写在一个文件中,打包成CGI格式包并放在服务器,用户即可访问。
2003年,创建者是为了快速制作并维护新闻站点(新闻普遍追求高效率,有时限性),将开发过程重复性工作简化,减少开发过程中出错几率,并降低维护的难度,就诞生了Django。2005年发布于自由社区。
Django Django是免费的,开源的,是从真实世界的应用中成长起来的,不是来自于一个科研项目或者商业产品,因此其主要集中力量来解决Web开发中遇到的问题,同样也是Django的开发者经常遇到的问题。 这样,Django每天在现有的基础上进步。 框架的开发者对于让开发人员节省时间,编写更加容易维护的程序,而无需从头做起,同时保证程序运行的效率具有极大的兴趣。
2,Flask
Flask,是一个轻量级、自由灵活的Python Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask使用BSD授权。 Flask也被称为“microframework”。2010年发布于自由社区。
Flask没有默认的数据库、窗体验证工具。但是Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。
3,Bottle
Bottle是一个遵循WSGI的快速、小巧、轻量级微型Python Web框架。它只有一个文件,且除Python标准库外,它不依赖于任何第三方模块。可以理解为一个小型Flask,是一个小众化应用。
Routing:把请求映射到函数,建立简洁动态的URLs
Templates:采用内置模板引擎,同时还支持 mako, jinja2, cheetah 等第三方模板
Utilities:便捷地读取表单数据、上传文件、 cookies、HTTP头信息和其它 HTTP相关的元数据
Server:内置HTTP开发服务器,并且支持 paste, fapws3, bjoern, Google App Engine, Cherrypy 或者其它任何WSGI HTTP 服务器
Diango与Flask对比
Django | Flask |
---|---|
Django功能大而全,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间 | Flask更灵活,只是一个内核,只包含基本的配置,开发者需自己配置扩展功能 |
Django有模板,表单,路由,认证,基本的数据库管理等等内建功能。 | Flask默认依赖于Jinja2 模板引擎和 Werkzeug WSGI 工具集,很多功能都是以扩展的形式进行嵌入使用。 |
Django支持PostgreSQL,SQLite3(py2.4以前版本),SQLite(2.5以后内建),MySQL4.0以上,Oracle四个数据库 | Flask支持mysql,但数据库引擎是SQLAlchemy |
Django模板引擎是html,也可以配jinja2 | Flask模板引擎是jinja2 |
Django是MTV设计结构,把一个项目分成多个独立的应用 | Flask是MVC结构(可以改造成MTV结构),一个项目即一个包含视图与模型的应用 |
Django项目和应用创建好之后,形成一个包含模型,模板,url.py文件的文件夹 | Flask创建项目之后,就是一个空文件夹 |
项目区别
flask七行代码就可以创建一个helloworld
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
Django 创建项目和创建应用
django-admin startproject hello_django
django-admin startapp howdy
模版
Django的模版大家都很熟悉,我们举一个简单的例子
{{ widget.displayname }}
{% endfor %}
{% for widget in inventory %}
Flask默认使用一个受Django启发而发展起来的名为Jinja2的模板,其实,所有上面的Django模板的例子在Jinja2里也是好使的。
模版简单对比
Categories: {{ post.categories|join:", " }}
Categories: {{ post.categories|join(", ") }}
在Jinja的模板语言里,可以把任何数量的参数传给过滤器,因为Jinja像调用一个Python函数的方式来看待它,用圆括号来封装参数。Django使用冒号来分隔过滤器名和参数,这样就只能传递一个参数了。
Flask的Jinja模版 for-else-endfor
{% for item in inventory %}
{{ item.render() }}
{% else %}
No items found
Try another search, maybe?
{% endfor %}
Django模版 for-empty-endfor
{% for item in inventory %}
{{ item.render }}
{% empty %}
No items found
Try another search, maybe?
{% endfor %}
复制代码
本文只是学习总结,如哪里错误,欢迎指正,部分代码粘贴自网络!
PostgreSQL (http://www.postgresql.org/)
SQLite 3 (http://www.sqlite.org/)
MySQL (http://www.mysql.com/)
Oracle (http://www.oracle.com/)