1. 程式人生 > >Flask與Django對比

Flask與Django對比

ret 發布 應該 join art 復制 else color bubuko

Flask與Django對比

  • Django vs Flask

技術分享圖片

  • Flask

技術分享圖片

框架之間的差別

  • 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
{% for item in inventory %}
    <div class="display-item">{{ item.render() }}</div>
{% else %}
    <div class="display-warn">
    <h3>No items found</h3>
    <p>Try another search, maybe?</p>
    </div>
{% endfor %}

  • Django模版 for-empty-endfor
{% for item in inventory %}
    <div class="display-item">{{ item.render }}</div>
{% empty %}
    <div class="display-warn">
    <h3>No items found</h3>
    <p>Try another search, maybe?</p>
    </div>
{% endfor %}

除了上述的語法區別,Flask還提供了很多特有的上下文變量(url_for,get_flashed_messages()等)

Flask與Django對比