Django和Flask,是Python語言在WEB開發領域中占據了半壁江山的兩個架構。在我們實際開發過程中,如何從這兩者之間二選一呢?
01
半壁江山的兩個WEB架構
在2019年Python官方年度報告中,Django和Flask兩個架構的使用率都是遠遠高于其它WEB架構的:
在Github上這兩者的stars數量也幾乎是平分秋色。真是堪稱Python在WEB開發領域的兩大扛把子。
于是,甜蜜的煩惱開始了。兩者架構之間,到底該選哪一個呢?
02
不同的設計理念
雖然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餐廳提供的是法式大餐,有一套固定的套餐體系,從開胃菜、主菜到飯後點心,一應俱全。如果你要吃,就得按Django餐廳的規矩來。而且Django餐廳服務到位,你就乖乖坐着,各樣的菜直接端你面前,動筷子張嘴就行了。
Flask餐廳則提供的是自助火鍋的服務,給你配上一個基本的鍋底,想吃什麼菜、配什麼醬料的,得自己去拿,自己去配。而且各種菜式品種豐富,一應俱全,想吃啥,自己取來煮就行。而且不像Django餐廳條條框框那麼多,你可以發揮自己的想象力,進行各種食材的搭配,如果你願意,來個荔枝蘸醬油也是可以的。
04
牛刀小試:Hello World
類比完了,我們再來結合實際的架構細節來分析下,首先我們完成一個最簡單的在頁面上顯示Hello World。
使用flask
- 安裝flask, pip install flask
- 建立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的差別:如果想在項目中使用ORM,flask和django該如何做呢。
首先來看下flask,flask中是沒有內建ORM的,如果需要使用這樣的功能,需要手動下載下傳拓展包,并寫一些膠水代碼來實作。步驟如下:
1.下載下傳flask的拓展orm包flask-sqlalchemy:pip install flask-sqlalchemy
2. 配置資料庫(以sqlite資料庫為例),在之前建立的app.py檔案中加入如下代碼:
from flask_sqlalchemy import SQLAlchemybasedir = 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 '' % 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 Migratemigrate = 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這個配置項,它是一個清單,在最後加一項:
myapp. apps.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