Flask框架(之六)藍圖和子域名

メΨLEI.o 0發表於2020-10-24

Flask框架藍圖和子域名

一、基於排程方法的檢視

  • Flask還為我們提供了另外一種類檢視flask.views.MethodView,對每個HTTP方法執行不同的函式(對映到對應方法的小寫的同名方法上)。
class xxxx(views.MethodView): 
	def get(self): 
		pass
 	def post(self):
 	 	pass

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

  • 用類檢視的一個缺陷就是比較難用裝飾器來裝飾
from flask import session
def login_required(func):
    def wrapper(*args,**kwargs):
        if not session.get("user_id"):
            return 'auth failure'
        return func(*args,**kwargs)
    return wrapper

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

  • 裝飾器寫完後,可以在類檢視中定義一個屬性叫做decorators,然後儲存裝飾器。以後每次呼叫這個類檢視的時候,就會執行這個裝飾器
class UserView(views.MethodView):
    decorators = [user_required]

二、藍圖

2.1藍圖

  • 之前我們寫的url和檢視函式都是處在同一個檔案,如果專案比較大的話,這顯然不是一個合理的結構,而藍圖可以優雅的幫我們實現這種需求,通過app.register_blueprint()方法將這個藍圖註冊進url對映中,以後訪問/user/,/user/profile/,都是執行的user.py檔案中的檢視函式,這樣就實現了專案的模組化。
from flask import Blueprint
bp = Blueprint('user',__name__,url_prefix='/user/')
@bp.route('/')
def index():
    return "使用者首頁"
@bp.route('profile/')
def profile():
    return "個人簡介"
 

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

2.2尋找靜態檔案

  • 預設不設定任何靜態檔案路徑,Jinja2會在專案的static資料夾中尋找靜態檔案。也可以設定其他的路徑,在初始化藍圖的時候,Blueprint這個建構函式,有一個引數static_folder可以指定靜態檔案的路徑,static_folder可以是相對路徑(相對藍圖檔案所在的目錄),也可以是絕對路徑。在配置完藍圖後,還有一個需要注意的地方是如何在模板中引用靜態檔案。在模板中引用藍圖,應該要使用藍圖名+.+static來引用。
bp = Blueprint('admin',__name__,url_prefix='/admin',static_folder='static')
<link href="{{ url_for('admin.static',filename='about.css') }}">

2.3尋找模板檔案

  • 跟靜態檔案一樣,預設不設定任何模板檔案的路徑,將會在專案的templates中尋找模板檔案。也可以設定其他的路徑,在建構函式Blueprint中有一個template_folder引數可以設定模板的路徑
bp = Blueprint('admin',__name__,url_prefix='/admin',template_folder='templates')
  • 模板檔案和靜態檔案有點區別,以上程式碼寫完以後,如果你渲染一個模板return render_template(‘admin.html’),Flask預設會去專案根目錄下的templates資料夾中查詢admin.html檔案,如果找到了就直接返回,如果沒有找到,才會去藍圖檔案所在的目錄下的templates資料夾中尋找。
    在這裡插入圖片描述
    在這裡插入圖片描述

2.4url_for生成url

  • 用url_for生成藍圖的url,使用的格式是:藍圖名稱+.+檢視函式名稱
url_for('admin.index')
bp = Blueprint('admin',__name__,url_prefix='/admin',template_folder='templates')

在這裡插入圖片描述

在這裡插入圖片描述

三、子域名

  • 子域名在許多網站中都用到了,比如一個網站叫做xxx.com,那麼我們可以定義一個子域名cms.xxx.com來作為cms管理系統的網址,子域名的實現一般也是通過藍圖來實現,在之前章節中,我們建立藍圖的時候新增了一個url_prefix=/user作為url字首,那樣我們就可以通過/user/來訪問user下的url。但使用子域名則不需要。另外,還需要配置SERVER_NAME。
from flask import Flask
import admin
# 配置`SERVER_NAME`
app.config['SERVER_NAME'] = 'example.com:8000'
# 註冊藍圖,指定了subdomain
app.register_blueprint(admin.bp)
if __name__ == '__main__':
    app.run(host='0.0.0.0',port=8000,debug=True)
  • 子域名不能在127.0.0.1上出現,也不能在localhost上出現。

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

相關文章