5. 使用Flask藍圖(blueprint)
一直到現在都沒有怎麼寫程式碼,可能更得比較慢。
作業回顧
先來看一下文章4的作業吧,使用logbook的時候,遇到了時區不對的情況。那麼我們怎麼去解決這個問題呢?
實際上logbook預設採用的是世界標準時間( ofollow,noindex">utc ),而我們的北京時間是比世界標準時間早8個小時的。
解決方案
其實在我們工作中經常會遇到很多奇怪的問題,最最簡單的方式就是使用搜索引擎搜尋對應的報錯資訊。然後找到結果最接近的內容,一般在Stack Overflow/segmentfault/簡書(這也是我瞭解到簡書的途徑)/CSDN/部落格園/開源中國等社群可以找到對應的答案。
遇到問題其實並不可怕,我們有自己的套路去解決就好。
這裡我介紹一下,我個人工作中的一些解決問題的方式吧。
-
官方文件
一切大家常見的問題,基本上都會被寫入到官方文件裡。官方文件一般含有如何使用,以及一些需要注意的地方。
image.png
由於官網是英文版,所以需要有一定的英文基礎。由於沒有搜尋框,所以只能暫時利用瀏覽器的ctrl+f搜尋關鍵字了。試圖搜尋"time"和"utc"關鍵字,無果。
-
Github/Stack Overflow
作為一個star量1000+的opensource專案,必定會有一群俠義人士幫忙維護更新以及提出解決問題(這也是我選擇它的原因)。所以肯定不只是我一個人遇到了時間的問題。
果斷進入github,搜尋logbook
image.png
進入之後點選issues(問題)頁面
image.png
可以看到,目前有32個開啟的問題,裡面都是關於大家使用問題之後的反饋。第一眼就看到了correct date這個問題,注意上面是有搜尋框的,所以我們可以直接搜尋utc。現在我們進入檢視一下。
image.png
可以看到,這不是我們想要的答案,這些人和我們一樣都是被困惑的。
但沒關係,我們可以利用剛才的搜尋框。在搜尋框中輸入utc,我們優先看我們需要的問題。
image.png
(簡單的改變,可以允許展示本地時間)
我們進入這個issue
image.png
可以看到這是一個pull requests,簡稱pr。pr大概意思是說,雖然專案是A或者A團隊做的,但是你有一些改進或者修復,可以提交pr並通過A稽核過後將你的程式碼合併到master分支(這個好像是git教程了)。這裡可以看到這人說他不想顯示utc時間,但是又木有現有方法顯示本地時間。
在一大堆巴拉巴拉及互相討論以後,將api命名為set_datetime_format,好了,我們想要的東西拿到了。現在去程式碼裡看看吧!
image.png
所以可以看到,我們呼叫logbook.set_datetime_format("local"),這樣就能把時間設定為本地時間了。接著來測試一下~
先上logger.py檔案
import logbook from .decorator import SingletonDecorator from .. import app @SingletonDecorator class Log(object): handler = None def __init__(self, name='app', filename=app.config['LOG_NAME']):# Logger標識預設為app self.handler = logbook.FileHandler(filename, encoding='utf-8') logbook.set_datetime_format("local")# 將日誌時間設定為本地時間 self.logger = logbook.Logger(name) self.handler.push_application() def info(self, *args, **kwargs): return self.logger.info(*args, **kwargs) def error(self, *args, **kwargs): return self.logger.error(*args, **kwargs) def warning(self, *args, **kwargs): return self.logger.warning(*args, **kwargs) def debug(self, *args, **kwargs): return self.logger.debug(*args, **kwargs)
接下來測試一下修改後的hello world介面run.py
from server.app import app from server.app.utils.logger import Log from datetime import datetime @app.route('/') def hello_world(): log = Log("hello world專用") now = datetime.now().strftime("%Y-%M-%d %H:%M:%S") log.info("有人訪問你的網站了") print(now) return now if __name__ == '__main__': app.run()

image.png
-
StackOverflow
學習golang以來,時常會用到,所以大家可以多上去一下。雖然英文居多,但是也順便培養下自己的閱讀能力。好了,我要去給剛才那2個使用者回答一下設定local_format_string了。
使用藍圖blueprint
-
引入目的
不知道大家有沒有關注過瀏覽器的url情況,作為一個測試,比如我們會經常見到/login這些url,不同的url當然有自己不同的含義啦。如果我們接下來介面很多,比如一個user,需要有增刪改查等介面,如果全部寫在run.py裡面,會太雜亂了。所以我們打算引入藍圖來幫我們解決這個問題。
-
使用方法
我一般都會丟擲官網的例項,但是我這裡推薦一本書,Flask相關的,我們叫它狗書。長下面這個樣子~如果要深入學習flask的話,適合看看,也不厚重。

image.png
廢話少說,今天作業講太多了,正題沒了。
由於我們做前後端分離,所以後端杜絕任何與html有關的東西,比如我如果現在要做使用者模組的話。我需要我的url路徑統一以/user開始,後面再按照內容劃分。
以簡書為例,大概講一下,雖然這似乎是前端的路由。不過後端也差不多適應,大家可以瞭解下restful api的概念。

image.png
比如我這邊的使用者登入介面,我是打算這樣命名: /user/register, 前面的user代表模組,後面代表內容。這樣特別清晰明瞭。
那我們開始吧!
首先我們需要建立views資料夾,專門處理檢視,負責呼叫controller的函式。舉個栗子!

image.png
這裡我建立了auth(認證模組),又建立了User.py檔案。
User.py
from flask import Blueprint from flask import jsonify user = Blueprint("user", __name__, url_prefix="/user") @user.route("/register")# 這裡以user.route註冊的函式都會自帶/user,所以url是/user/register def register(): return jsonify(dict(status=True, msg="註冊成功"))
這裡我直接return了json字串: {"status": true, "msg": "註冊成功"}
,因為我的具體函式還沒開始寫。
然後我們需要在app中註冊這個藍圖! app/__init__.py
程式碼如下
from flask import Flask # 匯入各個模組 from .views.auth.User import user from ..config import Config app = Flask(__name__) app.register_blueprint(user) app.config.from_object(Config)
好啦,我們重啟run.py服務。

image.png
然後進入瀏覽器,輸入localhost:5000/user/register

image.png
可以看到,這邊msg並不是"註冊成功"的中文,這個跟瀏覽器編碼有關係。
怎麼解決這個問題呢,嘿嘿,還是我剛才說的,可以去搜索flask jsonify中文亂碼。
總結
這樣我們的一個藍圖就描繪完了,想起以前自己試著寫jenkins的部落格,寫了2次就斷更了。現在居然寫了5篇,但是覺得如此效率太低了。可能以後只會編碼了,會抽重點講了~~
這就當做下次的作業吧,不過也是選修。畢竟給前端使用的話,問題不大。

image.png
這個是最終效果~
上一篇: 為HelloWorld新增日誌
下一篇: 暫無
github地址: https://github.com/wuranxu/Lamb