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

1. 最小的demo出發(fā)


web項目在實際上,是針對請求方發(fā)來的HTTP請求,做出相應的回應,把請求方請求的東西以文本形式返回給請求方,請求方的瀏覽器會解析文本,顯示出來。

使用框架的好處就是省去了編寫通信、處理URL等繁瑣的過程。下面,介紹一下基于Flask,如何快速的搭建一個web項目骨架。

第一步,啟動服務器。

'''
/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輸出,用來記錄訪問服務器時出現(xiàn)的Warning。

使用基類的好處是,面對不同環(huán)境時,要實現(xiàn)不同的配置,只需要繼承Config基類,并且加入到config字典中。調(diào)用對應的配置到字典中依據(jù)key查找就行了,便于擴展和維護。

'''
/app/__init__.py
    創(chuàng)建Flask類的實例,F(xiàn)lask框架為我們做的事情都圍繞這個實例進行
'''

# -*- 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實例,并且將配置文件注冊到app實例中。

'''
/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()

下面,運行python manage.py runserver命令,即可看到:

 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)  

此時只是啟動服務器,F(xiàn)lask默認在5000端口監(jiān)聽請求。不過,現(xiàn)在還沒有給服務器設置任何處理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實例是不行的。因為我們的需求要求有后臺管理和前臺顯示兩個模塊,要求在Flask框架這一層把應用割裂。藍圖(Blueprint)可以完美的完成這一任務。

引用官方文檔:對于一個類似 Twitter 的微型博客,我們可能有一個針對網(wǎng)站頁面的藍圖,例如,index.html和about.html。接著我們還有另外一個帶有登錄面板的藍圖,在那里我們顯示了所有最新的文章,然后我們還有一個用于后臺管理的面板的藍圖。網(wǎng)站的每一個不同的區(qū)域也能夠被分成不同區(qū)域的代碼來實現(xiàn)。這能夠讓我們用幾個小的 “apps” 構(gòu)建我們的應用程序,每一個app都在做一件事情。

如下圖,由路由注冊給app轉(zhuǎn)而把路由注冊給藍圖,這樣實現(xiàn)了應用的模塊化。

路由注冊給app
路由注冊給藍圖

使用步驟如下:

首先,創(chuàng)建一個名為main的Blueprint實例,將路由函數(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實例注冊到app實例中:

'''
/app/__init__.py
    更改:注冊main藍圖
'''

# -*- 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

重新運行運行python manage.py runserver命令,在瀏覽器中訪問http://127.0.0.1:5000,可以看到“Hello,world”字樣。

第三步,將處理結(jié)果填入前端模板。

上一步我們寫了路由,可以處理對應的HTTP請求了,還需要把處理結(jié)果填入前端模板,總不能只返回一句hello world吧。更改藍圖中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的具體實現(xiàn)。
    -->

效果圖:

效果圖

2. 總結(jié)


在上面,我們首先啟動了一個服務器,然后處理請求,最后把結(jié)果以html的形式返回,web骨架已經(jīng)搭起來了。下面博客要做的事情主要有:

  • admin后臺管理。
  • 創(chuàng)建數(shù)據(jù)庫,保存博客的數(shù)據(jù),用戶的數(shù)據(jù)。
  • 寫更多的路由來處理不同的請求。如發(fā)布一篇博客,需要將新博客的數(shù)據(jù)存儲到數(shù)據(jù)庫中。查詢博客,編輯博客等請求也是一樣。
  • 美化模板,使用bootstrap模板。
    。。。

可以看出,這些功能都是在我們的項目骨架之下的,無非是路由處理請求時需要與數(shù)據(jù)庫交互,增加新的admin藍圖而已。以后會進行說明。

下面是現(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容