### 導航
- [索引](# "總目錄")
- [下一頁](# "在 Flask 中使用 MongoKit") |
- [上一頁](# "自定義錯誤頁面") |
- [Flask 0.10.1 文檔](#) ?
- [Flask 代碼模式](#) ?
# 延遲加載視圖
Flask 通常配合裝飾器使用,裝飾器使用非常簡單,而且使您可以將 URL 和處理它的函數放在一起。然而這種方法也有一種不足: 這就意味著您使用裝飾器的代碼必須在前面導入,否則 Flask 將無法找到您的函數。
這對于需要很快導入的應用程序來說是一個問題,這種情況可能出現在類似谷歌的App Engine 這樣的系統上。所以如果您突然發現您的引用超出了這種方法可以處理的能力,您可以降級到中央 URL 映射的方法。
用于激活中央 URL 映射的函數是 [add_url_rule()](# "flask.Flask.add_url_rule") 方法。您需要提供一個設置應用程序所有 URL 的文件,而不是使用裝飾器。
### 轉換到中央 URL 映射
假象現在的應用的樣子如下所示:
~~~
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
pass
@app.route('/user/<username>')
def user(username):
pass
~~~
而中央 URL 映射的方法下,您需要一個不包含任何裝飾器的文件(views.py),如下所示:
~~~
def index():
pass
def user(username):
pass
~~~
然后使用一個文件初始化應用并將函數映射到 URLs:
~~~
from flask import Flask
from yourapplication import views
app = Flask(__name__)
app.add_url_rule('/', view_func=views.index)
app.add_url_rule('/user/<username>', view_func=views.user)
~~~
### 延遲加載
目前我們僅僅將視圖和路徑配置分開了,但是模塊仍然是在前面導入的。下面的技巧使得視圖函數可以按需加載。可以使用一個輔助類來實現,這個輔助類以函數的方式作用,但是當第一次使用某個函數時,它才在內部導入這個函數:
~~~
from werkzeug import import_string, cached_property
class LazyView(object):
def __init__(self, import_name):
self.__module__, self.__name__ = import_name.rsplit('.', 1)
self.import_name = import_name
@cached_property
def view(self):
return import_string(self.import_name)
def __call__(self, *args, **kwargs):
return self.view(*args, **kwargs)
~~~
在使用這種方法時,將 __module__ 和 __name__ 變量設定為合適的值是很重要的。在你沒有手動指定一個 URL 規則時,這兩個變量被 Flask 用于在內部確定如何命名URL 規則。
現在您就可以定義您將視圖整合到的位置,如下所示:
~~~
from flask import Flask
from yourapplication.helpers import LazyView
app = Flask(__name__)
app.add_url_rule('/',
view_func=LazyView('yourapplication.views.index'))
app.add_url_rule('/user/<username>',
view_func=LazyView('yourapplication.views.user'))
~~~
您可以進一步改進它,以便于節省鍵盤敲擊次數。通過編寫一個在內部調用[add_url_rule()](# "flask.Flask.add_url_rule") 方法的函數,自動將一個包含項目名稱以及點符號的字符串添加為前綴,并按需將 view_func 封裝進 LazyView
~~~
def url(url_rule, import_name, **options):
view = LazyView('yourapplication.' + import_name)
app.add_url_rule(url_rule, view_func=view, **options)
url('/', 'views.index')
url('/user/<username>', 'views.user')
~~~
需要記住的是,請求前后激發的回調處理器必須在一個文件里,并在前面導入,使之在第一個請求到來之間能夠合適地工作。對于其他所有的裝飾器來說也是一樣的。
? 版權所有 2013, Armin Ronacher.
- 歡迎使用 Flask
- 前言
- 給有經驗程序員的前言
- 安裝
- 快速入門
- 教程
- 介紹 Flaskr
- 步驟 0: 創建文件夾
- 步驟 1: 數據庫模式
- 步驟 2: 應用設置代碼
- 步驟 3: 創建數據庫
- 步驟 4: 請求數據庫連接
- 步驟 5: 視圖函數
- 步驟 6: 模板
- 步驟 7: 添加樣式
- 福利: 應用測試
- 模板
- 測試 Flask 應用
- 記錄應用錯誤
- 配置處理
- 信號
- 即插視圖
- 應用上下文
- 請求上下文
- 用藍圖實現模塊化的應用
- Flask 擴展
- 與 Shell 共舞
- Flask 代碼模式
- 大型應用
- 應用程序的工廠函數
- 應用調度
- 使用 URL 處理器
- 部署和分發
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上傳文件
- 緩存
- 視圖裝飾器
- 使用 WTForms 進行表單驗證
- 模板繼承
- 消息閃現
- 用 jQuery 實現 Ajax
- 自定義錯誤頁面
- 延遲加載視圖
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 數據流
- 延遲請求回調
- 添加 HTTP Method Overrides
- 請求內容校驗碼
- 基于 Celery 的后臺任務
- 部署選擇
- mod_wsgi (Apache)
- 獨立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的設計決策
- HTML/XHTML 常見問題
- 安全注意事項
- Flask 中的 Unicode
- Flask 擴展開發
- Pocoo 風格指引
- Python 3 支持
- 升級到最新版本
- Flask Changelog
- 許可證
- 術語表