Flask從入門到精通之大型程式的結構二

2022-03-28 03:23:56 字數 2587 閱讀 5248

在單個檔案中開發程式很方便,但卻有個很大的缺點,因為程式在全域性作用域中建立,所以無法動態修改配置。執行指令碼時,程式例項已經建立,再修改配置為時已晚。這一點對單元測試尤其重要,因為有時為了提高測試覆蓋度,必須在不同的配置環境中執行程式。

from

flask 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')

from

flask 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類的建構函式只有乙個必須指定的引數,即程式主模組...