1. 目錄結構
一般情況下,Django很系統、統一。Flask項目目錄風格不同一,即使用上了藍圖。
2. 數據庫遷移
Flask要用第三方extensions,而Django自帶,這個很方便。
3. 模塊化
Flask是用藍圖。Django可以自動生成python manage.py startapp <app_name>
,並在Django的項目的settings那個INSTALLED_APPS字典里注冊一下就好。
4. 命令行
Django的命令行初始更多功能,例如migrate。但Flask自定義命令很簡單。
啟動方面,Flask有兩種,一種是通過manage.py幫助腳本去運行,另一種是export環境變量,用flask run來運行,官方文檔建議后面這種,1.02版本還新增了一個環境變量FLASK_ENV。因為Flask依賴5個包,其中一個是click,所以可以自定義CMD。
@app.cli.command()
def hello():
click.echo('Hello, xxx!')
flask hello
5. 新建模型方面差不多。
它們都是繼承ORM的Model。建模之后都是要加入到數據庫中,就是做一個數據庫遷移操作。
Flask是傳入想要創建的字段類型到model.Column,而Django有明顯的類給你使用,例如models.charField。
6. 反向獲取URL
urlpatterns = [
path('', views.post_list, name='post_list')
]
這個name,相當於Flask的endpoint。意思都是通過反向這個名字,reverse(name)去獲得URL。
// 在模板中
<a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1> //Django
{% url_for('") %} // Flask
7. 路由
Django的路由和view functions是分開寫的:urls.py, views.py。而Flask是都寫在views.py中,view function和url寫在一起(以裝飾器的形式app.route)。
因為Django是MTV模式。其實和MVC模式差不多。大致上是Controller變成了views.py和urls.py。
Flask命令行中使用flask routes可以查看URL與view function的映射關系。代碼中使用app.url_map可以查看。
8. 中間件使用
Django在settings.py里設置,
Flask要初始化中間件實例,然后傳入app(Flask)實例。
9. Request對象
Django中,每個view function或者CBV中都要寫一個request參數。而Flask的view function則不用,因為
from flask import request
# 這個request是對每個請求獨立的,就像g變量。值得研究底層原理(Flask通過本地線程( thread local) 技術將請求對象在特定
的線程和請求中全局可訪問)
10. 限制http請求方法
Flask
@app.route('/hello', methods=['GET', 'POST'])
def hello():
return '<h1>Hello, Flask!</h1>'
Django
from django.views.decorators.http import require_http_methods
@require_http_methods(['GET','POST'])
def login(request):
pass
11. 鈎子函數
Flask,加鈎子裝飾器
@app.before_request
def do_something():
pass # 這里的代碼會在每個請求處理前執行
Django,通過中間件