- Web2py 教程
- Web2py - 首頁
- Web2py - 簡介
- Web2py - Python 語言
- Web2py - 框架概述
- Web2py - 核心
- Web2py - 檢視
- Web2py - 資料庫抽象層
- Web2py - 表單 & 驗證器
- Web2py - 郵件 & 簡訊
- Web2py - 訪問控制
- Web2py - 服務
- Web2py - 新增 Ajax 效果
- Web2py - 元件
- Web2py - 部署
- Web2py - 安全性
- Web2py 有用資源
- Web2py - 快速指南
- Web2py - 有用資源
- Web2py - 討論
Web2py - 核心
命令列選項
在上一章中,我們學習瞭如何使用 GUI 小部件啟動 web2py 伺服器。
可以透過從命令列提示符啟動伺服器來跳過此小部件。
python web2py.py -a '你的密碼' -i 127.0.0.1 -p 8000
每當 web2py 伺服器啟動時,它都會建立一個名為“parameters_8000.py”的檔案,其中所有密碼都以雜湊形式儲存。
出於額外的安全目的,可以使用以下命令列:
python web2py.py -a '<recycle>' -i 127.0.0.1 -p 8000
對於上述場景,web2py 重用儲存在“parameters_8000.py”中的雜湊密碼。
如果由於意外或其他原因刪除了“parameters_8000.py”檔案,則 web2py 中的基於 Web 的管理介面將被停用。
URL 對映/分發
web2py 的功能基於模型-檢視-控制器,它將 URL 對映到特定形式:http://127.0.0.1:8000/a/d/f.html
它路由到名為“a”的應用程式中控制器d.py中提到的函式“f()”。如果應用程式中不存在該控制器,則 web2py 使用名為“default.py”的預設控制器。
如果 URL 中指定的函式不存在,則使用名為init()的預設函式。URL 的工作原理如下圖所示。
URL 的副檔名.html是可選的。副檔名決定了呈現控制器中定義的函式輸出的檢視的副檔名。相同的內容以多種格式提供,例如 html、xml、json、rss 等。
請求根據函式傳遞,這些函式接受引數並向用戶提供相應的輸出。控制器與應用程式的模型和檢視互動,以根據使用者的需求提供輸出。
web2py – 工作流程
下面討論 web2py 的工作流程:
Web 伺服器在其自己的執行緒中同時管理每個 HTTP 請求。
HTTP 請求頭被解析並傳遞給排程程式。
排程程式管理應用程式請求並將 URL 中的PATH_INFO對映到函式呼叫。每個函式呼叫都在 URL 中表示。
直接管理包含在靜態資料夾中的所有檔案請求,並將大型檔案流式傳輸到客戶端。
對靜態檔案以外任何內容的請求都將對映到一個操作。
如果請求頭包含應用程式的會話cookie,則檢索會話物件;否則,將建立一個會話 ID。
如果操作返回值為字串,則將其返回給客戶端。
如果操作返回一個可迭代物件,則將其用於迴圈並將資料流式傳輸到客戶端。
條件模型
在上一章中,我們看到了控制器的功能。web2py 在其每個應用程式中都使用模型、檢視和控制器。因此,瞭解模型的功能也很必要。
與任何其他 MVC 應用程式不同,web2py 中的模型被視為條件模型。子資料夾中的模型將根據其控制器的使用情況執行。這可以透過以下示例演示:
考慮 URL:http://127.0.0.1:8000/a/d/f.html
在這種情況下,‘a’是應用程式的名稱,‘d’是控制器的名稱,f()是與控制器關聯的函式。將執行的模型列表如下:
applications/a/models/*.py applications/a/models/d/*.py applications/a/models/d/f/*.py
庫
web2py 包含庫,這些庫作為物件公開給所有應用程式。這些物件在名為“gluon”的目錄下的核心檔案中定義。
許多模組(如 DAL 模板)沒有依賴項,可以在 web2py 框架之外實現。它還維護單元測試,這被認為是良好的實踐。
應用程式
web2py 應用程式在下圖中以圖表形式顯示。
在 web2py 中開發的應用程式由以下部分組成:
模型 - 表示資料和資料庫表。
控制器 - 描述應用程式邏輯和工作流程。
檢視 - 幫助呈現資料的顯示。
語言 - 描述如何將應用程式中的字串翻譯成各種支援的語言。
靜態檔案 - 不需要處理(例如影像、CSS 樣式表等)。
關於和自述檔案 - 專案的詳細資訊。
錯誤 - 儲存應用程式生成的錯誤報告。
會話 - 儲存與每個特定使用者相關的資訊。
資料庫 - 儲存 SQLite 資料庫和附加的表資訊。
快取 - 儲存快取的應用程式專案。
模組 - 模組是其他可選的 Python 模組。
私有 - 包含的檔案可被控制器訪問,但不能被開發人員直接訪問。
上傳 - 檔案可被模型訪問,但不能被開發人員直接訪問。
API
在 web2py 中,模型、控制器和檢視在匯入某些物件的開發人員環境中執行。
全域性物件 - request、response、session、cache。
輔助函式 - web2py 包含輔助函式類,可用於以程式設計方式構建 HTML。它對應於 HTML 標籤,稱為“HTML 輔助函式”。
例如,A、B、FIELDSET、FORM 等。
會話
會話可以定義為伺服器端資訊的儲存,在使用者與 Web 應用程式互動的整個過程中持續存在。
web2py 中的會話是儲存類的例項。
例如,可以在會話中儲存變數,如下所示:
session.myvariable = "hello"
此值可以檢索為:
a = session.myvariable
只要由同一使用者在同一會話中執行程式碼,就可以檢索變數的值。
web2py 中用於會話的重要方法之一是“forget”:
session.forget(response);
它指示 web2py 不要儲存會話。
在後臺執行任務
HTTP 請求到達 Web 伺服器,該伺服器在其自己的執行緒中並行處理每個請求。活動的任務在前景中進行,而其他任務則保留在後臺。管理後臺任務也是 web2py 的主要功能之一。
最好將耗時的任務保留在後臺。管理後臺任務的一些機制如下所示:
CRON
佇列
排程程式
CRON
在 web2py 中,CRON 提供了在指定的時間間隔內執行任務的能力。每個應用程式都包含一個 CRON 檔案,該檔案定義其功能。
排程程式
內建排程程式透過設定優先順序幫助在後臺執行任務。它提供了一種建立、排程和修改任務的機制。
預定的事件列在名為“scheduler.py”的檔案中的模型中。
構建應用程式
我們概述了在 web2py 中建立模型和控制器的方法。在這裡,我們將重點介紹建立名為“聯絡人”的應用程式。該應用程式需要維護公司列表和在這些公司工作的員工列表。
建立模型
在這裡,資料字典的表的標識是模型。“聯絡人”應用程式的模型將建立在“models”資料夾下。該檔案儲存在models/db_contacts.py中。
# in file: models/db_custom.py
db.define_table('company', Field('name', notnull = True, unique = True), format = '%(name)s')
db.define_table(
'contact',
Field('name', notnull = True),
Field('company', 'reference company'),
Field('picture', 'upload'),
Field('email', requires = IS_EMAIL()),
Field('phone_number', requires = IS_MATCH('[\d\-\(\) ]+')),
Field('address'),
format = '%(name)s'
)
db.define_table(
'log',
Field('body', 'text', notnull = True),
Field('posted_on', 'datetime'),
Field('contact', 'reference contact')
)
建立上述檔案後,可以使用 URLhttp://127.0.0.1:8000/contacts/appadmin訪問這些表。
建立控制器
控制器將包含一些用於列出、編輯和刪除聯絡人的函式。
# in file: controllers/default.py
def index():return locals()
def companies():companies = db(db.company).select(orderby = db.company.name)
return locals()
def contacts():company = db.company(request.args(0)) or redirect(URL('companies'))
contacts = db(db.contact.company == company.id).select(orderby = db.contact.name)
return locals()
@auth.requires_login()
def company_create():form = crud.create(db.company, next = 'companies')
return locals()
@auth.requires_login()
def company_edit():company = db.company(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.company, company, next='companies')
return locals()
@auth.requires_login()
def contact_create():db.contact.company.default = request.args(0)
form = crud.create(db.contact, next = 'companies')
return locals()
@auth.requires_login()
def contact_edit():contact = db.contact(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.contact, contact, next = 'companies')
return locals()
def user():return dict(form = auth())
將在下一章討論檢視及其輸出的建立。