Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2107854
  • 博文数量: 333
  • 博客积分: 10161
  • 博客等级: 上将
  • 技术积分: 5238
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-19 08:59
文章分类

全部博文(333)

文章存档

2017年(10)

2014年(2)

2013年(57)

2012年(64)

2011年(76)

2010年(84)

2009年(3)

2008年(37)

分类:

2010-12-29 01:32:29

web.py 0.3 教程

 是一个漂亮的 Python web 框架,
当前最新版本是 0.3,增加了 sessions、subdir_application 和 subdomain_application 以及更好的数据库支持。

目录:









































安装


可以从  里获得最新的 web.py
执行下列命令抓取
git clone   git://github.com/webpy/webpy.git

git clone   git://github.com/webpy/webpy.git

之后可以直接将抓回来的 webpy/web/ 文件夹拷到 web.py 程序目录里使用,
或者执行下列命令将 web.py 安装到系统里
cd webpy
python setup.py build
sudo python setup.py install
此外,也许您还需要安装 , 

第一个程序

第一个程序就以 你好,世界 来开始吧

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import web

# URL 规则
urls = (
'/(.*)', 'hello'
)

# 应用程序
app = web.application(urls, globals())

class hello:
def GET(self, name):
if not name: name = 'world'
web.header('Content-Type', 'text/html; charset=UTF-8')
return '你好,' + 世界 + '!'

# 启动
if __name__ == "__main__":
app.run()

将他保存为 code.py,在命令行执行
python code.py
现在这个 web.py 应用程序就运行了一个 web 服务器默认监听 8080 端口了,在浏览器中访问,应该就可以看到 “您好,世界!” 了。

在命令行的 code.py 后加参数 "IP 地址:端口" 来控制 web 服务器的监听范围
比如监听 8000 端口
python code.py 0.0.0.0:8000
或者,只接受 192.168.1.25 来的 8086 端口
python code.py 0.0.0.0:8000

URL 处理

web.py 0.3 有两种方式处理 URL,
有 urls 指定,或由元类自动映射

正则映射

web.application() 用 urls 将路径的正则匹配映射到元类
import web

urls = (
"/hello", "hello",
"/magic/.*", "magic"
)

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

自动映射

web.auto_application() 类似于 web.application() ,但自动根据元类来构造 urls
import web

app = web.auto_application()

class hello(app.page):
def GET(self):
return "hello, world!"

开发



静态文件

重定向


多个应用程序

web.py 支持集成多个应用程序,或说将应用划分到多个子应用程序。

比如将 /blog 分出在 blog.py 里边

在 blog.py:
import web
urls = (
"", "reblog",
"/(.*)", "blog",
)

class reblog:
def GET(self): raise web.seeother('/')

class blog:
def GET(self, path):
return "blog " + path

app_blog = web.application(urls, locals())
在 code.py:
import web
import blog
urls = (
"/blog", blog.app_blog,
"/(.*)", "index",
)

class index:
def GET(self, path):
return "hello " + path

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

基于子目录的应用程序

可以根据子目录来划分应用程序,

比如将 wiki.py , blog.py , auth.py 分出来

import web

import wiki
import blog
import auth

mapping = (
"/wiki", wiki.app,
"/blog", blog.app,
"/auth", auth.app,
)

app = web.subdir_application(mapping)

基于子域名的应用程序

也可以根据子域名来划分应用程序,这可以方便做 virtual hosting

比如

(和 example.com)是 mainsite
XXXX.example.com 是 usersite

import web

import mainsite
import usersite

mapping = (
"(www\.)?example.com", mainsite.app,
".*\.example.com", usersite.app,
)

app = web.subdomain_application(mapping)


测试

doctest

import web

urls = (
"/hello", "hello",
)

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

class hello:
"""Hello world example.

>>> response = app.request("/hello")
>>> response.data
'hello, world!'
>>> response.status
'200 OK'
>>> response.headers['Content-Type']
'text/plain'
"""
def GET(self):
web.header('Content-Type', 'text/plain')
return "hello, world!"


unittest

import unittest
from helloworld import app

class HelloWorldTest(unittest.TestCase):
def testHelloWorld(self):
response = app.request('GET', '/')
self.assertEquals(response.data, 'hello, world!')
self.assertEquals(response.headers['Content-Type'], 
'text/plain')
self.assertEquals(response.status, '200 OK')

if __name__ == "__main__":
unittest.main()


会话

session

web.py 0.3 正式提供了基于 cookie 的 session 支持。

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

上边 Session 的 initializer 参数可以是 dict 或 func,用来初始化 session。

web.py 的 session 存储有基于文件的 DiskStore 和基于数据库的 DBStore ,上边例子是 DiskStore。

也可以使用基于数据库的 DBStore

使用 DBStore session 前需要在数据库建表
create table sessions (
session_id char(128) UNIQUE NOT NULL,
atime datetime NOT NULL default current_timestamp,
data text
);
然后就可以
db = web.database(dbn='postgres', db='mydatabase', user='myname', pw='')
store = web.session.DBStore(db, 'sessions')
session = web.session.Session(app, store, initializer={'count': 0})

cookies

设置

可以用 web.setcookie() 、web.cookies() 来设置和读取 cookies

参数:
web.setcookie(name, value, expires="", domain=None, secure=False)
  • name (string) - The actual name of the cookie, as stored by the browser, and returned to the server.
  • value (string) - The value you want stored under that name.
  • expires (int) - Optionally, is the time in seconds until the browser should expire the cookie. Note: this must be an integer, not a string.
  • domain (string) - The domain the cookie is valid for. By default, set to the host accessed, this allows you to set the domain, rather than just a host (such as .webpy.org).
  • secure (bool)- If True, require that the cookie only be sent over HTTP/S.
例子
class CookieSet:
def GET(self):
i = web.input(age='25')
web.setcookie('age', i.age, 3600)
return "Age set in your cookie"

读取

有两个方法读取 cookie
1. 当 cookie 不存在时抛出异常
web.cookies().get(cookieName) 
#cookieName is the name of the cookie submitted by the browser
2. 有预设值,避免异常
foo = web.cookies(cookieName=defaultValue)
foo.cookieName # return the value (which could be default)
#cookieName is the name of the cookie submitted by the browser
例子:

通过 web.cookies() 来访问

如果先前 web.setcookie() 设置了 age , 那可以这样读取

class CookieGet:
def GET(self):
c = web.cookies(age="25")
return "Your age is: " + c.age
上边的当没有 cookie 时会异常,如果要考虑没有 cookie 的情况,可以类似下边这样:
class CookieGet:
def GET(self):
try: 
return "Your age is: " + web.cookies().get('age')
except:
# Do whatever handling you need to, etc. here.
return "Cookie does not exist."
阅读(8351) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~