Web.py Cookbook 简体中文版 - web.ctx

justjavac 发表于 2012-04-19

问题

如何在代码中得到客户端信息?比如:来源页面(referring page)或是客户端浏览器类型

解法

使用web.ctx即可。首先讲一点架构的东西:web.ctx基于threadeddict类,又被叫做ThreadDict。这个类创建了一个类似字典(dictionary-like)的对象,对象中的值都是与线程id相对应的。这样做很妙,因为很多用户同时访问系统时,这个字典对象能做到仅为某一特定的HTTP请求提供数据(因为没有数据共享,所以对象是线程安全的)

web.ctx保存每个HTTP请求的特定信息,比如客户端环境变量。假设,我们想知道正在访问某页面的用户是从哪个网页跳转而来的:

例子

class example: def GET(self): referer = web.ctx.env.get('HTTP_REFERER', 'http://google.com') raise web.seeother(referer)

上述代码用web.ctx.env获取HTTP_REFERER的值。如果HTTP_REFERER不存在,就会将google.com做为默认值。接下来,用户就会被重定向回到之前的来源页面。

web.ctx另一个特性,是它可以被loadhook赋值。例如:当一个请求被处理时,会话(Session)就会被设置并保存在web.ctx中。由于web.ctx是线程安全的,所以我们可以象使用普通的python对象一样,来操作会话(Session)。

‘ctx’中的数据成员

Request

  • environ 又被写做. env – 包含标准WSGI环境变量的字典。
  • home – 应用的http根路径(译注:可以理解为应用的起始网址,协议+站点域名+应用所在路径)例:http://example.org/admin
  • homedomain – 应用所在站点(可以理解为协议+域名) http://example.org
  • homepath...

Web.py Cookbook 简体中文版 - 如何操作Cookie

justjavac 发表于 2012-04-19

问题

如何设置和获取用户的Cookie?

解法

对web.py而言,设置/获取Cookie非常方便。

设置Cookies

概述

setcookie(name, value, expires="", domain=None, secure=False): 
  • name (string) - Cookie的名称,由浏览器保存并发送至服务器。
  • value (string) -Cookie的值,与Cookie的名称相对应。
  • expires (int) - Cookie的过期时间,这是个可选参数,它决定cookie有效时间是多久。以秒为单位。它必须是一个整数,而绝不能是字符串。
  • domain (string) - Cookie的有效域-在该域内cookie才是有效的。一般情况下,要在某站点内可用,该参数值该写做站点的域(比如.webpy.org),而不是站主的主机名(比如wiki.webpy.org)
  • secure (bool)- 如果为True,要求该Cookie只能通过HTTPS传输。.

示例

web.setcookie() 设置cookie,如下:

...

Web.py Cookbook 简体中文版 - CGI deployment on Apache

justjavac 发表于 2012-04-19

Here are the simple steps needed to create and run an web.py application.

  • Install web.py and flups

  • Create the application as documented

     if __name__ == "__main__": web.run(urls, globals())

For our example, let it...

Web.py Cookbook 简体中文版 - 如何使用web.background

justjavac 发表于 2012-04-19

注意!! web.backgrounder已转移到web.py 3.X实验版本中,不再是发行版中的一部分。你可以在这里下载,要把它与application.py放置在同一目录下才能正运行。

介绍

web.background和web.backgrounder都是python装饰器,它可以让某个函式在一个单独的background线程中运行,而主线程继续处理当前的HTTP请求,并在稍后报告background线程的状态(事实上,后台函式的标准输出(stdout)被返回给启动该线程的”backrounder”)。 译注:我本来想将background thread翻译为后台线程,后来认为作者本意是想表达“被background修饰的函式所在的线程”,最后翻译采用“background线程”

这样,服务器就可以在处理其他http请求的同时,快速及时地响应当前客户端请求。同时,background线程继续执行需要长时间运行的函式。

例子

#!/usr/bin/env python # -*- coding: utf-8 -*- from web import run, background, backgrounder from datetime import datetime; now = datetime.now from time import sleep urls = ( '/',...

Web.py Cookbook 简体中文版 - Application processors

justjavac 发表于 2012-04-19

问题

如何使用应用处理器,加载钩子(loadhooks)和卸载钩子(unloadhook)?

解法

web.py可以在处理请求之前或之后,通过添加处理器(processor)来完成某些操作。

def my_processor(handler): 
    print 'before handling'
    result = handler() 
    print 'after handling'
    return result

app.add_processor(my_processor)

可以用加载钩子(loadhook)和卸载钩子(unloadhook)的方式来完成同样的操作,它们分别在请求开始之前和结束之后工作。

def my_loadhook():
    print "my load hook"

def my_unloadhook():
    print "my unload hook"

app.add_processor(web.loadhook(my_loadhook))
app.add_processor(web.unloadhook(my_unloadhook))