Flask實(shí)現(xiàn)輕博客(三):項目骨架

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)用的模塊化。

路由注冊給app
路由注冊給藍(lán)圖

使用步驟如下:

首先烤芦,創(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末域携,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鱼喉,更是在濱河造成了極大的恐慌秀鞭,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扛禽,死亡現(xiàn)場離奇詭異锋边,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)编曼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門豆巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掐场,你說我怎么就攤上這事往扔。” “怎么了熊户?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵萍膛,是天一觀的道長。 經(jīng)常有香客問我嚷堡,道長蝗罗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任蝌戒,我火速辦了婚禮串塑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘北苟。我一直安慰自己桩匪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布友鼻。 她就那樣靜靜地躺著吸祟,像睡著了一般瑟慈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屋匕,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天葛碧,我揣著相機(jī)與錄音,去河邊找鬼过吻。 笑死进泼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纤虽。 我是一名探鬼主播乳绕,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逼纸!你這毒婦竟也來了洋措?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤杰刽,失蹤者是張志新(化名)和其女友劉穎菠发,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贺嫂,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滓鸠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了第喳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糜俗。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖曲饱,靈堂內(nèi)的尸體忽然破棺而出悠抹,到底是詐尸還是另有隱情,我是刑警寧澤扩淀,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布楔敌,位于F島的核電站,受9級特大地震影響引矩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侵浸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一旺韭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掏觉,春花似錦区端、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杨何。三九已至,卻和暖如春沥邻,著一層夾襖步出監(jiān)牢的瞬間危虱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工唐全, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留埃跷,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓邮利,卻偏偏與公主長得像弥雹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子延届,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容