vlambda博客
学习文章列表

【技术选型】Django还是Flask?这是个问题!

Django和Flask,是Python语言在WEB开发领域中占据了半壁江山的两个框架。在我们实际开发过程中,如何从这两者之间二选一呢?

【技术选型】Django还是Flask?这是个问题!


01

半壁江山的两个WEB框架

【技术选型】Django还是Flask?这是个问题!

在2019年Python官方年度报告中,Django和Flask两个框架的使用率都是远远高于其它WEB框架的:

【技术选型】Django还是Flask?这是个问题!


在Github上这两者的stars数量也几乎是平分秋色。真是堪称Python在WEB开发领域的两大扛把子。

【技术选型】Django还是Flask?这是个问题!


【技术选型】Django还是Flask?这是个问题!

于是,甜蜜的烦恼开始了。两者框架之间,到底该选哪一个呢?


02

不同的设计理念

【技术选型】Django还是Flask?这是个问题!

虽然Django和Flask都是WEB开发框架,但是它们的设计理念是截然不同的。我们从两者的官方简介中就可以看出端倪。


Django的官方简介是:

The Web framework for perfectionists with deadlines.


这句话,我把它粗暴的意译了一下,发现简直就是霸气侧漏啊:


”如果你(跟作者本人一样),是一个有拖延症(项目总是拖到Deadline之前才交付)的完美主义者(又拖延症又完美主义,这还有救吗?),那么你就该用Django!”


Flask的官方简介,则低调内涵的多:

The Python micro framework for building web applications.


直译就是:“用于创建网页应用的Python框架“。


重点在一个字。


综上所述,Django框架,走的是大而全的路线。而Flask框架,走得是小而美的路线。




03

想吃法式大餐还是自助火锅?

【技术选型】Django还是Flask?这是个问题!

为了帮助技术小白和新人理解,我再以一个吃货们喜闻乐见的例子类比一下。


假如你去吃饭,有两个餐厅可供你选择,一个是Django餐厅,一个是Flask餐厅。


Django餐厅提供的是法式大餐,有一套固定的套餐体系,从开胃菜、主菜到饭后点心,一应俱全。如果你要吃,就得按Django餐厅的规矩来。而且Django餐厅服务到位,你就乖乖坐着,各样的菜直接端你面前,动筷子张嘴就行了。


Flask餐厅则提供的是自助火锅的服务,给你配上一个基本的锅底,想吃什么菜、配什么酱料的,得自己去拿,自己去配。而且各种菜式品种丰富,一应俱全,想吃啥,自己取来煮就行。而且不像Django餐厅条条框框那么多,你可以发挥自己的想象力,进行各种食材的搭配,如果你愿意,来个荔枝蘸酱油也是可以的。


04

牛刀小试:Hello World

【技术选型】Django还是Flask?这是个问题!

类比完了,我们再来结合实际的框架细节来分析下,首先我们完成一个最简单的在页面上显示Hello World


使用flask

  1.   安装flask, pip install flask

  2.   创建app.py文件,并在其中写入如下代码:

     from flask import Flask
    app = Flask(__name__)  @app.route('/') def hello_world():     return 'Hello World!' if __name__ == '__main__': app.run()

然后运行服务即可。

这个过程非常的简单。


如果是使用django的话,就要复杂一些:

1. 安装django  pip install django

2. 创建项目,django-admin startproject myproject

3. 创建项目子应用,python manage.py startapp myapp

4. 在myapp应用所在目录中的views.py文件中,添加如下代码

from django.http import HttpResponse  def index(request): return HttpResponse("Hello World!")

5.  在mybook文件夹下的urls.py文件中添加路由规则

from django.urls import pathfrom myapp.views import index  urlpatterns = [ path('', index, name='index') ]

然后运行服务即可


对比上述两个过程,我们可以发现,flask实现一个WEB应用会非常的直观与简单。


而Django的话涉及到的步骤会比较多,必须要按照框架自身的要求一步步的来进行。


但是Django这样做也是有好处的,因为工程项目结构很清晰,适合开发大中型项目。


05

如果要使用ORM

【技术选型】Django还是Flask?这是个问题!

我们再看一个更加复杂的例子,通过这个例子,我们可以更加清晰的体会出,Django与flask的区别:如果想在项目中使用ORM,flask和django该如何做呢。


首先来看下flask,flask中是没有集成ORM的,如果需要使用这样的功能,需要手动下载拓展包,并写一些胶水代码来实现。步骤如下:


1.下载flask的拓展orm包flask-sqlalchemy:pip install flask-sqlalchemy


2. 配置数据库(以sqlite数据库为例),在之前创建的app.py文件中加入如下代码:

from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///' + os.path.join(basedir, 'data.sqlite3') + '?check_same_thread=False'app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False


3.      获取SQLAlchemy实例

db = SQLAlchemy(app)


4.      创建model模型类,在app.py文件中加入如下代码:

class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True)
def __repr__(self): return '<User %r>' % self.username
def __str__(self): return self.username


5.      Flask-SQLAlchemy 根据模型类创建数据库与表,在控制台输入如下命令:

flask shell
>>> from app import db>>> db.create_all()


6.      如果想对数据库执行迁移操作,需要再安装一个Flask-Migrate 扩展:pip install flask-migrate 


7.      初始化 Flask-Migrate,在app.py文件中加入如下代码:

from flask_migrate import Migrate
migrate = Migrate(app, db)

8.      然后控制台执行命令:

flask db init
这个命令会创建 migrations 目录,所有迁移脚本都存放在这里。

9.      接下来,就可以控制台使用flask db migrate命令,根据模型的变化,生成迁移脚本,执行 flask db upgrade 命令,把迁移应用到数据库中。


相比flask这样繁多的步骤,在Django中使用ORM则要轻松太多了!Django中直接内置了Django ORM模块,不需要额外下载其它的包,直接按照下述步骤就可以:

1. 将myapp应用注册到项目myproject中:


在myproject文件夹下settings.py文件中,找到INSTALLED_APPS这个配置项,它是一个列表,在最后加一项:

myappapps.MyappConfig

2.  在myapp下的models文件中写model模型类即可,例如

from django.db import models  # Create your models here. class Book(models.Model): title = models.CharField(max_length=30) pub_date = models.DateField()  def __str__(self): return self.title

 3. 在控制台输入命令:

python manage.py makemigrations

生成迁移脚本


python manage.py migrate 

执行迁移脚本


搞定!


对比这样两个步骤发现,Django中将一些WEB开发中常用的模块如ORM、用户认证、后台管理等等模块都进行了内置,使用起来及其的方便。而flask要使用这些拓展模块,则需要自己安装、配置、写更多的胶水代码。


06

结论


了解了这么多,最后得出我们的结论:


1. 从项目规模考虑

    如果你只是想开发一些简单的展示页面,不涉及到复杂的数据结构,交互逻辑,可以优先考虑使用flask。

    反之如果你想快速开发一个大的应用系统(比如新闻类网站、商城、ERP等),那么建议你选择Django,常用的WEB功能它都有,很多想不到的功能它也有。


2. 从项目使用的数据库类型考虑

    如果你的项目使用的是关系型数据库,并且要使用ORM,建议优先考虑Django,因为Django中的ORM实在太太太好用了。
   如果你决定在项目中使用非关系型数据库,如mongodb的话,Django ORM就无英雄用武之地了,可以考虑使用Flask。


3.  从项目时间考虑

     如果你有大把的时间,抱着学习的目的,想把Python web开发WSGI协议原理以及实现过程搞清楚,或者自己喜欢DIY,自己定制组件、是个编码狂魔,那么flask会毫无疑问的满足你的需求。       

    但是如果你需要在短时间内,进行高质量的WEB项目的交付,那么人生苦短,还是用Django吧。




END