python26web[web2py的URL映射]
时间:2011-04-18 来源:iTech
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的信息返回用户的浏览器。
.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。
完!