web2py的URL映射
1) http://127.0.0.1:8000/a/c/f.html的映射
web2py的URL映射規則將http://127.0.0.1:8000/a/c/f.html映射到Application(a)的Controller(c)的function(f)。如果function(f)不存在,則映射到Controller(c)的function(index)函數。如果Controller(c)不存在,web2py預設映射到Controller(default),如果application(a)不存在的話,web2py預設映射到application(init),如果application(init)不存在的話,web2py將映射到application(welcome)。
預設地,任何新的request將建立新的session,然後session cookie將session的資訊返回使用者的瀏覽器。
web2py自動地透明地用session和cookie來記錄訪問者。對每個新的訪問者,它建立一個session然後賦予一個唯一的session_id。session是變數的容器儲存在server端。session的id將通過cookie回傳給訪問者的瀏覽器。當訪問者在同一個應用中請求另一個頁面時,瀏覽器將cookie返回,在server端web2py將檢查cookie然後相應的session將被儲存。
.html擴充是預設的頁面擴充,頁面的擴充決定了使用何種view來渲染Controller的function。此方法允許頁面被渲染為多種格式(html,xml,json,rss,etc)。
2)http://127.0.0.1:8000/a/static/filename的映射
URL映射的一個特例:http://127.0.0.1:8000/a/static/filename將此request映射為application(a)下的subfolder(static)下的file(filename)。當靜態檔案被下載的時候,web2py不建立session,也不返回cookie,也不執行models。web2py總是將靜態檔案流化為1MB的塊,當用戶端對檔案發送RANGE request時,PARTIAL CONTENT將被返回。
web2py也支援IF_MODIFIED_SINCE協議,如果檔案已經儲存在瀏覽器的緩衝且從上個版本後沒有改動,檔案將不被返回。
3)http://127.0.0.1:8000/a/c/f.html/x/y/z?p=1&q=2的映射
web2py將http://127.0.0.1:8000/a/c/f.html/x/y/z?p=1&q=2映射為application(a)的Controller(c)的function(f),且儲存URL中的參數到request變數中,如下:
request.args = ['x', 'y', 'z']
request.vars = {'p':1, 'q':2}
request.application = 'a'
request.controller = 'c'
request.function = 'f'
在以上的例子中,request.args[i] 和 request.args(i)用來獲得request.args的第i個元素。
request.url 儲存了當前request的Full URL(不包含get變數)。
如果HTTP request是GET,則request.env.request_method設定為GET,如果為POST,則request.env.request_method設定為POST。
URL查詢變數被儲存在request.vars儲存字典中; 如果是GET request,則變數同時被儲存在request.get_vars,如果是POST,則儲存在 request.post_vars 。
web2py儲存WSGI和web2py環境變數在request.env中,例如request.env.path_info = 'a/c/f',儲存HTTP 頭在環境變數中,例如request.env.http_host = '127.0.0.1:8000' 。
4) 總結
web2py對靜態檔案的請求,只是簡單地讀取和返回請求的檔案的流。
對於非靜態檔案,過程如下:
1))解析cookies;
2))建立環境來執行函數;
3))初始化request,response,cache;
4))開啟存在的session或者新建立session;
5))執行屬於請求應用的models;
6))執行請求控制器的action函數;
7))如果函數返回dictionary,則執行對應的view;
8))如果成功,提交所有開啟的事務;
9))保持session;
10))返回一個HTTP response;
注意:controller和view在相同環境的不同的copy下執行,controller對view不可見,但是view可以訪問models,可以訪問controller action函數返回的變數。
如果一個異常(不是HTTP異常)發生,web2py做以下動作:
1))儲存錯誤檔案的traceback且分配一個ticket number;
2))roll back所有開啟的事務;
3))返回一個錯誤頁麵包含了ticket number;
如果是HTTP異常,則被認為是內部的行為,所有開啟的資料庫事務被commit。
完!