如何利用 WukooPy 进行Web 发布 ::-- ZoomQuiet [2005-07-16 07:05:19]
1. 建立一个wukoo_helloworld包
所有应用项目均以python包方式发布,在这里建立python包的方法很多,不再详述。用于测试,比较偷赖的方法是:
1)在系统site-packages子目录下建立wukoo_helloworld子目录
2)在wukoo_helloworld下建立一个init.py
这样我们就建立了一个wukoo_helloworld包,下面如不特指,一切操作均在wukoo_helloworld子目录下进行
2. 建立项目
2.1. 建立发布内容
增加一个helloword.py文件,内容:
1
2 def helloworld(wkp):
3 return 'Hello World'
这样我们就做了一个函数发布的页面,页面内容为Hello World,wkp参数为api调用入口
2.2. 制作页面发布接口
建立发布内容后,就要建立url调用逻辑,这种系统指定使用一个root函数,修改文件为
1
2 def helloworld(wkp):
3 return 'Hello World'
4
5 def root():
6 result=helloworld
7 return result
2.3. 制作项目发布接口
每个项目均应制作一个内容发布接口函数create_publisher,该函数调用不用的语法规则(使用不用的publisher),上页内容增加为:
1
2 def helloworld(wkp):
3 return 'Hello World'
4
5 def root():
6 result=helloworld
7 return result
8
9 from wukoopy.publish_wukoopy import Publisher ##使用publish_wukoopy发布
10 def create_publisher():
11 return Publisher(
12 root
13 )
wukoopy下内置quixote1,quixote2,wukoopy,karrigell四种发布方式,Publisher 参数为:
第一个参数:项目入口,每种publisher的入口形式均不一样,wukoopy为root函数
session_manager:为使用sessions,不加则不使用
config:配置文件
logger:log记录
**kwargs :其它配置
到此我们的项目基本做完了
2.4. 选择不同方式发布
在wukoo.server下有不同的server发布方式
1)选择simple方式
(1)在命令行下执行
python \*\*\simple_server.py --factory wukoo_helloworld.helloworld.create_publisher
(2)使用python程序
建立一个run_simple.py文件,内容
1 from wukoo_helloworld.helloworld import create_publisher
2 from wukoopy.server.simple_server import run
3 run(create_publisher)
运行后,访问http://localhost:8080/
2)选择cgi访问
建立一个run_cgi.cgi文件,并放在apache可以访问的地方
1 from wukoo_helloworld.helloworld import create_publisher
2 from wukoopy.server.cgi_server import run
3 run(create_publisher)
3)选择fast cgi访问
建立一个run_cgi.fcgi文件,并放在apache可以访问的地方(apache配置不详述)
1 from wukoo_helloworld.helloworld import create_publisher
2 from wukoopy.server.fastcgi_server import run
3 run(create_publisher)
4)选择xitami访问
建立一个run_xitami.py文件
1 from wukoo_helloworld.helloworld import create_publisher
2 from wukoopy.server.xitami_server import run
3 run(create_publisher,'helloworld')
5)选择mod_python访问
配置apache.conf
<LocationMatch "^/helloworld(/|$)"> SetHandler python-program PythonHandler wukoopy.server.mod_python_handler PythonOption quixote-publisher-factory wukoo_helloworld.helloworld.create_publisher PythonInterpreter wukoo_helloworld.helloworld PythonDebug On </LocationMatch>
6)选择scgi方式
(略)
7)server下还用几种发布方式,参照上述进行。(有一些还是半成品,文件名中有todo)
3. 更多特性
3.1. 加入子页面
增加一个index,初步展示调用api的方法:
1
2 def index(wkp):
3 wkp.set_content_type("text/html")
4 result="<html><body>"
5 result+='<a href="/hello">Hello World</a><br><br>'
6 result+='</body></html>'
7 return result
8
9 def helloworld(wkp):
10 return 'Hello World'
11
12 def root():
13 result=index
14 result.hello=helloworld
15 return result
3.2. 发布一个静态目录
建立一个images子目录,并发布这个目录为/images
1
2 def index(wkp):
3 wkp.set_content_type("text/html")
4 result="<html><body>"
5 result+='<a href="/hello">Hello World</a><br><br>'
6 result+='</body></html>'
7 return result
8
9 def helloworld(wkp):
10 return 'Hello World'
11
12 import os.path
13 def images(dgn,*args):
14 return dgn.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
15
16 def root():
17 result=index
18 result.hello=helloworld
19 result.images=images
20 return result
3.3. 发布一个静态文件
在目录下放一个favicon.ico文件,并发布这个favicon,发布为/favicon.ico
1
2 def index(wkp):
3 wkp.set_content_type("text/html")
4 result="<html><body>"
5 result+='<a href="/hello">Hello World</a><br><br>'
6 result+='</body></html>'
7 return result
8
9 def helloworld(wkp):
10 return 'Hello World'
11
12 import os.path
13 def images(wkp,*args):
14 return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
15
16 def favicon(wkp):
17 return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
18
19 def root():
20 result=index
21 result.hello=helloworld
22 result.images=images
23 result.favicon_ico=favicon #使用扩展名为.ico
24 return result
3.4. 动态改态页面属性
增加一个函数包装函数_charsetGB2312,将index改为GB2312发布
1
2 def _charsetGB2312(fn):
3 '''函数包装函数,将页面设为gb2312'''
4 def _init(dgn,*args):
5 dgn.set_charset('gb2312')
6 return fn(dgn,*args)
7 return _init
8
9 #---------------------
10 def index(wkp):
11 wkp.set_content_type("text/html")
12 result="<html><body>"
13 result+='<a href="/hello">Hello World</a><br><br>'
14 result+='</body></html>'
15 return result
16 index=_charsetGB2312(index)
17
18 def helloworld(wkp):
19 return 'Hello World'
20
21 import os.path
22 def images(wkp,*args):
23 return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
24
25 def favicon(wkp):
26 return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
27
28 def root():
29 result=index
30 result.hello=helloworld
31 result.images=images
32 result.favicon_ico=favicon #使用扩展名为.ico
33 return result
3.5. 使用基本认证,设置页面访问权限
增加一个权限函数_baseAuth,将protect页面设置访问权限
1
2 def _charsetGB2312(fn):
3 '''函数包装函数,将页面设为gb2312'''
4 def _init(dgn,*args):
5 dgn.set_charset('gb2312')
6 return fn(dgn,*args)
7 return _init
8
9 def _baseAuth(dgn,func,realm='Protected'):
10 t=dgn.get_baseauth()
11 if t is not None and t==('1','1'):
12 result=None
13 else:
14 dgn.set_status(401)
15 dgn.set_charset('gb2312')
16 dgn.set_header('WWW-Authenticate', 'Basic realm="%s"' % realm)
17 result='密码虽然弱智,你还是访问不了'
18 return result
19 #---------------------
20 def index(wkp):
21 wkp.set_content_type("text/html")
22 result="<html><body>"
23 result+='<a href="/hello">Hello World</a><br><br>'
24 result+='<a href="/protect">你能进来算你牛</a><br><br>'
25 result+='<a href="http://1:[email protected]:8080/protect">都告诉密码了还能进不来</a><br><br>'
26 result+='</body></html>'
27 return result
28 index=_charsetGB2312(index)
29
30 def helloworld(wkp):
31 return 'Hello World'
32
33 def protect(wkp):
34 return '哈哈,你进来了'
35 protect._q_access=_baseAuth
36
37 import os.path
38 def images(wkp,*args):
39 return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
40
41 def favicon(wkp):
42 return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
43
44 def root():
45 result=index
46 result.hello=helloworld
47 result.images=images
48 result.protect=protect
49 result.favicon_ico=favicon #使用扩展名为.ico
50 return result
3.6. 动态构建和发布一个图形
增加msn函数,从远程获得图形文件并以/msn.jpg发布出去
1
2 def _charsetGB2312(fn):
3 '''函数包装函数,将页面设为gb2312'''
4 def _init(dgn,*args):
5 dgn.set_charset('gb2312')
6 return fn(dgn,*args)
7 return _init
8
9 def _baseAuth(dgn,func,realm='Protected'):
10 t=dgn.get_baseauth()
11 if t is not None and t==('1','1'):
12 result=None
13 else:
14 dgn.set_status(401)
15 dgn.set_charset('gb2312')
16 dgn.set_header('WWW-Authenticate', 'Basic realm="%s"' % realm)
17 result='密码虽然弱智,你还是访问不了'
18 return result
19 #---------------------
20 def index(wkp):
21 wkp.set_content_type("text/html")
22 result="<html><body>"
23 result+='<a href="/hello">Hello World</a><br><br>'
24 result+='<a href="/protect">你能进来算你牛</a><br><br>'
25 result+='<a href="http://1:[email protected]:8080/protect">都告诉密码了还能进不来</a><br><br>'
26 result+='<a href="/msn.jpg">这是俺的msn,zq老大做的,频繁访问他的网站会受不了</a><br><br>'
27 result+='</body></html>'
28 return result
29 index=_charsetGB2312(index)
30
31 def helloworld(wkp):
32 return 'Hello World'
33
34 def protect(wkp):
35 return '哈哈,你进来了'
36 protect._q_access=_baseAuth
37
38 import os.path
39 def images(wkp,*args):
40 return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
41
42 def favicon(wkp):
43 return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
44
45 def msn(wkp):
46 wkp.set_content_type('image/jpeg')
47 result=wkp.web.urlget(
48 'http://wiki.woodpecker.org.cn/moin/WukooPy/TouchAuthor?action=AttachFile&do=get&target=hui5774hot.png'
49 )
50 return result
51
52 def root():
53 result=index
54 result.hello=helloworld
55 result.images=images
56 result.protect=protect
57 result.favicon_ico=favicon #使用扩展名为.ico
58 result.msn_jpg=msn
59 return result
3.7. URL MAP处理
增加urlmap函数,用来作为缺省urlmap的处理函数,很简单,有*args参数即可
1
2 def _charsetGB2312(fn):
3 '''函数包装函数,将页面设为gb2312'''
4 def _init(dgn,*args):
5 dgn.set_charset('gb2312')
6 return fn(dgn,*args)
7 return _init
8
9 def _baseAuth(dgn,func,realm='Protected'):
10 t=dgn.get_baseauth()
11 if t is not None and t==('1','1'):
12 result=None
13 else:
14 dgn.set_status(401)
15 dgn.set_charset('gb2312')
16 dgn.set_header('WWW-Authenticate', 'Basic realm="%s"' % realm)
17 result='密码虽然弱智,你还是访问不了'
18 return result
19
20
21 #---------------------
22 def index(wkp):
23 wkp.set_content_type("text/html")
24 result="<html><body>"
25 result+='<a href="/hello">Hello World</a><br><br>'
26 result+='<a href="/protect">你能进来算你牛</a><br><br>'
27 result+='<a href="http://1:[email protected]:8080/protect">都告诉密码了还能进不来</a><br><br>'
28 result+='<a href="/msn.jpg">这是俺的msn,zq老大做的,频繁访问他的网站会受不了</a><br><br>'
29 result+='<a href="/urlmap/1/1/m/1.html">什么样的垃级,俺都照吃不误</a><br><br>'
30 result+='</body></html>'
31 return result
32 index=_charsetGB2312(index)
33
34 def helloworld(wkp):
35 return 'Hello World'
36
37 def protect(wkp):
38 return '哈哈,你进来了'
39 protect._q_access=_baseAuth
40
41 def urlmap(wkp,*args):
42 return '哈'+str(args)+',原来俺吃的是这个'
43
44
45 import os.path
46 def images(wkp,*args):
47 return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
48
49 def favicon(wkp):
50 return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
51
52 def msn(wkp):
53 wkp.set_content_type('image/jpeg')
54 result=wkp.web.urlget(
55 'http://wiki.woodpecker.org.cn/moin/WukooPy/TouchAuthor?action=AttachFile&do=get&target=hui5774hot.png'
56 )
57 return result
58
59 def root():
60 result=index
61 result.hello=helloworld
62 result.images=images
63 result.protect=protect
64 result.urlmap=urlmap
65 result.favicon_ico=favicon #使用扩展名为.ico
66 result.msn_jpg=msn
67 return result
3.8. 使用页面变量,设置页面访问权限
增加一个权限函数_formAuth,将formprotect页面设置访问权限
1
2 def _charsetGB2312(fn):
3 '''函数包装函数,将页面设为gb2312'''
4 def _init(dgn,*args):
5 dgn.set_charset('gb2312')
6 return fn(dgn,*args)
7 return _init
8
9 def _baseAuth(dgn,func,realm='Protected'):
10 t=dgn.get_baseauth()
11 if t is not None and t==('1','1'):
12 result=None
13 else:
14 dgn.set_status(401)
15 dgn.set_charset('gb2312')
16 dgn.set_header('WWW-Authenticate', 'Basic realm="%s"' % realm)
17 result='密码虽然弱智,你还是访问不了'
18 return result
19
20 def _formAuth(dgn,func):
21 if dgn.get_form('user')=='王二' and dgn.get_form('password')=='麻子':
22 result=None
23 else:
24 dgn.set_charset('gb2312')
25 result='只有王二有权进,去求他吧'
26 return result
27
28 #---------------------
29 def index(wkp):
30 wkp.set_content_type("text/html")
31 result="<html><body>"
32 result+='<a href="/hello">Hello World</a><br><br>'
33 result+='<a href="/protect">你能进来算你牛</a><br><br>'
34 result+='<a href="http://1:[email protected]:8080/protect">都告诉密码了还能进不来</a><br><br>'
35 result+='<a href="/msn.jpg">这是俺的msn,zq老大做的,频繁访问他的网站会受不了</a><br><br>'
36 result+='<a href="/urlmap/1/1/m/1.html">什么样的垃级,俺都照吃不误</a><br><br>'
37 result+='<a href="/form_protect">试试能不能进</a><br><br>'
38 result+='<a href="/form_protect?user=王二&password=麻子">只有王二才能进</a><br><br>'
39 result+='</body></html>'
40 return result
41 index=_charsetGB2312(index)
42
43 def helloworld(wkp):
44 return 'Hello World'
45
46 def protect(wkp):
47 return '哈哈,你进来了'
48 protect._q_access=_baseAuth
49 protect=_charsetGB2312(protect)
50
51 def form_protect(wkp):
52 return '哈哈,我王二麻子进来了'
53 form_protect._q_access=_formAuth
54 form_protect=_charsetGB2312(form_protect)
55
56
57 def urlmap(wkp,*args):
58 return '哈'+str(args)+',原来俺吃的是这个'
59
60
61 import os.path
62 def images(wkp,*args):
63 return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
64
65 def favicon(wkp):
66 return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
67
68 def msn(wkp):
69 wkp.set_content_type('image/jpeg')
70 result=wkp.web.urlget(
71 'http://wiki.woodpecker.org.cn/moin/WukooPy/TouchAuthor?action=AttachFile&do=get&target=hui5774hot.png'
72 )
73 return result
74
75 def root():
76 result=index
77 result.hello=helloworld
78 result.images=images
79 result.protect=protect
80 result.form_protect=form_protect
81 result.urlmap=urlmap
82 result.favicon_ico=favicon #使用扩展名为.ico
83 result.msn_jpg=msn
84 return result
暂时到这:)