上一篇介紹了圖像風格遷移的一個最基本實現,雖然在控制檯實現了功能,可是想要實際使用,應用到一個app或者網頁上光靠上一節的內容確定是不行的。那怎麼樣才能夠將風格遷移這個功能變成一個能夠實際使用的小程序呢?不着急,在實現上述功能前,咱們先來介紹一個小東西,也就是這篇文章的主角,我把他稱爲"畢業設計大殺器「的Flask框架。css
在介紹Flask以前,咱們先介紹下什麼是先後端分離。由於若是不介紹先後端分離就不會理解爲啥要選擇Flask了。先後端分離是目前互聯網項目開發的標準使用方式,其核心思想簡單理解爲是前端頁面(或者app等多端)經過ajax(或者其餘請求方式)調用後端的restuful api接口並使用json數據進行交互。其目的是爲了將項目解耦合,達到**"術業有專攻」**的效果。由於在以往的web項目中,後端人員的工做量很是大,用過jsp的人都知道,那真的是又當爹又當媽,既要會寫後臺邏輯還要會弄樣式。可是採用了先後端分離的架構以後,先後端人員就能夠各司其職了。html
前端追求的是:頁面表現,速度流暢,兼容性,用戶體驗等等。前端
把精力放在html5,css3,jquery,angularjs,bootstrap,reactjs,vuejs,webpack,less/sass,gulp,nodejs,Google V8引擎,模塊化,設計模式,瀏覽器兼容性,性能優化等等。vue
後端追求的是:三高(高併發,高可用,高性能),安全,存儲,業務等等。html5
把精力放在語言基礎,設計模式,底層原理,linux,mysql事務隔離與鎖機制,mongodb,http/tcp,多線程,分佈式架構,彈性計算架構,微服務架構,性能優化,以及相關的項目管理等等。node
應用服務器:通常指像tomcat,jetty這類的服務器能夠解析動態資源也能夠解析靜態資源,但解析靜態資源的能力沒有web服務器好。python
Web服務器:通常指像nginx,apache這類的服務器,他們通常只能解析靜態資源。mysql
靜態資源就是相似於html、js、圖片這些屢次訪問也不會變化的資源react
通常都是隻有web服務器才能被外網訪問,應用服務器只能內網訪問。jquery
REST的全稱是representational state transfer,即表徵狀態轉移。在理解這個名詞以前咱們先來看幾個名詞(感受須要知道的前置知識好多啊)。
所謂的資源就是網絡上的一個實體,它可使一個圖片,一個文本,一個服務,你能夠用一個URI指向它,每種資源對應一個特定的URI,要獲取這個資源訪問它的URI就好了,所謂的上網,其實就是與網絡上的資源進行一系列的互動就是了。
怎麼把資源表現出來就是表徵的意義,好比一段文本是txt、html仍是json,圖片是jpg仍是png,以http協議爲例,就是Accept和content-type中的內容,說明了資源的類型。
訪問一個網站,就是客戶端和服務端的一個交互過程,客戶端想要操做服務端,就必須經過某種手段讓服務端的狀態發生變化,具體到http協議中就是http的幾種方法:GET用來獲取資源,POST用來新建資源,PUT用來更新資源,DELETE用來刪除資源。
介紹完先後端分離後,咱們就開始介紹下Flask是什麼吧。
Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱採用 Werkzeug ,模板引擎則使用 Jinja2。Flask也被稱爲 「microframework」 ,即**"微框架"**,由於它使用簡單的核心,用 extension 增長其餘功能。Flask沒有默認使用的數據庫、窗體驗證工具。
"微"框架中的「微」(micro) 並不表示你須要把整個 Web 應用塞進單個 Python 文件(雖然確實能夠 ),也不意味着 Flask 在功能上有所欠缺。微框架中的「微」意味着 Flask 旨在保持核心簡單而易於擴展。Flask 不會替你作出太多決策——好比使用何種數據庫。而那些 Flask 所選擇的——好比使用何種模板引擎——則很容易替換。除此以外的一切都由可由你掌握。默認狀況下,Flask 不包含數據庫抽象層、表單驗證,或是其它任何已有多種庫能夠勝任的功能。然而,Flask 支持用擴展來給應用添加這些功能,如同是 Flask 自己實現的同樣。衆多的擴展提供了數據庫集成、表單驗證、上傳處理、各類各樣的開放認證技術等功能。Flask 也許是「微小」的,但它已準備好在需求繁雜的生產環境中投入使用。
全名Web Server Gateway Interface,即服務器網關接口,是應用程序和Web服務器之間的一種接口。能夠理解爲是服務器程序和應用程序的一個約定,規定了各自使用的接口和功能,以便二和互相配合。
這裏由於篇幅緣由就不給出詳細解釋了,推薦兩片文章,講的挺詳細的。
我把Flask稱爲畢業設計大殺器天然是有他的道理的,接下來咱們看看他的幾大優勢:
上面說了那麼多,大家確定仍是不會理解爲啥要使用Flask,別急,咱們用例子說話。
這裏就很少說了,直接pip install flask
便可。(官方文檔是推薦建立一個虛擬環境的,這裏爲了方便起見,省略了這一步)。
一個最小的 Flask 應用看起來會是這樣:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
複製代碼
把它保存爲 hello.py (或是相似的),而後啓動terminal(powershell)來運行這個文件。 確保你的應用文件名不是 flask.py ,由於這將與 Flask對象自己衝突。
python hello.py
複製代碼
如今訪問 http://127.0.0.1:5000/ ,你會看見 Hello World 早已等候多時。
一旦部署到遠程服務器上以後,這就是一個能夠用GET請求訪問的接口了,是否是很方便呢?若是想更改請求方法也很簡單,只須要在@app.route()裝飾器第二個參數填入想要支持的請求方法就能夠了,以下:
@app.route('/login', methods=['GET', 'POST'])
複製代碼
這樣,login這個路由就能夠支持get和post兩種請求方式了。
所謂 路由,即URL 綁定 Flask 使用 route()
裝飾器把一個函數綁於一個URL上, 以下:
這裏是一些基本的例子:
@app.route('/hello')
def hello_world():
return 'Hello World!'
複製代碼
咱們即可以在本地經過localhost:xxxx/hello
,來獲取到hello函數中的內容。
同時,咱們還可使用add_url_rule()
方法來實現路由的註冊
from flask import Flask
app = Flask(__name__)
def hello():
return 'Hello ,world!'
app.add_url_rule('/hello', viewfunc=hello)
app.run()
複製代碼
其實add_url_rule
是@app.route()
裝飾器內部封裝的一個方法,二者的本質是相同的。不信我們看源碼:
雖說flask想實現一個路由很是簡單,可是在實際的項目中咱們確定是不能把全部的路由都放在初始文件中啊,文件變大不說,還不方便管理,徹底不符合模塊化開發的思想。不過不用擔憂,flask早就幫咱們想好了應對的辦法了。這就是藍圖。
爲了在一個或多個應用中,使應用模塊化而且支持經常使用方案,Flask 引入了藍圖概念。藍圖能夠極大地簡化大型應用併爲擴展提供集中的註冊入口。
接下來則是藍圖的使用(通常位於API級的__init__.py
文件中):
from flask import Flask
def create_app():
app = Flask(__name__)
register_blueprint(app) # 完成藍圖註冊
init_db(app)
return app
def register_blueprint(app): # 註冊藍圖
from app.api.v1 import v1
from app.api.v1.img import img
app.register_blueprint(v1, url_prefix='/api/v1')
# url_prefix添加了這個參數後,全部藍圖路由前面機會自動添加這個參數
# PS:這個參數必須是一個字符串,並且要以' / '開頭
app.register_blueprint(img, url_prefix='/api/v1/img')
複製代碼
以後咱們就能夠在另外一個文件(須要使用app對象的文件,也就是存放路由函數的文件)中將它初始化
from flask import Blueprint # 藍圖引入
img = Blueprint('img', __name__) # 藍圖初始化
複製代碼
其實咱們能夠理解爲就是把主頁面的app對象傳遞到了不一樣的路由文件中了,方便了模塊化的開發。
這裏若是沒有實例展現的話可能不是很容易理解,下一篇文章咱們將會延續上一篇,講一下如何利用Flask將圖像風格遷移的功能變成一個可用的restful api,實例我已經上傳了,你們能夠先在微信公衆號「01二進制」後臺回覆「風格遷移API」把代碼下載下來,體驗下flask項目如何分層纔不會致使混亂。
做爲一個後臺框架,不可缺乏的就是如何與數據庫打交道,flask_sqlalchemy很好的幫咱們解決了這個問題。
在瞭解flask_sqlalchemy是什麼以前先看下sqlalchemy是什麼,我這裏直接引用下廖雪峯大神的介紹:
直接咱們也提過,flask是一個微框架,經過插件來增長功能的,flask_sqlalchemy就是sqlalchemy的一個flask框架,目的就是爲了更加方便的使用ORM技術操做數據庫。
接下來簡單介紹下他的使用方法。
先安裝:pip install flask_sqlalchemy
而後在初始文件中添加以下代碼以配置數據庫鏈接:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() # 實例化
複製代碼
而後在啓動文件中添加以下代碼將flask_sqlalchemy配置到flask對象中:
def init_db(app):
# 註冊db
db.init_app(app)
# 將代碼映射到數據庫中
with app.app_context():
db.create_all(app=app)
複製代碼
這時候別忘了兩件事:數據庫的鏈接配置信息和數據表的定義
咱們在項目中新建一個secure.py文件(專門用於記錄敏感信息),並在其中添加以下字段
DIALECT = 'mysql' # 要用的什麼數據庫
DRIVER = 'pymysql' # 鏈接數據庫驅動
USERNAME = 'xxx' # 用戶名
PASSWORD = 'xxx' # 密碼
HOST = 'localhost' # 服務器
PORT = '3306' # 端口
DATABASE = 'xxx' # 數據庫名
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
複製代碼
建立flask對象的時候別忘了添加下這個配置文件:
app = Flask(__name__)
app.config.from_object('app.secure')
複製代碼
以反饋(feedback)爲例,以下代碼就構建了一個很是簡單的數據庫模型了
from sqlalchemy import Column, Integer, String
from app.model import db
from app.utils import common_utils
class FeedBack(db.Model):
# 反饋記錄的id
id = Column(Integer, primary_key=True, autoincrement=True)
# 反饋人的uid
uid = Column(String(50), nullable=False)
# 反饋的內容
content = Column(String(50), nullable=False)
# 反饋人的聯繫方式
contact = Column(String(50), nullable=False)
# 反饋的來源
origin = Column(Integer, nullable=False)
# 反饋的時間
created_time = Column(String(50), nullable=False)
def __init__(self, uid, content, contact, origin):
self.uid = uid
self.content = content
self.contact = contact
self.origin = origin
self.created_time = common_utils.get_date_now()
複製代碼
而後打開數據庫服務,啓動flask項目,沒有報錯就說明成功了。
咱們總結下,這篇文章的主角是flask,可是想要理解爲啥要使用flask的話咱們必需要有先後端分離的概念,否則咱們是不會體會到flask的便捷之處的。而後緊接着介紹了我認爲剛開始使用flask時的幾個比較重要的東西:路由、藍圖和ORM插件。由於篇幅緣由,沒有很是詳細的介紹使用方法,可是事實上只要會了這三個應付畢業設計是綽綽有餘的,這也就是我將其稱爲畢業設計大殺器的緣由。那麼在哪能夠學到flask呢?
在微信公衆號「01二進制」後臺回覆「flask視頻」便可得到一份很是很是優質的flask視頻
下一篇將會介紹如何用flask結合風格遷移模型給你的應用程序提供一個可用的RESTful API,喜歡的小夥伴能夠微信掃一掃關注轉發和支持,謝謝🙏