1. 最小的demo出發(fā)
web項目在實(shí)際上依啰,是針對請求方發(fā)來的HTTP請求驾霜,做出相應(yīng)的回應(yīng)案训,把請求方請求的東西以文本形式返回給請求方,請求方的瀏覽器會解析文本粪糙,顯示出來强霎。
使用框架的好處就是省去了編寫通信、處理URL等繁瑣的過程蓉冈。下面城舞,介紹一下基于Flask,如何快速的搭建一個web項目骨架寞酿。
第一步家夺,啟動服務(wù)器。
'''
/config.py
項目配置文件伐弹,處理log
'''
# -*- coding: utf-8 -*-
import logging
from logging import handlers
class Config():
@staticmethod
def init_app(app):
log_file = "app.log"
_handler = handlers.RotatingFileHandler(log_file, maxBytes=1024*1024, backupCount=1)
formatter = logging.Formatter("%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s")
_handler.setFormatter(formatter)
_handler.setLevel(logging.WARNING)
app.logger.addHandler(_handler)
class DefaultConfig(Config):
pass
config = {
'default': DefaultConfig
}
定義了Config基類拉馋,其中配置了一個log輸出,用來記錄訪問服務(wù)器時出現(xiàn)的Warning。
使用基類的好處是煌茴,面對不同環(huán)境時随闺,要實(shí)現(xiàn)不同的配置,只需要繼承Config基類景馁,并且加入到config字典中板壮。調(diào)用對應(yīng)的配置到字典中依據(jù)key查找就行了,便于擴(kuò)展和維護(hù)合住。
'''
/app/__init__.py
創(chuàng)建Flask類的實(shí)例绰精,F(xiàn)lask框架為我們做的事情都圍繞這個實(shí)例進(jìn)行
'''
# -*- coding: utf-8 -*-
from flask import Flask
from config import config
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
return app
創(chuàng)建Flask實(shí)例,并且將配置文件注冊到app實(shí)例中透葛。
'''
/manage.py
項目入口笨使,利用Flask-Scripts包管理
'''
# -*- coding: utf-8 -*-
from app import create_app, db
from flask_script import Manager
app = create_app("default")
manager = Manager(app)
if __name__ == "__main__":
manager.run()
下面,運(yùn)行python manage.py runserver
命令僚害,即可看到:
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
此時只是啟動服務(wù)器硫椰,F(xiàn)lask默認(rèn)在5000端口監(jiān)聽請求。不過萨蚕,現(xiàn)在還沒有給服務(wù)器設(shè)置任何處理URL的方法靶草,訪問http://127.0.0.1:5000
會得到404錯誤:127.0.0.1 - - [14/Sep/2016 16:53:58] "GET / HTTP/1.1" 404 -
。
第二步岳遥,處理請求奕翔。
Flask可以利用裝飾器,把URL和處理函數(shù)關(guān)聯(lián)起來(稱為路由)浩蓉,省了很多工夫派继。
@app.route("/")
def index():
return "Hello,world"
再次訪問http://127.0.0.1:5000/
時,就會跳轉(zhuǎn)到這一函數(shù)捻艳,能看到界面上顯示出“Hello,world”驾窟。
但是簡單的添加路由給app實(shí)例是不行的。因為我們的需求要求有后臺管理和前臺顯示兩個模塊认轨,要求在Flask框架這一層把應(yīng)用割裂绅络。藍(lán)圖(Blueprint)可以完美的完成這一任務(wù)。
引用官方文檔:對于一個類似 Twitter 的微型博客嘁字,我們可能有一個針對網(wǎng)站頁面的藍(lán)圖昨稼,例如,index.html和about.html拳锚。接著我們還有另外一個帶有登錄面板的藍(lán)圖假栓,在那里我們顯示了所有最新的文章,然后我們還有一個用于后臺管理的面板的藍(lán)圖霍掺。網(wǎng)站的每一個不同的區(qū)域也能夠被分成不同區(qū)域的代碼來實(shí)現(xiàn)匾荆。這能夠讓我們用幾個小的 “apps” 構(gòu)建我們的應(yīng)用程序拌蜘,每一個app都在做一件事情。
如下圖牙丽,由路由注冊給app轉(zhuǎn)而把路由注冊給藍(lán)圖简卧,這樣實(shí)現(xiàn)了應(yīng)用的模塊化。
使用步驟如下:
首先烤芦,創(chuàng)建一個名為main的Blueprint實(shí)例举娩,將路由函數(shù)與main綁定起來:
'''
/app/main/__init__.py
'''
# -*- coding: utf-8 -*-
from flask import Blueprint
main = Blueprint("main", __name__)
from . import views
'''
/app/main/views.py
'''
from . import main
@main.route("/")
def index():
return "Hello,world"
然后,把main這一Blueprint實(shí)例注冊到app實(shí)例中:
'''
/app/__init__.py
更改:注冊main藍(lán)圖
'''
# -*- coding: utf-8 -*-
from flask import Flask
from config import config
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
from .main import main as main_blueprint
main_blueprintapp.register_blueprint(main_blueprint)
return app
重新運(yùn)行運(yùn)行python manage.py runserver
命令构罗,在瀏覽器中訪問http://127.0.0.1:5000
铜涉,可以看到“Hello,world”字樣遂唧。
第三步芙代,將處理結(jié)果填入前端模板。
上一步我們寫了路由盖彭,可以處理對應(yīng)的HTTP請求了纹烹,還需要把處理結(jié)果填入前端模板,總不能只返回一句hello world吧召边。更改藍(lán)圖中views.py
文件铺呵,使用Flask提供的render_template
方法來調(diào)用html
文件。
'''
/app/main/views.py
更改:調(diào)用指定的html文件隧熙,并傳入?yún)?shù)
'''
from . import main
from flask import render_template
@main.route("/")
def index():
article_list = ["foo", "foo", "foo", "foo"]
return render_template("index.html", list=article_list)
<!-- /templates/index.html -->
<!--
在templates文件夾中寫入index.html文件陪蜻,F(xiàn)lask會自動到這個文件夾中尋找。
名字必須是templates贱鼻。
Flask基于Jinja模板引擎,能夠?qū)魅氲膌ist參數(shù)填充到html模板中滋将。
這里不再寫html的具體實(shí)現(xiàn)邻悬。
-->
效果圖:
2. 總結(jié)
在上面,我們首先啟動了一個服務(wù)器随闽,然后處理請求父丰,最后把結(jié)果以html的形式返回,web骨架已經(jīng)搭起來了掘宪。下面博客要做的事情主要有:
- admin后臺管理蛾扇。
- 創(chuàng)建數(shù)據(jù)庫,保存博客的數(shù)據(jù)魏滚,用戶的數(shù)據(jù)镀首。
- 寫更多的路由來處理不同的請求。如發(fā)布一篇博客鼠次,需要將新博客的數(shù)據(jù)存儲到數(shù)據(jù)庫中更哄。查詢博客芋齿,編輯博客等請求也是一樣。
- 美化模板成翩,使用bootstrap模板觅捆。
。麻敌。栅炒。
可以看出,這些功能都是在我們的項目骨架之下的术羔,無非是路由處理請求時需要與數(shù)據(jù)庫交互赢赊,增加新的admin藍(lán)圖而已。以后會進(jìn)行說明聂示。
下面是現(xiàn)在的項目文件夾:
D:\micro-blog>tree /F
卷 project 的文件夾 PATH 列表
D:.
│ app.log
│ config.py
│ manage.py
│
└─app
│ models.py
│ __init__.py
│
├─admin
├─main
│ views.py
│ __init__.py
│
└─templates
index.html