一 web2py的應用的執行環境
Models,Controllers和views所在的執行環境中,以下對象已經被預設地匯入:
Global Objects:
request,response,session,cache
Navigation:
redirect,HTTP
Internationalization:
T
Helpers:
XML, URL, BEAUTIFYA, B, BEAUTIFY, BODY, BR, CENTER, CODE, DIV, EM, EMBED,FIELDSET, FORM, H1, H2, H3, H4, H5, H6, HEAD, HR, HTML,I, IFRAME, IMG, INPUT, LABEL, LEGEND, LI, LINK, OL, UL,MARKMIN, MENU, META, OBJECT, ON, OPTION, P, PRE, SCRIPT,OPTGROUP, SELECT, SPAN, STYLE, TABLE, TAG, TD, TEXTAREA,TH, THEAD, TBODY, TFOOT, TITLE, TR, TT, URL, XHTML, xmlescape, embed64
validators:
CLEANUP, CRYPT, IS_ALPHANUMERIC, IS_DATE_IN_RANGE, IS_DATE,IS_DATETIME_IN_RANGE, IS_DATETIME, IS_DECIMAL_IN_RANGE,IS_EMAIL, IS_EMPTY_OR, IS_EXPR, IS_FLOAT_IN_RANGE, IS_IMAGE,IS_IN_DB, IS_IN_SET, IS_INT_IN_RANGE, IS_IPV4, IS_LENGTH,IS_LIST_OF, IS_LOWER, IS_MATCH, IS_EQUAL_TO, IS_NOT_EMPTY,IS_NOT_IN_DB, IS_NULL_OR, IS_SLUG, IS_STRONG, IS_TIME,IS_UPLOAD_FILENAME, IS_UPPER, IS_URL
Database:
DAL, Field
其他的一些不常用的對象需要使用者顯示的匯入,如Auth,Crud和Service等,如下:from gluon.tools import Auth, Crud, Service.
二 web2py的核心對象
1) request
request對象是web2py中常見的類型gluon.storage.storage的執行個體,gluon.storage.storage是python的dict的子類。gluon.storage.storage與dict主要的不同就是可以像訪問屬性一樣訪問dict的元素。如下request.vars等價於request['vars'],另一個與dict不同的就是當訪問的key不存在時,不拋出異常,而是返回None。request有下列的屬性,其中有些屬性也為gluon.storage.storage類型:
* request.cookies: cookie.simplecookie()對象,包含了HTTP request中的cookies資訊。它像一個cookies dictionary。
* request.env:是一個storage對象,包含了傳遞給controller的環境變數,包括來自HTTP request的HTTP header和標準的WSGI參數。環境變數都被轉化為小寫,點被轉化為底線。
* request.application:請求的應用的名字(從request.env.path_info解析而來)。
* request.controller:請求的controller的名字(從request.env.path_info解析而來)。
* request.function:請求的函數的名字(從request.env.path_info解析而來)。
* request.extension:extension預設為html,如果controller函數返回一個dictionary且沒有指定view,extension將被用來決定使用何種view來渲染dictionary。(從request.env.path_info解析而來)。
* request.folder:應用程式的目錄。
* request.now:儲存了當前request的時間戳記,類型為datetime.datetime。
* request.args:controller函數後面的URL路徑組件的list,等價於request.env.path_info('/')[3:]。
* request.vars:storage對象包含了HTTP GET和HTTP POST的查詢變數。
* request.get_vars: storageObject Storage Service了HTTP GET查詢變數。
* request.post_vars:storageObject Storage Service了HTTP POST查詢變數。
* request.client:client的ip地址。
* request.body: 唯讀檔案流包含了HTTP request的body。
* request.ajax:是True,如果函數通過Ajax request被調用。
* request.cid:ajax request產生的組件的id。
* request.wsgi:一個鉤子允許調用在actions裡第三方的WSGI應用。
對於請求http://127.0.0.1:8000/examples/default/status/x/y/z?p=1&q=2,request對象如下:
variable value
request.application examples
request.controller default
request.function index
request.extension html
request.view status
request.folder applications/examples/
request.args ['x', 'y', 'z']
request.vars <Storage {'p': 1, 'q': 2}>
request.get_vars <Storage {'p': 1, 'q': 2}>
request.post_vars <Storage {}>
request.cid None
request.wsgi hook
request.env.content_length 0
request.env.content_type
request.env.http_accept text/xml,text/html;
request.env.http_accept_encoding gzip, deflate
request.env.http_accept_language en
request.env.http_cookie session_id_examples=127.0.0.1.119725
request.env.http_host 127.0.0.1:8000
request.env.http_max_forwards 10
request.env.http_referer http://web2py.com/
request.env.http_user_agent Mozilla/5.0
request.env.http_via 1.1 web2py.com
request.env.http_x_forwarded_for 76.224.34.5
request.env.http_x_forwarded_host web2py.com
request.env.http_x_forwarded_server 127.0.0.1
request.env.path_info /examples/simple_examples/status
request.env.query_string remote_addr:127.0.0.1
request.env.request_method GET
request.env.script_name
request.env.server_name 127.0.0.1
request.env.server_port 8000
request.env.server_protocol HTTP/1.1
request.env.web2py_path /Users/mdipierro/web2py
request.env.we2bpy_version Version 1.83.1
request.env.web2py_runtime_gae (optional, defined only if GAE detected)
request.env.wsgi_errors <open file, mode 'w' at >
request.env.wsgi_input
request.env.wsgi_multiprocess False
request.env.wsgi_multithread True
request.env.wsgi_run_once False
request.env.wsgi_url_scheme http
request.env.wsgi_version 10
request.env.http_* 變數是從request HTTP header中解析而來.
2) response
response 是另一個storage執行個體,它包含了下列的屬性:
response.body: 包含了返回的page的body的stringio對象。
response.cookies:與request.cookies(包含了client到server的cookies)類似,但是包含了server返回給client的cookies。
response.download:一個方法用來實現controller函數允許檔案的下載。
response.files:頁面需要的css和js檔案的列表。這些檔案將被自動地串連到標準的layout.html頭。當需要包含新的css和js檔案,只需要將他們加入到這個list。必須注意的是檔案的順序。
response.flash:可選的參數,可以包含在views。通常用來告知使用者一些變化。
response.headers:HTTP response的頭得dict。
response.menu:可選的參數,可以包含在views。一般用來將導覽功能表傳遞給views。它可以使用MENU helper來產生。
response.meta:storage對象包含了可選的meta storage資訊,例如response.meta.author,response.meta.description和response.meta.keywords。meta變數的內容被web2py_ajax.html(被views/layout.html包含)自動地放置到對應的tag中。
response.postprocessing:這是一個函數list,預設為空白。這些函數用來在輸出被渲染前過濾一個action的輸出的response對象。
response.render(view,vars):一個方法被用來顯示地在controller中調用view。view是選擇性參數是view檔案的名字。vars是一個傳給view的dict。
response.seesion_file:檔案流包含了session。
response.session_file_name:包含了session被儲存的檔案名稱字。
response.session_id:當前session的id。
response.session_id_name:這個應用的session cookie的名字。
response.status:HTTP狀態碼。預設為200.
response.stream:當一個controller返回它,web2py流花檔案內容給client。
response.subtitle:包含在views中的可選的參數。應該包含頁面的subtitle。
response.title:包含在views中的可選的參數。
response_vars:只能被view訪問的一個變數。action不能訪問。它包含了action返回給view的值。
response.view:用來渲染頁面的view模板的名字。預設為"%s/%s.%s" % (request.controller, request.function, request.extension)。如果以上view模板不存在,則使用"generic.%s" % (request.extension) 。改變該值來修改特定的action的view檔案。
response.xmlrpc:當一個controller返回它,這個函數通過xml-rpc暴露該方法。
response.js:可以包含javascript代碼。
3)session
session是另一個storage類型的執行個體。只要code被同一個使用者執行在同一session(使用者沒有刪除session cookies且session沒有到期), 就可以使用session.myvar = ‘hello’儲存變數,使用a=session.myvar來使用變數。
session有2個重要的方法:
session.forget(response),此方法告訴web2py不儲存session。
session.connect(request,response,db,masterapp=None),db是一個開啟的資料庫連接。此方法告訴web2py儲存session到資料庫而不是檔案系統。web2py將建立表:
db.define_table('web2py_session',
Field('locked', 'boolean', default=False), Field('client_ip'),
Field('created_datetime', 'datetime', default=now), Field('modified_datetime', 'datetime'), Field('unique_key'), Field('session_data', 'text'))
且儲存cpickled sessions在session_data欄位。
4)cookies
web2py使用python的cookies模組來處理cookies。從瀏覽器傳來的cookies儲存在request.cookies。從server傳給client的包含在response.cookies。可以使用下列的方法來設定cookies:
response.cookies['mycookie'] = 'somevalue'
response.cookies['mycookie']['expires'] = 24 * 3600
response.cookies['mycookie']['path'] = '/'
使用cookies的方法如下:
if request.cookies.has_key('mycookie'): value = request.cookies['mycookie'].value
5)cache
cache是web2py執行環境中的一個全域變數。cache有2個屬性:
cache.ram:應用程式緩衝在記憶體中;
cache.disk:應用程式緩衝在硬碟中;
將controller函數的輸出緩衝到記憶體中的例子:
@cache(request.env.path_info, time_expire=5, cache_model=cache.ram)
def cache_controller_in_ram():
import time
t = time.ctime()
return dict(time=t, link=A('click me', _href=request.url))
將controller的函數的輸出緩衝到硬碟的例子:
@cache(request.env.path_info, time_expire=5, cache_model=cache.disk)
def cache_controller_on_disk():
import time
t = time.ctime()
return dict(time=t, link=A('click to reload', _href=request.url))
6)URL
URL用來產生URL的路徑。例如URL('a', 'c', 'f', args=['x', 'y'], vars=dict(z='t')) 映射為/a/c/f/x/y?z=t。
7)HTTP和redirect
HTTP其實是一個異常類,如400異常raise HTTP(400, "my message")
redirect('http://www.web2py.com') 用來轉向http://www.web2py.com/。
完1