概述
最美代碼
web2py官方文檔翻譯
2016年2月10日

啟動
web2py進來二進制包為Windows和Mac OS x包括Python解釋器,所以你不需要預裝。 還有一個源代碼版本運行在Windows,Mac,Linux和其他Unix系統。 Windows和mac OS X的二進制版本包括必要的Python解釋器。 Python源代碼包假設已經安裝在電腦上。
web2py不需要安裝。 首先,解壓縮下載的zip文件的特定的操作系統和相應的執行 web2py 文件。
在Windows上,運行:
web2py.exe
在OS X上,運行:
open web2py.app
Unix和Linux上運行從源通過鍵入:
python2.5 web2py.py
在Windows上運行web2py首先從源代碼安裝 馬克·哈蒙德的“Windows擴展Python 然后運行:
python2.5 web2py.py
web2py程序接受各種命令行選項稍后討論。
默認情況下,在啟動時,web2py顯示啟動窗口,然后顯示一個GUI窗口小部件,要求你選擇一個一次性的管理員密碼,網絡接口的IP地址用於web服務器,和一個服務請求的端口號。 默認情況下,web2py 127.0.0.1:8000上運行的web服務器(本地主機端口8000上),但是您可以運行在任何可用的IP地址和端口。 您可以查詢您的網絡接口的IP地址,打開一個命令行和打字 ipconfig 在Windows或 ifconfig 在OS X和Linux。 從現在開始我們假設web2py在本地主機上運行(127.0.0.1:8000)。 使用0.0.0.0:80運行web2py公開你的網絡接口。
如果你不提供管理員密碼,管理界面是禁用的。 這是一個安全措施,以防止公開揭露管理界面。
管理界面, 管理 ,只能從本地主機訪問,除非你使用mod_proxy運行背后web2py Apache。 如果 管理 檢測到一個代理,會話cookie設置為安全 管理 登錄不工作,除非客戶端和代理之間的通信在HTTPS;這是一個安全措施。 所有客戶端之間的通信 管理 必須是本地或加密;否則攻擊者能夠執行一個人中間人攻擊和重放攻擊和在服務器上執行任意代碼。
管理密碼已經設置后,web2py啟動web瀏覽器在頁面:
http://127.0.0.1:8000/
如果計算機沒有一個默認的瀏覽器,打開一個web瀏覽器並輸入URL。
點擊“管理界面”帶你去管理界面登錄頁面。
管理員密碼是您選擇在啟動時的密碼。 請注意,只有一個管理員,因此只有一個管理員密碼。 出於安全原因,開發人員被要求選擇一個新密碼每次web2py開始,除非指定的<回收>選項。 這是有別於web2py應用程序的身份驗證機制。
管理員登錄web2py之后,瀏覽器重定向到“網站”頁面。
這個頁面列出了所有web2py安裝應用程序和允許管理員管理。 web2py有三個應用程序:
• 一個 管理 應用程序,現在您正在使用。
• 一個 例子 與在線交互式應用程序,文檔和web2py官方網站的副本。
• 一個 歡迎 應用程序。 這是基本的任何其他web2py應用程序的模板。 它被稱為腳手架應用程序。 這也是歡迎用戶在啟動的應用程序。
被稱為web2py即食web2py應用程序 電器 。 你可以下載許多免費的電器 ( 電器 ] 。 web2py鼓勵用戶提交新的家電,無論是開源還是閉源(編譯和打包)形式。
從 管理 應用程序的 網站 頁面中,您可以執行以下操作:
• 安裝 應用程序通過完成表單頁面的右下角。 向應用程序提供一個名稱,選擇文件包含一個打包的應用程序或應用程序所在的URL,並單擊“提交”。
• 卸載 應用程序通過單擊相應的按鈕。 有一個確認頁面。
• 創建 一個新的應用程序,選擇一個名稱並單擊“創建”。
• 包 申請分布通過單擊相應的按鈕。 一個包含所有的下載應用程序是一個tar文件,包括數據庫。 你不應該將此文件解壓,安裝時由web2py自動散裝的 管理 。
• 清理 應用程序的臨時文件,如會議、錯誤和緩存文件。
• 編輯 一個應用程序。
當您創建一個新的應用程序使用 管理 ,它開始作為一個克隆的“歡迎”腳手架應用“模型/ db。 py”創建了一個SQLite數據庫,連接到它,實例化Auth,Crud和服務、配置它們。 它還提供了一個“控制器/違約。 py”公開行動”指數”、“下載”、“用戶”為用戶管理、和“調用”服務。 在下面,我們假設這些文件已經被刪除,我們將從頭開始創建應用程序。
web2py還附帶了一個 向導 描述在本章后面,可以編寫另一個腳手架代碼基於布局和web上可用的插件和基於高水平的描述模型。
說“你好”
在這里,作為一個例子,我們創建一個簡單的web應用程序,它顯示消息“你好MyApp”給用戶。 我們將調用這個應用程序“myapp”。 我們還將添加一個計數器計數多少次相同的用戶訪問頁面。
您可以創建一個新的應用程序,只需輸入它的名字的右上方 網站 頁 管理 。
你按下【創建】后,應用程序創建內置歡迎應用程序的副本。
運行新的應用程序,請訪問:
http://127.0.0.1:8000/myapp
現在你有一個受歡迎的應用程序的副本。
編輯應用程序,點擊 設計 為新創建的應用程序按鈕。
的 編輯 頁面告訴你什么是內部應用程序。 每個web2py應用程序包含某些文件,其中大部分落入isx類別之一:
• 模型 :描述數據表示。
• 控制器 :描述應用程序邏輯和工作流。
• 的觀點 :描述數據表示。
• 語言 :描述如何翻譯應用程序演示其他語言。
• 模塊 :Python模塊屬於應用程序。
• 靜態文件 :靜態圖像、CSS文件 ( css-w、css-o css-school ] JavaScript文件 ( js-w,js-b ] 等。
• 插件 :組文件旨在一起工作。
所有東西都是整齊有序的模型-視圖-控制器設計模式。 每個部分的 編輯 頁面對應於應用程序文件夾的子文件夾。
注意小節標題將切換他們的內容。 文件夾名稱下的靜態文件也可折疊。
節中列出的每個文件對應一個文件物理位置的子文件夾。 任何操作上執行一個文件通過 管理 接口(創建、編輯、刪除)可以直接從shell執行使用您喜歡的編輯器。
應用程序包含其他類型的文件(數據庫、會議文件、錯誤文件,等等),但他們不上市 編輯 頁,因為他們不是管理員創建或修改的;他們創建和修改應用程序本身。
控制器包含應用程序的邏輯和工作流。 每個URL被映射到調用一個函數控制器(行動)。 有兩個默認控制器:“appadmin。 py”和“default.py”。 appadmin 提供數據庫管理界面,我們現在不需要它。 “默認。 py”是您需要編輯控制器,一個叫做默認情況下當沒有控制器在URL中指定。 編輯“指數”功能如下:
def index():
return "Hello from MyApp"
這是在線編輯器是什么樣子:
保存它並回到 編輯 頁面。 單擊索引訪問新創建的頁面的鏈接。
當你訪問的URL
http://127.0.0.1:8000/myapp/default/index
索引操作在默認myapp應用程序的控制器。 它返回一個字符串,我們的瀏覽器顯示。 它應該是這樣的:
現在,編輯“指數”功能如下:
def index():
return dict(message="Hello from MyApp")
也從 編輯 “默認/索引頁面,編輯視圖。 html”(與行動相關聯的視圖文件)和完全替換現有的文件內容如下:
{{=message}}
現在定義一個操作返回一個字典 消息 。 當一個動作返回一個字典,web2py查找視圖的名稱 [控制]/[功能]。(擴展) 並執行它。 (擴展)是所請求的擴展。 如果沒有指定擴展,它默認為“html”,這就是我們將假定。 在這種假設下,視圖是一個HTML文件,它嵌入Python代碼使用特殊的{ { } }標記。 特別是,在這個例子中, { { =消息} } 指示web2py標記代碼替換的值 消息 返回的行動。 請注意, 消息 這里不是web2py字但中定義的行動。 到目前為止,我們沒有使用任何web2py關鍵詞。 如果web2py沒有找到所請求的視圖,它使用“通用。 html”視圖,每個應用程序。 如果指定“html”以外的一個擴展(例如“json”)和視圖文件”[控制]/[功能]。 json”不是發現,web2py查找視圖”generic.json”。 web2py通用。 html,通用。 json,通用的。 xml和generic.rss。 這些通用視圖可以修改單獨為每個應用程序,可以輕松地添加和額外的視圖。 通用視圖是一個開發工具。 在生產中每一個行動都應該有自己的觀點。 實際上,默認情況下,通用視圖只能從本地主機啟用。 您還可以指定一個視圖 響應。 視圖= '默認/ something.html ' 在第十章閱讀更多關於這個主題。 如果你回到“編輯”,點擊指數,現在,您將看到以下HTML頁面:用於調試目的你可以隨時添加
{{=response.toolbar()}}
代碼在一個視圖,它將向您展示一些有用的信息,包括請求、響應和會話對象,與他們的時間列出所有數據庫查詢。
讓我們數
現在讓我們將一個計數器添加到這個頁面,將數多少次相同的訪問者顯示頁面。
web2py自動、透明地追蹤訪客使用會話和餅干。 為每個新訪客,它會創建一個會話,並分配一個獨一無二的“session_id”。 會話變量,存儲服務器端是一個容器。 惟一的id發送給瀏覽器通過一個餅干。 當訪問者請求另一個頁面相同的應用程序中,瀏覽器發送cookie,它由web2py檢索,和相應的會話恢復。
使用會話,修改默認的控制器:
def index():
if not session.counter:
session.counter = 1
else:
session.counter += 1
return dict(message="Hello from MyApp", counter=session.counter)
請注意, 計數器 不是web2py字但 會話 是多少。 我們要求web2py檢查是否有一個計數器變量在會話中,如果沒有的話,創建一個設置為1。 如果計數器是那里,我們問web2py增加計數器加1。 最后我們將計數器的值傳遞給視圖。
更緊湊的代碼相同的功能的方法是這樣的:
def index():
session.counter = (session.counter or 0) + 1
return dict(message="Hello from MyApp", counter=session.counter)
現在修改視圖添加一行顯示計數器的值:
{{=message}}
Number of visits: {{=counter}}
當你再次訪問索引頁面(再一次)你應該得到以下HTML頁面:櫃台與每個訪問者相關聯,並增加訪問者每次重新加載頁面。 不同的游客看到不同的計數器。
說我的名字
現在創建兩頁(第一和第二),在第一頁創建一個表單,問客人的名字,和重定向到第二頁,迎接客人的名字。
寫相應的操作在默認的控制器:
def first():
return dict()
def second():
return dict()
然后創建一個視圖“默認/第一。 html“第一行動,並輸入:
{{extend 'layout.html'}}
What is your name?
Hello {{=request.vars.visitor_name}}
在這兩種觀點都有擴展的基本布局。 伴隨着web2py的html”視圖。 布局視圖使兩頁一致的外觀和感覺。 布局文件可以很容易地編輯和取代,因為它主要包含HTML代碼。 如果你現在訪問的第一個頁面,輸入你的名字:並提交表單,您將收到一個祝福:
回發
表單提交之前,我們使用的機制是很常見的,但它不是良好的編程實踐。 應驗證所有輸入,在上面的例子中,驗證的負擔將落在第二個行動。 因此,行動執行驗證不同於生成表單的動作。 這往往導致代碼冗余。
表單提交的一個更好的模式是生成它們的提交形式相同的動作,在我們的示例中“第一”。 “第一”的行動應該接收的變量,處理它們,將它們存儲的服務器端,並將用戶重定向到“第二”頁面,它檢索變量。 這種機制被稱為 回發 。
修改默認的控制器來實現self-submission:
def first():
if request.vars.visitor_name:
session.visitor_name = request.vars.visitor_name
redirect(URL('second'))
return dict()
def second():
return dict()
然后修改“默認/第一。 html”觀點:
{{extend 'layout.html'}}
What is your name?
Hello {{=session.visitor_name or "anonymous"}}
從游客的角度,self-submission行為前實現一模一樣。 我們沒有添加驗證,但現在清楚的是,驗證應該首先執行的行動。 這種方法也更好,因為客人的名稱保持在會話中,並且可以訪問所有操作和視圖的應用程序,而不必被顯式傳遞。 注意,如果“第二”行動是以前稱為訪客的名字,它會顯示“你好匿名”,因為 session.visitor_name 返回 沒有一個 。 或者我們可以添加下面的代碼在控制器(內 第二個 函數): if not request.function=='first' and not session.visitor_name: redirect(URL('first')) 這是一個通用的機制,您可以使用控制器執行授權,但見第9章為一個更強大的方法。web2py我們可以移動一步,問web2py生成表單,包括驗證。 web2py提供幫手(形式輸入,文本區域,並選擇/選項)以相同的名稱為等價的HTML標記。 他們可以用來建造形式在控制器或視圖。
例如,這是一個可能的方式改寫第一個行動:
def first():
form = FORM(INPUT(_name='visitor_name', requires=IS_NOT_EMPTY()),
INPUT(_type='submit'))
if form.process().accepted:
session.visitor_name = form.vars.visitor_name
redirect(URL('second'))
return dict(form=form)
我們說的形式標記包含兩個輸入標簽。 輸入標簽的屬性指定的命名參數開始凸顯。 的 需要 參數不是一個標簽屬性(因為它不首先強調)但這集的驗證器visitor_name的價值。
這是另一個更好的窟創建相同的形式:
def first():
form = SQLFORM.factory(Field('visitor_name', requires=IS_NOT_EMPTY()))
if form.process().accepted:
session.visitor_name = form.vars.visitor_name
redirect(URL('second'))
return dict(form=form)
的 形式 對象可以很容易地序列化在HTML中嵌入在“默認/。 html”視圖。
{{extend 'layout.html'}}
What is your name?
{{=form}}
的 form.process() 方法應用驗證器並返回形式本身。 的 form.accepted 變量設置為True如果表單處理並通過驗證。 如果self-submitted形式通過驗證,它將變量存儲在會話和重定向。 如果表單沒有通過驗證,錯誤消息插入到表單並顯示給用戶,如下:
在下一節中我們將展示形式可以從模型自動生成。
一個圖像的博客
這里,作為另一個例子,我們希望創建一個web應用程序,允許管理員發布圖片和給他們一個名字,並允許web站點的訪問者查看指定的圖像並提交評論。
和之前一樣,從 網站 頁 管理 ,創建一個新的應用程序 圖片 ,並導航到 編輯 頁面:
我們首先創建一個模型,持久數據在應用程序的表示(上傳的圖片,他們的名字和注釋)。 首先,您需要創建/編輯的模型文件,缺乏想象力,我們稱之為“db.py”。 我們假設以下代碼將取代任何現有代碼“db.py”。 模型和控制器必須有一個 . py 因為它們是Python代碼擴展。 如果不提供擴展,它由web2py附加。 相反,有一個觀點 . html 因為他們主要包含HTML代碼擴展。
編輯db。 py”文件,點擊相應的“編輯”按鈕:
輸入以下:
db = DAL("sqlite://storage.sqlite")
db.define_table('image',
Field('title', unique=True),
Field('file', 'upload'),
format = '%(title)s')
db.define_table('comment',
Field('image_id', db.image),
Field('author'),
Field('email'),
Field('body', 'text'))
db.image.title.requires = IS_NOT_IN_DB(db, db.image.title)
db.comment.image_id.requires = IS_IN_DB(db, db.image.id, '%(title)s')
db.comment.author.requires = IS_NOT_EMPTY()
db.comment.email.requires = IS_EMAIL()
db.comment.body.requires = IS_NOT_EMPTY()
db.comment.image_id.writable = db.comment.image_id.readable = False
讓我們逐行分析。
第一行定義了一個全局變量 db 表示數據庫連接。 在這種情況下,它是一個連接到一個SQLite數據庫中存儲的文件“應用程序/圖片/數據庫/ storage.sqlite”。 在SQLite的情況下,如果數據庫不存在,就創建一個。 你可以改變文件的名稱,以及全局變量的名稱 db ,但它是方便給他們相同的名稱,使它容易記住。
3 - 5行定義一個表“形象”。 define_table 的方法嗎 db 對象。 “形象”,第一個參數是我們定義的表的名稱。 其他參數是屬於該表的字段。 這個表有一個字段稱為“標題”,一個字段稱為“文件”,“id”字段作為表主鍵(“id”不是顯式聲明,因為所有表都有一個id字段默認情況下)。 “標題”是一個字符串,和類型的字段“文件”“上傳”。 “上傳”是一種特殊類型的字段web2py所使用的數據抽象層(DAL)來存儲上傳的文件的名稱。 web2py知道如何上傳文件(通過流媒體如果他們大),重命名它們安全,存儲它們。
當一個表定義,web2py幾個可能的行動之一:
• 如果表不存在,創建表;
• 如果表存在,不對應的定義、表相應改變,如果一個領域有不同的類型,web2py試圖將其內容;
• 如果表存在,對應於定義,web2py什么也不做。
這種行為被稱為“遷移”。 在web2py遷移是自動的,但可以為每個表通過被禁用 遷移= False 作為最后一個參數 define_table 。
第6行定義了一個格式字符串表。 它決定了如何記錄應表示為一個字符串。 請注意, 格式 參數也可以是一個函數,它接受一個記錄,並返回一個字符串。 例如:
format=lambda row: row.title
8 - 12行定義另一個表稱為“評論”。 評論“作者”,“電子郵件”(我們打算存儲評論作者的電子郵件地址),一個“文本”類型的“身體”(我們打算用它來存儲實際的作者評論),和一個“image_id”字段類型的引用指向 db.image 通過“id”字段。
在第14行, db.image.title 代表該領域的“標題”表“形象”。 屬性 需要 允許你設置需求/約束,將執行web2py形式。 在這里我們要求“標題”是獨一無二的:
db.image.title IS_NOT_IN_DB(db)
請注意這是可選的,因為它考慮到自動設置 字段(“標題”,獨特的= True) 。
代表這些約束的對象被稱為驗證器。 多個驗證器可以分組列表中。 驗證器執行的順序出現。 IS_NOT_IN_DB(a,b) 是一種特殊的驗證器,檢查一個字段的值 b 不是已經在新記錄 一個 。
第15行要求字段“image_id”表“評論” db.image.id 。 作為數據庫而言,我們已經宣布這個當我們定義表“評論”。 現在我們明確告訴模型,這種情況應該由web2py強制執行,也在表單處理級別在發布新的評論,所以無效值從輸入表單不傳播到數據庫。 我們也要求“image_id”所代表的“標題”, “%(標題)” ,相應的記錄。
第20行表明,表的字段“image_id”“評論”不應該顯示在形式, 可寫= False 甚至不是以只讀的形式, 可讀= False 。
驗證器的意義在15 - 17行應該是顯而易見的。
注意,驗證器
db.comment.image_id.requires = IS_IN_DB(db, db.image.id, '%(title)s')
可以省略(自動)如果我們指定為引用表的格式:
db.define_table('image', ..., format='%(title)s')
的格式可以是一個字符串或一個函數,它接受一個記錄,並返回一個字符串。
一旦定義了一個模型,如果沒有錯誤,web2py創建一個應用程序管理界面來管理數據庫。 你訪問它通過“數據庫管理”鏈接 編輯 頁面或直接:
http://127.0.0.1:8000/images/appadmin
這是一個截圖 appadmin 接口:
這個接口是控制器稱為“appadmin編碼。 py appadmin.html“和相應的視圖。 從現在開始,我們將參考這個接口簡單 appadmin 。 它允許管理員插入新的數據庫記錄,編輯和刪除現有記錄,瀏覽表和執行數據庫連接。
第一次 appadmin 執行訪問,模型和創建的表。 web2py木豆將Python代碼轉換為SQL語句特定於所選數據庫后端(在這個例子中SQLite)。 你可以看到的生成的SQL 編輯 頁面點擊“sql。 日志”鏈接在“模型”。 注意,鏈接不存在,直到創建了表。
如果你要編輯模型和訪問 appadmin 再次,web2py改變現有表生成SQL。 生成的SQL登錄“sql.log”。
現在回到 appadmin 並試圖插入一個新的圖像記錄:
web2py翻譯了 db.image.file “上傳”字段為一個文件上傳表單。 當提交表單和一個圖像文件上傳,文件重命名以安全的方式保存擴展,它與應用程序下的新名稱保存“上傳”文件夾,並存儲在新的名稱 db.image.file 字段。 這個過程的目的是防止目錄遍歷的攻擊。
請注意,每個字段類型的呈現 小部件 。 默認widget可以覆蓋。
當你點擊一個表名 appadmin ,web2py執行選擇當前表的所有記錄,發現的木豆查詢
db.image.id > 0
並呈現結果。
你可以選擇一組不同的記錄通過編輯SQL查詢和按[提交]。
編輯或刪除單個記錄,點擊記錄id號碼。
因為 IS_IN_DB 驗證器,參考字段“image_id”呈現一個下拉菜單。 下拉的物品存儲為鍵( db.image.id ),但由他們 db.image.title 指定的驗證器。
驗證器是強大的對象知道如何表示字段,字段值進行過濾,生成錯誤,格式從字段中提取的值。
下圖顯示了當你提交一個表單,沒有通過驗證:
相同的形式自動生成的 appadmin 也可以以編程方式生成通過嗎 SQLFORM 助手在用戶應用程序和嵌入式。 這些形式是CSS-friendly,可以定制。
每個應用程序都有自己的 appadmin ,因此, appadmin 本身可以被修改而不影響其他應用程序。
到目前為止,應用程序知道如何存儲數據,我們看到了如何通過訪問數據庫 appadmin 。 訪問 appadmin 僅限於管理員,它並不打算作為一個生產應用程序的web接口;因此這個演練的下一部分。 特別是我們想創建:
• 一個“索引”頁面,這個頁面列出所有可用的圖像按標題和鏈接頁面的圖像細節。
• “顯示/(id)”頁面顯示訪問者請求的形象和允許訪問者瀏覽和發表評論。
• “下載/[名字]”動作下載上傳圖像。
這是代表示意圖:
回到 編輯 頁面和編輯“默認。 py”控制器,取代其內容如下:
def index():
images = db().select(db.image.ALL, orderby=db.image.title)
return dict(images=images)
該操作返回一個字典。 項的鍵在字典里解釋為變量傳遞給視圖相關的行動。 如果沒有看來,當開發動作呈現“通用。 html”視圖,提供每個web2py應用程序。
所有字段的索引操作執行選擇( db.image.ALL )從表形象,下令 db.image.title 。 選擇的結果是a 行 包含記錄的對象。 將它分配給一個局部變量 圖片 返回的行動到視圖。 圖片 iterable,其元素被選中的行。 為每一行的列可以訪問字典: 圖像0 或相當於 [0].title圖像 。
如果你不寫一個視圖,通過“視圖/通用呈現字典。 html”和調用索引行動看起來像這樣:
你還沒有為這個操作創建一個視圖,因此web2py呈現在普通的表格形式的記錄。
繼續創建一個視圖索引行動。 返回管理,編輯“默認/索引。 html”和它的內容替換為以下幾點:
{{extend 'layout.html'}}
Current Images
-
{{for image in images:}} {{=LI(A(image.title, _href=URL("show", args=image.id)))}} {{pass}}
如果你點擊圖像名稱鏈接,你直接:
http://127.0.0.1:8000/images/default/show/1
這導致一個錯誤,因為你還沒有創建一個動作被稱為“控制器”default.py“秀”。
我們編輯”違約。 py”控制器和其內容替換為:
def index():
images = db().select(db.image.ALL, orderby=db.image.title)
return dict(images=images)
def show():
image = db(db.image.idrequest.args(0)).select().first()
db.comment.image_id.default = image.id
form = SQLFORM(db.comment)
if form.process().accepted:
response.flash = 'your comment is posted'
comments = db(db.comment.image_idimage.id).select()
return dict(image=image, comments=comments, form=form)
def download():
return response.download(request, db)
控制器包含兩個動作:“秀”和“下載”。 “秀”行動選擇的圖像 id 解析從請求參數和所有評論相關的圖片。 “顯示”,然后將一切傳遞給視圖“違約/ show.html”。
映像id引用:
URL('show', args=image.id)
在“默認/索引。 html”,可以訪問:
request.args(0)
從“秀”行動。
“下載”行動預計一個文件名 request.args(0) ,建立一個路徑,文件的位置應該是,並將其發送回客戶機。 如果文件太大,它流文件,而沒有引起任何內存開銷。
請注意以下語句:
• 第7行創建一個插入SQLFORM的形式 db.comment 只使用指定的表字段。
• 第8行集引用字段的值,而不是輸入表單的一部分,因為它不是在列表中指定的字段。
• 第9行流程提交的表單(提交的表單變量 request.vars )在當前會話(會話用於防止雙提交,執行導航)。 如果提交的表單變量進行驗證,新插入的評論 db.comment 表,否則修改表單包含錯誤消息(例如,如果作者的電子郵件地址是無效的)。 這都是在第9行!
• 10號線只是執行如果表單被接受,記錄后插入到數據庫表中。 response.flash 是一個web2py變量顯示在視圖和用於通知游客,發生了一件事。
• 第11行選擇引用當前圖像的所有評論。
“下載”行動已經定義在“默認。 py”腳手架應用程序的控制器。
“下載”行動不返回一個字典,所以它不需要一個視圖。 “秀”行動,應該有一個視圖,所以返回 管理 並創建一個名為“違約/ show.html”的新觀點。
編輯這個新文件和替換其內容如下:
{{extend 'layout.html'}}
Image: {{=image.title}}
Comments
{{for comment in comments:}}
{{=comment.author}} says {{=comment.body}}
{{pass}} {{else:}}No comments posted yet
{{pass}}Post a comment
{{=form}} 這個視圖顯示了 image.file 通過調用一個內部的“下載”行動 < img… / > 標簽。 如果有注釋,它循環遍歷並顯示每一個。 這是一切都會出現游客。當訪問者通過此頁面提交評論,評論存儲在數據庫和附加到頁面的底部。
添加CRUD
web2py還提供了一個CRUD(創建/讀取/更新/刪除)API簡化形式。 使用CRUD需要定義的地方,比如在文件“db.py”:
from gluon.tools import Crud
crud = Crud(db)
這兩條線已經在腳手架應用程序。
的 crud 對象提供了高級的方法,例如:
form = crud.create(table)
可以用來取代編程模式:
form = SQLFORM(table)
if form.process().accepted:
session.flash = '...'
redirect('...')
在這里,我們使用crud重寫前面的“秀”行動,使更多的改進:
def show():
image = db.image(request.args(0)) or redirect(URL('index'))
db.comment.image_id.default = image.id
form = crud.create(db.comment,
message='your comment is posted',
next=URL(args=image.id))
comments = db(db.comment.image_id==image.id).select()
return dict(image=image, comments=comments, form=form)
首先注意我們使用語法
db.image(request.args(0)) or redirect(...)
獲取所需的記錄。 自 “表(id) 沒有找到返回,如果沒有一個記錄,我們可以使用 或重定向(…) 在這種情況下在一行。
的 下一個 的觀點 crud.create 是URL重定向到接受表單之后。 的 消息 參數是要顯示一個驗收。 你可以閱讀更多關於CRUD在第7章。
添加身份驗證
web2py API基於角色的訪問控制是相當復雜的,但現在我們將限制限制訪問顯示行動經過身份驗證的用戶,推遲第9章更詳細的討論。
限制對經過身份驗證的用戶訪問,我們需要完成三個步驟。 在一個模型中,例如“db。 py”,我們需要添加:
from gluon.tools import Auth
auth = Auth(db)
auth.define_tables()
在我們的控制器,我們需要添加一個動作:
def user():
return dict(form=auth())
這足以使登錄、注冊、注銷等頁面。 默認的布局也會顯示選項對應的頁的右上角。
我們現在可以裝飾我們想限制的功能,例如:
@auth.requires_login()
def show():
image = db.image(request.args(0)) or redirect(URL('index'))
db.comment.image_id.default = image.id
form = crud.create(db.comment, next=URL(args=image.id),
message='your comment is posted')
comments = db(db.comment.image_id==image.id).select()
return dict(image=image, comments=comments, form=form)
任何試圖訪問
http://127.0.0.1:8000/images/default/show/[image_id]
需要登錄。 如果用戶沒有登錄,用戶將被重定向到
http://127.0.0.1:8000/images/default/user/login
的 用戶 函數也暴露等,以下行為:
http://127.0.0.1:8000/images/default/user/logout
http://127.0.0.1:8000/images/default/user/register
http://127.0.0.1:8000/images/default/user/profile
http://127.0.0.1:8000/images/default/user/change_password
http://127.0.0.1:8000/images/default/user/request_reset_password
http://127.0.0.1:8000/images/default/user/retrieve_username
http://127.0.0.1:8000/images/default/user/retrieve_password
http://127.0.0.1:8000/images/default/user/verify_email
http://127.0.0.1:8000/images/default/user/impersonate
http://127.0.0.1:8000/images/default/user/not_authorized
現在,第一次用戶需要注冊才能登錄並讀或發表評論。
這兩個 身份驗證 對象和 用戶 已經搭建應用程序中定義的函數。 的 身份驗證 對象是高度可定制的,並且可以處理電子郵件驗證,注冊批准,驗證碼,通過插件和備用登錄方法。
添加網格
我們可以進一步改善這種使用 SQLFORM.grid 和 SQLFORM.smartgrid 產品為我們的應用程序創建一個管理界面:
@auth.requires_membership('manager')
def manage():
grid = SQLFORM.smartgrid(db.image)
return dict(grid=grid)
“視圖/違約/ manage.html”相關
{{extend 'layout.html'}}
Management Interface
{{=grid}} 使用appadmin創建一組“經理”,使一些用戶組的成員。 他們將不能訪問 http://127.0.0.1:8000/images/default/manage 和瀏覽、搜索:創建、更新和刪除照片和評論:
配置布局
您可以配置默認布局通過編輯“視圖/布局。 html”,但您還可以配置它沒有編輯的html。 事實上,“靜態/基地。 css樣式表是記錄和第五章中描述。 你可以改變顏色,列,大小、邊框和背景沒有編輯的HTML。 如果你想編輯菜單,標題或副標題,可以在任何模型文件。 腳手架應用,設置默認值的參數文件中的“模型/ menu.py”:
response.title = request.application
response.subtitle = T('customize me!')
response.meta.author = 'you'
response.meta.description = 'describe your app'
response.meta.keywords = 'bla bla bla'
response.menu = [ [ 'Index', False, URL('index') ] ]
一個維基
在本節中,我們建立一個wiki,從頭開始,沒有使用提供的擴展功能plugin_wiki第12章中描述。 參觀者將能夠創建頁面、搜索(標題),和編輯它們。 游客還可以發表評論(正如在前面的應用程序),並發布文檔(作為附件頁)和鏈接頁面。 作為一個慣例,我們采用Markmin語法維基語法。 我們還將使用Ajax實現一個搜索頁面,頁面的RSS提要,並通過xml - rpc處理程序來搜索頁面 ( xmlrpc ] 。
下圖列出了行動,我們需要實現,我們打算建立它們之間的聯系。
首先創建一個新的腳手架應用,給它命名“mywiki”。
該模型必須包含三個表:頁面,評論,和文檔。 注釋和文檔引用頁面,因為他們屬於頁面。 一個文檔包含一個文件字段類型的上傳與前面的圖片應用程序。
這是完整的模型:
db = DAL('sqlite://storage.sqlite')
from gluon.tools import *
auth = Auth(db)
auth.define_tables()
crud = Crud(db)
db.define_table('page',
Field('title'),
Field('body', 'text'),
Field('created_on', 'datetime', default=request.now),
Field('created_by', db.auth_user, default=auth.user_id),
format='%(title)s')
db.define_table('comment',
Field('page_id', db.page),
Field('body', 'text'),
Field('created_on', 'datetime', default=request.now),
Field('created_by', db.auth_user, default=auth.user_id))
db.define_table('document',
Field('page_id', db.page),
Field('name'),
Field('file', 'upload'),
Field('created_on', 'datetime', default=request.now),
Field('created_by', db.auth_user, default=auth.user_id),
format='%(name)s')
db.page.title.requires = IS_NOT_IN_DB(db, 'page.title')
db.page.body.requires = IS_NOT_EMPTY()
db.page.created_by.readable = db.page.created_by.writable = False
db.page.created_on.readable = db.page.created_on.writable = False
db.comment.body.requires = IS_NOT_EMPTY()
db.comment.page_id.readable = db.comment.page_id.writable = False
db.comment.created_by.readable = db.comment.created_by.writable = False
db.comment.created_on.readable = db.comment.created_on.writable = False
db.document.name.requires = IS_NOT_IN_DB(db, 'document.name')
db.document.page_id.readable = db.document.page_id.writable = False
db.document.created_by.readable = db.document.created_by.writable = False
db.document.created_on.readable = db.document.created_on.writable = False
“默認編輯控制器。 py”和創建以下行動:
• 指數:列出所有維基頁面
• 創建:另一個wiki頁面
• 顯示:顯示一個wiki頁面及其評論,並追加評論
• 編輯:編輯現有頁面
• 文檔:管理文件附加到頁面
• 下載:下載文檔(如圖片)
• 搜索:顯示一個搜索框,通過一個Ajax回調,返回所有匹配的標題作為訪問者類型
• 回調:Ajax回調函數。 它返回的HTML嵌入在搜索頁面,而訪問者類型。
這是“默認。 py”控制器:
def index():
""" this controller returns a dictionary rendered by the view
it lists all wiki pages
>>> index().has_key('pages')
True
"""
pages = db().select(db.page.id,db.page.title,orderby=db.page.title)
return dict(pages=pages)
@auth.requires_login()
def create():
"creates a new empty wiki page"
form = crud.create(db.page, next=URL('index'))
return dict(form=form)
def show():
"shows a wiki page"
this_page = db.page(request.args(0)) or redirect(URL('index'))
db.comment.page_id.default = this_page.id
form = crud.create(db.comment) if auth.user else None
pagecomments = db(db.comment.page_id==this_page.id).select()
return dict(page=this_page, comments=pagecomments, form=form)
@auth.requires_login()
def edit():
"edit an existing wiki page"
this_page = db.page(request.args(0)) or redirect(URL('index'))
form = crud.update(db.page, this_page,
next=URL('show',args=request.args))
return dict(form=form)
@auth.requires_login()
def documents():
"browser, edit all documents attached to a certain page"
page = db.page(request.args(0)) or redirect(URL('index'))
db.document.page_id.default = page.id
db.document.page_id.writable = False
grid = SQLFORM.grid(db.document.page_id==page.id,args=[page.id])
return dict(page=page, grid=grid)
def user():
return dict(form=auth())
def download():
"allows downloading of documents"
return response.download(request, db)
def search():
"an ajax wiki search page"
return dict(form=FORM(INPUT(_id='keyword',_name='keyword',
_onkeyup="ajax('callback', ['keyword'], 'target');")),
target_div=DIV(_id='target'))
def callback():
"an ajax callback that returns a
-
of links to wiki pages"
query = db.page.title.contains(request.vars.keyword)
pages = db(query).select(orderby=db.page.title)
links = [A(p.title, _href=URL('show',args=p.id)) for p in pages]
return UL(*links)
行2 - 6提供了一個索引行動發表評論。 行4 - 5在評論解讀為python測試代碼(doctest)。 測試可以運行通過管理界面。 在這種情況下,測試驗證索引操作運行沒有錯誤。
行18日,27日,35試圖取回 頁面 記錄的id request.args(0) 。
13、20行定義和流程創建表單新頁面和一個新的評論。
28行定義和流程更新wiki頁面的形式。
38行創建一個 網格 對象,該對象允許瀏覽器,添加和更新的評論鏈接到頁面。
會發生一些神奇的51。 的 onkeyup 屬性輸入標記的“關鍵字”是集。每次客人釋放的關鍵,內部的JavaScript代碼 onkeyup 執行屬性,客戶端。 這是JavaScript代碼:
ajax('callback', ['keyword'], 'target');
ajax 是一個JavaScript函數中定義文件”web2py。 js layout.html“默認包含的。 需要三個參數:行動的URL執行同步回調,變量的ID的列表發送給回調(["關鍵字"])和反應要插入的ID(“目標”)。
一旦你輸入在搜索框並釋放一個關鍵的東西,客戶端調用服務器和發送的內容“關鍵字”字段,當服務器響應,響應是嵌入在頁面本身的“目標”標記的innerHTML。
“目標”中定義的標簽是一個DIV 52。 它可以被定義在視圖中。
這是“默認/ create.html”視圖的代碼:
{{extend 'layout.html'}}
Create new wiki page
{{=form}} 如果你訪問 創建 頁面,您將看到以下:這是“默認/ index . html”視圖的代碼:
{{extend 'layout.html'}}
Available wiki pages
[ {{=A('search', _href=URL('search'))}} ]-
{{for page in pages:}} {{=LI(A(page.title, _href=URL('show', args=page.id)))}} {{pass}}
這是“默認/ show.html”視圖的代碼:
{{extend 'layout.html'}}
{{=page.title}}
[ {{=A('edit', _href=URL('edit', args=request.args))}} | {{=A('documents', _href=URL('documents', args=request.args))}} ]{{=MARKMIN(page.body)}}
Comments
{{for comment in comments:}}{{=db.auth_user[comment.created_by].first_name}} on {{=comment.created_on}} says {{=comment.body}}
{{pass}}Post a comment
{{=form}} 如果你想使用減記語法而不是markmin語法: from gluon.contrib.markdown import WIKI 和使用 維基 而不是 MARKMIN 幫手。 或者,您可以選擇接受原始HTML而不是markmin語法。 在這種情況下,你將取代: {{=MARKMIN(page.body)}} : {{=XML(page.body)}} (這樣的XML不逃,因為默認情況下web2py行為)。 這可以做的更好: {{=XML(page.body, sanitize=True)}} 通過設置 sanitize = True ,你告訴web2py逃避不安全的XML標記,如“> <腳本”,從而防止xss漏洞。 如果,從索引頁面,點擊一個頁面標題,您可以看到您創建的頁面: 這是“默認/ edit.html”視圖的代碼:
{{extend 'layout.html'}}
Edit wiki page
[ {{=A('show', _href=URL('show', args=request.args))}} ]{{=form}} 它生成一個頁面創建頁面看起來幾乎相同。 這是“默認/ documents.html”視圖的代碼: {{extend 'layout.html'}}
Documents for page: {{=page.title}}
[ {{=A('show', _href=URL('show', args=request.args))}} ]Documents
{{=grid}} 從“秀”頁面,如果你點擊文件,您現在可以管理文件附加到頁面。最后這里的代碼視圖“默認/ search.html”:
{{extend 'layout.html'}}
Search wiki pages
[ {{=A('listall', _href=URL('index'))}}]{{=form}}
{{=target_div}} 下列哪生成Ajax搜索表單:
你也可以嘗試通過訪問直接調用回調的動作,例如,以下網址:
http://127.0.0.1:8000/mywiki/default/callback?keyword=wiki
如果你看你看到返回的HTML頁面來源回調:
web2py實現feedparser閱讀還包括第三方提要。
最后,讓我們添加一個xml - rpc處理程序,允許搜索維基編程:
service = Service()
@service.xmlrpc
def find_by(keyword):
"finds pages that contain keyword for XML-RPC"
return db(db.page.title.contains(keyword).select().as_list()
def call():
"exposes all registered services, including XML-RPC"
return service()
在這里,處理程序操作簡單發布(通過xml - rpc),列表中指定的功能。 在這種情況下, find_by 。 find_by 不是一個行動(因為它接受一個參數)。 它將查詢數據庫 .select() 然后提取記錄的列表 .response 並返回列表。
這里是一個例子如何訪問xml - rpc處理程序從外部Python程序。
import xmlrpclib
server = xmlrpclib.ServerProxy(
'http://127.0.0.1:8000/mywiki/default/call/xmlrpc')for item in server.find_by('wiki'):
print item['created_on'], item['title']
處理程序可以訪問許多其他編程語言,理解xml - rpc,包括C,c++,c#和Java。
在 日期 , datetime 和 時間 格式
有三種不同的表示為每個字段類型 日期 , datetime 和 時間 :
• 數據庫的表示
• 內部web2py prepresentation
• 的字符串表示形式和表
數據庫的表示是一個內部問題,不影響代碼。 在內部,在web2py層面,它們被存儲為 datetime.date , datetime.datetime 和 datetime.time 對象分別和他們可以這樣操作:
for page in db(db.page).select():
print page.title, page.day, page.month, page.year
當日期轉換為字符串形式轉換使用ISO表示
%Y-%m-%d %H:%M:%S
然而,這表示在國際化和您可以使用admin stranslation頁面格式更改為另一種。 例如:
%m/%b/%Y %H:%M:%S
注意,默認情況下英語不是翻譯因為web2py假設應用程序已經用英語寫的。 如果你想英語國際化工作你需要創建所需要的翻譯文件(使用admin)和聲明應用程序當前的語言不是英語,例如:
T.current_languages = ['null']
更多關於 管理
管理界面提供了額外的功能,這里我們簡要回顧。
網站
這個頁面列出了所有已安裝的應用程序。 底部有兩種形式。
其中第一個允許通過指定其名稱創建一個新的應用程序。
第二種形式允許上傳一個現有的應用程序從本地文件或遠程URL。 當你上傳一個應用程序中,您需要指定一個名稱。 這可能是原來的名字,但不需要。 這允許安裝同一應用程序的多個副本。 例如,你可以試着上傳的CMS的即時新聞由馬丁Mulone:
http://code.google.com/p/instant-press/
Web2py文件包 .w2p 文件。 這些的是焦油gzip文件。 Web2py使用 .w2p 擴展而不是 . tgz 擴展在防止瀏覽器解壓縮下載。 他們可以手動壓縮 焦油zxvf(文件名) 雖然這是沒有必要的。
成功上傳,web2py顯示上傳文件的MD5校驗和。 您可以使用它來驗證在上傳文件沒有損壞。 InstantPress名稱將出現在已安裝的應用程序的列表。
單擊InstantPress名字管理運行起來。
你可以閱讀更多關於即時新聞在以下網址:
http://code.google.com/p/instant-press/
為每個應用程序的 網站 頁面允許您:
• 卸載應用程序。
• 跳轉到 關於 下面的頁面(讀)。
• 跳轉到 編輯 下面的頁面(讀)。
• 跳轉到 錯誤 下面的頁面(讀)。
• 清理臨時文件(會議、錯誤和緩存。 磁盤文件)。
• 包。 這返回一個tar文件,其中包含應用程序的完整副本。 我們建議您清理臨時文件之前包裝應用程序。
• 編譯應用程序。 如果沒有錯誤,這個選項將bytecode-compile所有模型、控制器和視圖。 因為視圖可以擴展和包括其他視圖樹,字節碼編譯之前,每個控制器的視圖樹倒塌成一個單一的文件中。 凈效應是bytecode-compiled應用程序更快,因為沒有更多的解析模板或字符串替換在運行時發生。
• 包編譯。 這個選項只有bytecode-compiled應用程序。 它允許包裝應用程序沒有源代碼和閉源分布。 注意Python(和其他編程語言)技術可以反編譯,因此編譯不提供完整的源代碼的保護。 然而,反編譯是很困難的,可以是非法的。
• 刪除編譯。 它只是消除了字節碼編譯模型、視圖和控制器的應用程序。 如果應用程序在本地與源代碼打包或編輯,是沒有害處的移除bytecode-compiled文件,和應用程序將繼續工作。 如果應用程序被安裝的形式打包編譯文件,那么這是不安全的,因為沒有源代碼回到,和應用程序將不再工作。
從web2py管理網站頁面所有可用的功能也可以通過模塊中定義的API以編程方式 膠子/ admin.py 。 只是打開一個python shell和導入這個模塊。
關於
的 關於 選項卡允許編輯的描述應用程序及其許可。 這些分別寫的關於和許可證文件在應用程序文件夾中。
您可以使用 MARKMIN ,或 gluon.contrib.markdown.WIKI 這些文件中描述ref的語法。 ( markdown2 ] 。
編輯
你有使用 編輯 頁面已經在這一章。 這里我們想指出的幾個功能 編輯 頁面。
• 如果你點擊任何文件的名字,您可以看到文件的內容和語法高亮顯示。
• 如果你點擊編輯,您可以編輯該文件通過一個web界面。
• 如果你點擊刪除,可以刪除文件(永久)。
• 如果你點擊測試,web2py將運行測試。 測試是開發人員使用Python文檔寫的,和每個函數都應該有自己的測試。
• 您可以添加語言文件,掃描應用程序發現所有字符串,通過web界面翻譯和編輯字符串。
• 如果靜態文件被組織在文件夾和子文件夾,文件夾層次結構可以連接通過點擊一個文件夾的名字。
下圖顯示了歡迎的輸出測試頁面的應用程序。
下圖顯示了語言歡迎應用程序選項卡。
下圖顯示了如何編輯語言文件,在這種情況下,“它”(意大利語)歡迎應用程序的語言。
殼牌
如果你點擊控制器選項卡下的“殼”鏈接 編輯 ,web2py將打開一個基於web的Python shell,並將為當前應用程序執行模型。 這允許您交互式地跟您的應用程序。
定時任務
還在控制器選項卡下 編輯 有一個“crontab”鏈接。 通過點擊這個鏈接您可以編輯web2py crontab文件。 在此之前相同的語法unix crontab但不依賴於unix。 事實上,它只需要web2py,它在Windows中工作。 它允許您注冊操作,在預定的時間需要在后台執行。 關於此的更多信息,見下一章。
錯誤
web2py編程時,你將不可避免地犯錯誤和引入bug。 web2py有助於在兩個方面:1)它允許您創建測試每一個函數,可以在瀏覽器中運行的 編輯 頁面;2)當一個錯誤表現,一張票發行訪客和錯誤記錄。
有意引入一個錯誤在圖像應用程序如下所示:
def index():
images = db().select(db.image.ALL,orderby=db.image.title)
1/0
return dict(images=images)
當你訪問的索引操作,得到以下的機票:
只有管理員可以訪問的機票:
票顯示了回溯,導致問題,文件的內容和完整的系統(變量、請求、會話等等)。 如果錯誤發生在一個視圖,web2py顯示了視圖從HTML轉換為Python代碼。 這允許輕松地識別文件的邏輯結構。
默認情況下門票由回溯存儲在文件系統和組。 管理界面提供了一種聚合視圖(類型的回溯和發生的數量)和一個詳細視圖id)(列出所有門票票。 管理員可以在兩個視圖之間進行切換。
請注意,無處不在 管理 顯示了syntax-highlighted代碼(例如,錯誤報告,web2py關鍵詞橙色)所示。 如果你點擊一個web2py關鍵字,重定向到一個文檔頁面的關鍵字。
如果你固定的除蟲指數行動並介紹一個在index視圖:
{{extend 'layout.html'}}
Current Images
-
{{for image in images:}} {{1/0}} {{=LI(A(image.title, _href=URL("show", args=image.id)))}} {{pass}}
注意web2py已經從HTML視圖轉換為Python文件,和機票是指描述的錯誤生成的Python代碼,而不是到原始視圖文件:
這似乎令人困惑,但實際上它更容易調試,因為Python縮進了代碼的邏輯結構中嵌入視圖。
代碼顯示在同一頁面的底部。
列出所有門票在管理的 錯誤 為每個應用程序頁:
水銀
如果您正在運行從源代碼,你安裝的版本控制庫:
easy_install mercurial
然后管理界面顯示一個菜單項被稱為“善變”。 它會自動為應用程序創建一個本地Mercurial存儲庫。 按下“提交”按鈕在頁面將提交當前應用程序。 Mercurial創建和存儲的信息在代碼中您所作的改變成一個隱藏文件夾”。 hg”在應用程序文件夾中。 每個應用程序都有自己的”。 hg”文件夾和自己的”。 hgignore”文件(告訴Mercurial忽略哪些文件)。
Mercurial web接口允許您瀏覽以前的承諾和diff文件,但是我們建議你直接使用Mercurial的外殼或可能基於gui的善變的客戶因為他們更強大。 例如他們會允許你用遠程數據源同步應用程序存儲庫:
你可以在這里閱讀更多關於水銀:
http://mercurial.selenic.com/
管理向導(實驗)
的 管理 接口包括一個向導可以幫助您創建一個新的應用程序。 您可以訪問向導的“網站”頁面,下圖所示。
向導將指導您完成創建一個新的應用程序所涉及的一系列步驟:
• 為應用程序選擇一個名稱
• 配置應用程序並選擇所需的插件
• 建立所需的模型(它將為每個模型創建的CRUD頁面)
• 允許您編輯這些頁面使用MARKMIN語法的觀點
下圖顯示了這個過程的第二步。
你可以看到一個插件(從下拉框中選擇一個布局 web2py.com/layouts ),檢查其他插件(多項選擇下拉 web2py.com/plugins )和一個“登錄配置”字段,把名為Janrain“域:關鍵”。
其他步驟都是不言而喻的。
向導適用於它,但它被認為是一個 實驗功能 有兩個原因:
• 應用程序手動創建向導和編輯,由向導之后不能修改。
• 向導的界面會隨着時間改變,包括支持更多的功能和更容易視覺發展。
在任何情況下,向導是一個方便的工具,用於快速原型和它可以用來引導一個新的應用程序與另一個布局和可選插件。
配置 管理
通常不需要進行任何配置的管理,但一些定制成為可能。 在您登錄到管理員可以編輯管理通過URL配置文件:
http://127.0.0.1:8000/admin/default/edit/admin/models/0.py
請注意, 管理 可用於編輯本身。 事實上 管理 和其他任何一個應用程序。
文件“0。 py”是非常自我記錄,如果你打開你可能已經知道你在尋找什么。 反正有一些定制比其他人更重要:
GAE_APPCFG = os.path.abspath(os.path.join('/usr/local/bin/appcfg.py'))
這應該指向“appcfg的位置。 py”文件,Google App Engine SDK。 如果你有SDK您可能想要將這個配置參數更改為正確的值。 它將允許您將部署到GAE從管理界面。
你也可以設置web2py管理在演示模式下:
DEMO_MODE = True
FILTER_APPS = ['welcome']
只有過濾應用程序中列出的應用程序訪問,他們將只能以只讀模式。
如果你是一個老師,要公開管理界面,這樣學生可以共享一個管理界面的項目(一個虛擬實驗室)認為,可以通過設置:
MULTI_USER_MODE = True
這樣學生將被要求登錄,只能夠訪問通過管理自己的應用程序。 當第一個用戶/老師,你將能夠訪問它們。
注意,這個機制仍然假定所有的用戶都是可信的。 創建的所有應用程序在管理下運行相同的憑證在相同的文件系統。 可以為應用程序創建一個學生來訪問數據和應用程序由另一個學生的來源。
更多關於 appadmin
appadmin 不打算暴露給公眾。 它的目的是幫助你通過提供一個簡單的訪問數據庫。 它只包含兩個文件:appadmin控制器”。 py appadmin和一個視圖。 html”中所使用的所有操作控制器。
的 appadmin 控制器是相對較小的,可讀的,它提供了設計一個數據庫接口的一個例子。
appadmin 顯示可用的數據庫,每個數據庫表存在。 你可以單獨為每個表插入記錄,所有記錄列表。 appadmin 分頁輸出100條記錄。
一旦選定一組記錄,標題頁的變化,允許您更新或刪除所選的記錄。
更新記錄,查詢字符串字段中輸入SQL任務:
title = 'test'
在必須括在單引號字符串值。 可以將多個字段之間用逗號分隔。
刪除一條記錄,點擊相應的復選框以確認你確定。
appadmin 還可以執行連接如果SQL篩選包含SQL條件涉及到兩個或兩個以上的表中。 例如,嘗試:
db.image.id == db.comment.image_id
web2py經過這沿着木豆,它明白兩個表的查詢鏈接,因此,選擇兩個表內連接。 這是輸出:
如果你點擊一個id字段的數量,你得到一個編輯頁面的記錄與相應的id。
如果你點擊一個引用字段的數量,一個編輯頁面引用的記錄。
你不能更新或刪除行選擇加入,因為他們涉及來自多個表的記錄,這將是模棱兩可的。
除了它的數據庫管理功能, appadmin 還使您能夠查看內容的應用程序的詳細信息 緩存 (在 / yourapp appadmin / ccache )以及當前的內容 請求 , 響應 , 會話 對象(在 / yourapp / appadmin /狀態 )。
appadmin 替換 response.menu 有自己的菜單,它提供了應用程序的鏈接 編輯 頁 管理 , db (數據庫管理)頁面 狀態 頁面, 緩存 頁面。 如果您的應用程序的布局並不生成菜單使用 response.menu ,那么你將不會看到 appadmin 菜單。 在這種情況下,您可以修改appadmin。 html文件並添加 { { =菜單(response.menu)} } 顯示菜單。
