Web.py Cookbook 简体中文版 - 管理自带webserver日志

justjavac 发表于 2012-04-19

问题

如何操作web.py自带的webserver的日志?

解法

我们可以用wsgilog来操作内置的webserver的日志,并做其为中间件加到应用中。

如下,写一个Log类继承wsgilog.WsgiLog,在_init_中把参数传给基类,如这个例子

import sys, logging from wsgilog import WsgiLog, LogIO import config class Log(WsgiLog): def __init__(self, application): WsgiLog.__init__( self, application, logformat = '%(message)s', tofile = True, file = config.log_file, interval = config.log_interval, backups...

Web.py Cookbook 简体中文版 - 上传文件大小限定

justjavac 发表于 2012-04-19

问题

如何限定上传文件的大小?

Solution

web.py 使用cgi 模块来解析用户的输入, 而 cgi 模块对最大输入大小有限制。

下面的代码限制了最大数据输入为 10MB.

import cgi # Maximum input we will accept when REQUEST_METHOD is POST # 0 ==> unlimited input cgi.maxlen = 10 * 1024 * 1024 # 10MB

请注意这是对POST方法提交数据大小的限制,而不是上传文件大小。当然如果表单中没有其他输入数据,上传文件完全可以达到限制的大小。

...

Web.py Cookbook 简体中文版 - 站点布局模板

justjavac 发表于 2012-04-19

问题

如何让站点每个页面共享一个整站范围的模板?(在某些框架中,称为模板继承,比如ASP.NET中的母版页)

方法

我们可以用 base 属性来实现:

render = web.template.render('templates/', base='layout')

现在如果你调用render.foo()方法,将会加载templates/foo.html 模板,并且它将会被 templates/layout.html模板包裹。

“layout.html” 是一个简单模板格式文件,它包含了一个模板变量,如下:

$def with (content) <html> <head> <title>Foo</title> </head> <body> $:content </body> </html>

在某些情况,如果不想使用基本模板,只需要创建一个没有base属性的reander对象,如下:

render_plain = web.template.render('templates/')

Tip: 在布局文件(layout.html)中定义的页面标题变量,如何在其他模板文件中赋值,如下:

templates/index.html
$var title: This...

Web.py Cookbook 简体中文版 - db.insert 向数据库中新增数据

justjavac 发表于 2012-04-19

问题

如何向数据加新增数据?

解决办法

在 0.3 中,数据库连接如下:

db = web.database(dbn='postgres', db='mydata', user='dbuser', pw='')

数据库连接写好以后,“insert” 操作如下:

# 向 'mytable' 表中插入一条数据 sequence_id = db.insert('mytable', firstname="Bob",lastname="Smith",joindate=web.SQLLiteral("NOW()"))

上面的操作带入了几个参数,我们来说明一下:

  • tablename
  • seqname
  • test
  • *values

tablename

表名,即你希望向哪个表新增数据。

seqname

可选参数,默认 None。Set seqname to...

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

justjavac 发表于 2012-04-19

web.input

问题

如何从form或是url参数接受用户数据.

解决方法

web.input()方法返回一个包含从url(GET方法)或http header(POST方法,即表单POST)获取的变量的web.storage对象(类似字典).举个例子,如果你访问页面http://example.com/test?id=10,在Python后台你想取得 id=10 ,那么通过web.input()那就是小菜一碟:

class SomePage: def GET(self): user_data = web.input() return "<h1>" + user_data.id + "</h1>"

有时你想指定一个默认变量,而不想使用None.参考下面的代码:

class SomePage: def GET(self): user_data = web.input(id="no data") return "<h1>" + user_data.id + "</h1>"

注意,web.input()取得的值都会被当作string类型,即使你传递的是一些数字.

...