续--Flask, Django - 区别
1. 目錄結構? ? ? ? ?參考:https://blog.csdn.net/yang9520/article/details/79740374? ?
一般情況下,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。
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('") %} // Flask7. 路由
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 request10. 限制http請求方法
Flask
@app.route('/hello', methods=['GET', 'POST']) def hello(): return '<h1>Hello, Flask!</h1>'Django
from django.views.decorators.http import require_http_methods11. 鉤子函數
Flask,加鉤子裝飾器
Django,通過中間件
框架之間的差別
-
Django功能大而全,Flask只包含基本的配置 Django的一站式解決的思路,能讓開發者不用在開發之前就在選擇應用的基礎設施上花費大量時間。Django有模板,表單,路由,認證,基本的數據庫管理等等內建功能。與之相反,Flask只是一個內核,默認依賴于兩個外部庫: Jinja2 模板引擎和 Werkzeug WSGI 工具集,其他很多功能都是以擴展的形式進行嵌入使用。
-
Flask 比 Django 更靈活 用Flask來構建應用之前,選擇組件的時候會給開發者帶來更多的靈活性 ,可能有的應用場景不適合使用一個標準的ORM(Object-Relational Mapping 對象關聯映射),或者需要與不同的工作流和模板系統交互。
-
Flask 在 Django 之后發布,現階段有大量的插件和擴展滿足不同需要 Django發布于2005年,Flask創始于2010年年中。
入門引導
Flask的Hello World應用的代碼是最簡單的,只用在一個Python文件里碼7行代碼就夠了。
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__":app.run()?
上面代碼就已經是一個簡單的 web 應用,從上面的 Hello World 應用的特點來看,一個沒什么Python web開發經驗的人就可以很快的上手開始擼代碼。
項目區別
Django 創建項目和創建應用
django-admin startproject hello_django django-admin startapp howdy?
其目錄結構:?
默認情況下,Django項目和應用創建好了之后,只包含空的模型和模板文件,而Flask創建項目之后,目錄里面沒有任何文件,需要我們手動創建,是沒有像Django一樣組件分離,而對于需要把組件分離開的項目,Flask有blueprints。例如,你可以這樣構建你的應用,將與用戶有關的功能放在user.py里,把與銷售相關的功能放在ecommerce.py里。
Django把一個項目分成各自獨立的應用,而Flask認為一個項目應該是一個包含一些視圖和模型的單個應用。當然我們也可以在Flask里復制出像Django那樣的項目結構。
模版
Django的模版大家都很熟悉,我們舉一個簡單的例子
<!-- view.html --> <div class="top-bar row"><div class="col-md-10"><!-- more top bar things go here --></div>{% if user %}<div class="col-md-2 whoami">You are logged in as {{ user.fullname }}</div>{% endif %} </div> {% for widget in inventory %}<li><a href="/widget/{{ widget.slug }}/">{{ widget.displayname }}</a></li> {% endfor %}?
Flask默認使用一個受Django啟發而發展起來的名為Jinja2的模板,其實,所有上面的Django模板的例子在Jinja2里也是好使的。
模版簡單對比
<!-- Django --> <div class="categories">Categories: {{ post.categories|join:", " }}</div><!-- Jinja --> <div class="categories">Categories: {{ post.categories|join(", ") }}</div>?
在Jinja的模板語言里,可以把任何數量的參數傳給過濾器,因為Jinja像調用一個Python函數的方式來看待它,用圓括號來封裝參數。Django使用冒號來分隔過濾器名和參數,這樣就只能傳遞一個參數了。
- Flask的Jinja模版 for-else-endfor
?
- Django模版 for-empty-endfor
?
除了上述的語法區別,Flask還提供了很多特有的上下文變量(url_for,get_flashed_messages()等)
----------------------------------------------------------------------------------
Flask框架主要的特點是輕巧,簡介,擴展性強;核心就是?Werkzeug(路由模塊) ,模板引擎則使用 Jinja2 。
Flask內置的6種轉換器:
‘path’??‘string’??‘any’??‘int’??‘float’??‘uuid’
Josn?和xml?的區別:首先他們都是用來數據交互的,其次josn 更加輕量些
?
Flask中有兩種上下文,請求上下文和應用上下文。
上下文:相當于一個容器,他保存了Flask程序運行過程中的一些信息。
?
?
請求上下文(request context)
request和session都屬于請求上下文對象。
request:封裝了HTTP請求的內容,針對的是http請求。舉例:user = request.args.get('user'),獲取的是get請求的參數。
(通俗來說:Request主要用來獲取客戶端發送過來的一些參數)
?
session:用來記錄請求會話中的信息,針對的是用戶信息。舉例:session['name'] = user.id,可以記錄用戶信息。還可以通過session.get('name')獲取用戶信息。
(通俗來說:Session主要用來實現一些用戶的會話信息)
?
?
應用上下文(application context)
current_app和g都屬于應用上下文對象。
current_app:表示當前運行程序文件的程序實例。我們可以通過current_app.name打印出當前應用程序實例的名字。
(通俗來說:Current_app代表當前程序運行實例,只要程序沒有暫停終止,他會一直存在,?可以幫助我們記錄項目日志)
g:處理請求時,用于臨時存儲的對象,每次請求都會重設這個變量。比如:我們可以獲取一些臨時請求的用戶信息。
(通俗來說:g對象和request和session比較像,請求過程中幫助我們創建,請求結束后銷毀,是起到一個臨時存儲的作用)
- 當調用app = Flask(_name_)的時候,創建了程序應用對象app;
- request 在每次http請求發生時,WSGI server調用Flask.call();然后在Flask內部創建的request對象;
- app的生命周期大于request和g,一個app存活期間,可能發生多次http請求,所以就會有多個request和g。
- 最終傳入視圖函數,通過return、redirect或render_template生成response對象,返回給客戶端。
區別:?請求上下文:保存了客戶端和服務器交互的數據。 應用上下文:在flask程序運行過程中,保存的一些配置信息,比如程序文件名、數據庫的連接、用戶信息等。
(應用上下文生命周期比請求上下文的生命周期長)
?
?
請求鉤子
在客戶端和服務器交互的過程中,有些準備工作或掃尾工作需要處理,比如:在請求開始時,建立數據庫連接;在請求結束時,指定數據的交互格式。為了讓每個視圖函數避免編寫重復功能的代碼,Flask提供了通用設施的功能,即請求鉤子。
請求鉤子是通過裝飾器的形式實現,Flask支持如下四種請求鉤子:
before_first_request:在處理第一個請求前運行。
before_request:在每次請求前運行。
after_request:如果沒有未處理的異常拋出,在每次請求后運行。
teardown_request:在每次請求后運行,即使有未處理的異常拋出。
轉載于:https://www.cnblogs.com/klb561/p/11298404.html
總結
以上是生活随笔為你收集整理的续--Flask, Django - 区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python的if条件语句(常用)当为多
- 下一篇: IndentationError: un