在單個檔案中開發程式很方便,但卻有個很大的缺點,因為程式在全域性作用域中建立,所以無法動態修改配置。執行指令碼時,程式例項已經建立,再修改配置為時已晚。這一點對單元測試尤其重要,因為有時為了提高測試覆蓋度,必須在不同的配置環境中執行程式。
fromflask import flask
from
flask_bootstrap import bootstrap
from
flask_mail import mail
from
flask_moment import moment
from
flask_sqlalchemy import sqlalchemy
from
flask_login import loginmanager
from
flask_pagedown import pagedown
from
config import config
bootstrap =bootstrap()
mail =mail()
moment =moment()
db =sqlalchemy()
pagedown =pagedown()
login_manager =loginmanager()
login_manager.login_view = '
auth.login
' ...
幸好flask 使用藍本提供了更好的解決方法。藍本和程式類似,也可以定義路由。不同的是,在藍本中定義的路由處於休眠狀態,直到藍本註冊到程式上後,路由才真正成為程式的一部分。使用位於全域性作用域中的藍本時,定義路由的方法幾乎和單指令碼程式一樣。和程式一樣,藍本可以在單個檔案中定義,也可使用更結構化的方式在包中的多個模組中建立。為了獲得最大的靈活性,程式包中建立了乙個子包,用於儲存藍本。下面的例子是這個子包的構造檔案,藍本就建立於此。
from
flask import blueprint
main = blueprint('
main
', __name__)
from . import views, errors
from .main import main as
main_blueprint
from .auth import auth as
auth_blueprint
/auth')
from .api import api as
api_blueprint
/api/v1')
fromflask import render_template, request, jsonify
from
. import main
403)
def forbidden(e):
ifrequest.accept_mimetypes.accept_json and \
not request.accept_mimetypes.accept_html:
response = jsonify()
response.status_code = 403
return
response
return render_template('
403.html
'), 403
在藍本中編寫檢視函式主要有兩點不同:第一,和前面的錯誤處理程式一樣,路由修飾器由藍本提供;第二,url_for() 函式的用法不同。你可能還記得,url_for() 函式的第乙個引數是路由的端點名,在程式的路由中,預設為檢視函式的名字。例如,在單指令碼程式
中,index() 檢視函式的url 可使用url_for('index') 獲取。在藍本中就不一樣了,flask 會為藍本中的全部端點加上乙個命名空間,這樣就可以在不同的藍本中使用相同的端點名定義檢視函式,而不會產生衝突。命名空間就是藍本的名字(blueprint 建構函式的第乙個引數),所以檢視函式index() 註冊的端點名是main.index,其url 使用url_for('main.index') 獲取。
url_for() 函式還支援一種簡寫的端點形式,在藍本中可以省略藍本名,例如url_for('.index')。在這種寫法中,命名空間是當前請求所在的藍本。這意味著同一藍本中的重定向可以使用簡寫形式,但跨藍本的重定向必須使用帶有命名空間的端點名。
@main.route('/', methods=['
get', '
post'])
def index():
form =postform()
ifcurrent_user.can(permission.write) and form.validate_on_submit():
post = post(body=form.body.data,
author=current_user._get_current_object())
db.session.add(post)
db.session.commit()
return redirect(url_for('
.index
'))
Flask從入門到精通之flask擴充套件
flask被設計成可擴充套件形式,因此並沒有提供一些重要的功能,比如資料庫和使用者認證,所以開發者可以自由選擇最適合程式的包,或者按需求自行開發。社群成員開發了大量不同用途的擴充套件,如果這還不能滿足需求,你還可使用所有python 標準包或 庫。為了讓你知道如何把擴充套件整合到程式中,接下來我們將...
Flask從入門到精通之flask安裝
安裝flask最簡單的方式是使用虛擬環境,虛擬環境是python直譯器的乙個私有副本,在這個環境中你可以安裝私有包,而且不會影響系統中安裝的全域性的python直譯器。虛擬環境非常有用,可以在系統的python 直譯器中避免包的混亂和版本的衝突。為每個程式單獨建立虛擬環境可以保證程式只能訪問虛擬環境...
Flask從入門到精通之flask程式入門
所有flask程式都必須建立乙個程式例項,web伺服器使用一種名為web伺服器閘道器介面的的協議 wsgi 把接收自客戶端的所有請求 給這個物件處理。程式例項是flask類的物件,使用下面 構建 from flask import flaskflask類的建構函式只有乙個必須指定的引數,即程式主模組...