web2py核心详解

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()对象,包含了HTT 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 storage对象存储了HTTP GET查询变量
request.post_vars storage对象存储了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应用
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中解析而来

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代码。

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字段。

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

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))

URL

  • URL用来产生URL的路径。
例如:
URL('a', 'c', 'f', args=['x', 'y'], vars=dict(z='t')) 映射为/a/c/f/x/y?z=t。

HTTP和redirect

  • HTTP其实是一个异常类
例如:
400异常raise HTTP(400, "my message") 
redirect('http://www.web2py.com') 用来转向http://www.web2py.com/。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容