##language:zh
#pragma section-numbers on

{{http://webpy.org/static/webpy.gif}} WebPy ~ 超轻量WSGI 应用框架

::-- ZoomQuiet [<<DateTime(2008-02-24T06:19:46Z)>>]
<<TableOfContents>>
## 默许导航,请保留
<<Include(CPUGnav)>>

`web.py 0.3 的食谱格式文档.`


= web.py 食谱 =
 * [[http://webpy.org/cookbook|web.py Cook Book]] ~ 中文翻译

== Hello World! ==

 命题::
 怎么使用web.py 写个''hello world''?
 解决::
{{{#!python
import web

urls = ("/.*", "hello")
app = web.application(urls, globals())

class hello:
    def GET(self):
        return 'Hello, world!'

if __name__ == "__main__":
    app.run()
}}}

== 客户对话~Sessions ==

 命题::
  如果在web.py 中运用 客户对话?
 解决::
 * `web.session`模块专门进行了支持,以下实例
{{{#!python
import web
urls = (
    "/count", "count",
    "/reset", "reset"
)
app = web.application(urls, locals())
session = web.session.Session(app, web.session.DiskStore('sessions'), initializer={'count': 0})

class count:
    def GET(self):
        session.count += 1
        return str(session.count)

class reset:
    def GET(self):
        session.kill()
        return ""

if __name__ == "__main__":
    app.run()
}}}
 * 对话对象在响应请求句柄前加载,前在请求句柄后保存变更
 * `initializer` 参数用以初创对话

== 邮件 ==

 命题::
  如何通过 web.py 操作邮件?
 解决::
  `web.sendmail`函式用以发送邮件
{{{
web.sendmail('cookbook@webpy.org', 'user@example.com', 'subject', 'message')
}}}
 * 配置`web.config`可通过其它邮件服务发送比如:`/usr/lib/sendmail.`
{{{
web.config.smtp_server = 'mail.mydomain.com'
}}}
 * 可以在`to_address` 参数中指定多个地址
{{{
web.sendmail('cookbook@webpy.org'
    , ['user1@example.com', 'user2@example.com']
    , 'subject', 'message')
}}}
 * 使用`cc`和`bcc`键参数,则声明转发和暗送邮箱地址(使用列表,同樣支持多地址Cc Bcc)
{{{
web.sendmail('cookbook@webpy.org', 
    'user@example.com', 'subject', 'message', 
    cc='user1@example.com', 
    bcc='user2@example.com')
}}}

== 网站排版模板 ==

 命题::Problem
  如何在web.py 应用中使用排版模板?
 解决::
  在应用过程中直接使用
{{{#!python

app = web.application(urls, gloabals)
render = web.template.render('templates/')

def layout_processor(handle):
    result = handle()
    return render.layout(result)

app.add_processor(layout_processor)
}}}

== 文件上传 ==
 命题::
   即使你对表单上传或是CGI生成不熟悉,文件上传也可以轻易支持的

 解决::
{{{
import web

urls = ('/upload', 'Upload')

class Upload:
    def GET(self):
        return """<html><head></head><body>
<form method="POST" enctype="multipart/form-data" action="">
<input type="file" name="myfile" />
<br/>
<input type="submit" />
</form>
</body></html>"""

    def POST(self):
        x = web.input(myfile={})
        web.debug(x['myfile'].value) # This is the file contents
        web.debug(x['myfile'].filename) # This is the filename
        web.redirect('/upload')


app = web.application(urls, globals())

if __name__ == "__main__":
    app.run()
}}}

 探讨::
   有些事儿得注意:
  * 对应表单必须有`enctype="multipart/form-data"`聲明,否则不会起作用
  * 在 webpy 代码中, 如果将文件作为想导入CGI`FieldStorage`对象,默认值是必须的(myfile={}部分) .
  * 否则将被视作文本文件-- 此例中,你这无法知道文件命了.


== 预备命题 ==

    * How to properly use web.background


== 反馈 ==