如何利用 WukooPy 进行Web 发布 ::-- ZoomQuiet [2005-07-16 07:05:19]

建立一个wukoo_helloworld包

所有应用项目均以python包方式发布,在这里建立python包的方法很多,不再详述。用于测试,比较偷赖的方法是:

1)在系统site-packages子目录下建立wukoo_helloworld子目录

2)在wukoo_helloworld下建立一个init.py

这样我们就建立了一个wukoo_helloworld包,下面如不特指,一切操作均在wukoo_helloworld子目录下进行

建立项目

建立发布内容

增加一个helloword.py文件,内容:

   1 def helloworld(wkp):
   2     return 'Hello World'

这样我们就做了一个函数发布的页面,页面内容为Hello World,wkp参数为api调用入口

制作页面发布接口

建立发布内容后,就要建立url调用逻辑,这种系统指定使用一个root函数,修改文件为

   1 def helloworld(wkp):
   2     return 'Hello World'
   3 
   4 def root():
   5     result=helloworld
   6     return result

制作项目发布接口

每个项目均应制作一个内容发布接口函数create_publisher,该函数调用不用的语法规则(使用不用的publisher),上页内容增加为:

   1 def helloworld(wkp):
   2     return 'Hello World'
   3 
   4 def root():
   5     result=helloworld
   6     return result
   7 
   8 from wukoopy.publish_wukoopy import Publisher ##使用publish_wukoopy发布
   9 def create_publisher():
  10     return Publisher(
  11         root
  12         )

wukoopy下内置quixote1,quixote2,wukoopy,karrigell四种发布方式,Publisher 参数为:

第一个参数:项目入口,每种publisher的入口形式均不一样,wukoopy为root函数

session_manager:为使用sessions,不加则不使用

config:配置文件

logger:log记录

**kwargs :其它配置

到此我们的项目基本做完了

选择不同方式发布

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

更多特性

加入子页面

增加一个index,初步展示调用api的方法:

   1 def index(wkp):
   2     wkp.set_content_type("text/html")
   3     result="<html><body>"
   4     result+='<a href="/hello">Hello World</a><br><br>'
   5     result+='</body></html>'
   6     return result
   7 
   8 def helloworld(wkp):
   9     return 'Hello World'
  10 
  11 def root():
  12     result=index
  13     result.hello=helloworld
  14     return result

发布一个静态目录

建立一个images子目录,并发布这个目录为/images

   1 def index(wkp):
   2     wkp.set_content_type("text/html")
   3     result="<html><body>"
   4     result+='<a href="/hello">Hello World</a><br><br>'
   5     result+='</body></html>'
   6     return result
   7 
   8 def helloworld(wkp):
   9     return 'Hello World'
  10 
  11 import os.path
  12 def images(dgn,*args):
  13     return dgn.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
  14 
  15 def root():
  16     result=index
  17     result.hello=helloworld
  18     result.images=images
  19     return result

发布一个静态文件

在目录下放一个favicon.ico文件,并发布这个favicon,发布为/favicon.ico

   1 def index(wkp):
   2     wkp.set_content_type("text/html")
   3     result="<html><body>"
   4     result+='<a href="/hello">Hello World</a><br><br>'
   5     result+='</body></html>'
   6     return result
   7 
   8 def helloworld(wkp):
   9     return 'Hello World'
  10 
  11 import os.path
  12 def images(wkp,*args):
  13     return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
  14 
  15 def favicon(wkp):
  16     return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
  17 
  18 def root():
  19     result=index
  20     result.hello=helloworld
  21     result.images=images
  22     result.favicon_ico=favicon   #使用扩展名为.ico
  23     return result

动态改态页面属性

增加一个函数包装函数_charsetGB2312,将index改为GB2312发布

   1 def _charsetGB2312(fn):
   2     '''函数包装函数,将页面设为gb2312'''
   3     def _init(dgn,*args):
   4         dgn.set_charset('gb2312')
   5         return fn(dgn,*args)
   6     return _init
   7 
   8 #---------------------
   9 def index(wkp):
  10     wkp.set_content_type("text/html")
  11     result="<html><body>"
  12     result+='<a href="/hello">Hello World</a><br><br>'
  13     result+='</body></html>'
  14     return result
  15 index=_charsetGB2312(index)
  16 
  17 def helloworld(wkp):
  18     return 'Hello World'
  19 
  20 import os.path
  21 def images(wkp,*args):
  22     return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
  23 
  24 def favicon(wkp):
  25     return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
  26 
  27 def root():
  28     result=index
  29     result.hello=helloworld
  30     result.images=images
  31     result.favicon_ico=favicon   #使用扩展名为.ico
  32     return result

使用基本认证,设置页面访问权限

增加一个权限函数_baseAuth,将protect页面设置访问权限

   1 def _charsetGB2312(fn):
   2     '''函数包装函数,将页面设为gb2312'''
   3     def _init(dgn,*args):
   4         dgn.set_charset('gb2312')
   5         return fn(dgn,*args)
   6     return _init
   7 
   8 def _baseAuth(dgn,func,realm='Protected'):
   9     t=dgn.get_baseauth()
  10     if t is not  None and t==('1','1'):
  11         result=None
  12     else:
  13         dgn.set_status(401)
  14         dgn.set_charset('gb2312')
  15         dgn.set_header('WWW-Authenticate', 'Basic realm="%s"' % realm)
  16         result='密码虽然弱智,你还是访问不了'
  17     return result
  18 #---------------------
  19 def index(wkp):
  20     wkp.set_content_type("text/html")
  21     result="<html><body>"
  22     result+='<a href="/hello">Hello World</a><br><br>'
  23     result+='<a href="/protect">你能进来算你牛</a><br><br>'
  24     result+='<a href="http://1:[email protected]:8080/protect">都告诉密码了还能进不来</a><br><br>'
  25     result+='</body></html>'
  26     return result
  27 index=_charsetGB2312(index)
  28 
  29 def helloworld(wkp):
  30     return 'Hello World'
  31 
  32 def protect(wkp):
  33     return '哈哈,你进来了'
  34 protect._q_access=_baseAuth
  35 
  36 import os.path
  37 def images(wkp,*args):
  38     return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
  39 
  40 def favicon(wkp):
  41     return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
  42 
  43 def root():
  44     result=index
  45     result.hello=helloworld
  46     result.images=images
  47     result.protect=protect
  48     result.favicon_ico=favicon   #使用扩展名为.ico
  49     return result

动态构建和发布一个图形

增加msn函数,从远程获得图形文件并以/msn.jpg发布出去

   1 def _charsetGB2312(fn):
   2     '''函数包装函数,将页面设为gb2312'''
   3     def _init(dgn,*args):
   4         dgn.set_charset('gb2312')
   5         return fn(dgn,*args)
   6     return _init
   7 
   8 def _baseAuth(dgn,func,realm='Protected'):
   9     t=dgn.get_baseauth()
  10     if t is not  None and t==('1','1'):
  11         result=None
  12     else:
  13         dgn.set_status(401)
  14         dgn.set_charset('gb2312')
  15         dgn.set_header('WWW-Authenticate', 'Basic realm="%s"' % realm)
  16         result='密码虽然弱智,你还是访问不了'
  17     return result
  18 #---------------------
  19 def index(wkp):
  20     wkp.set_content_type("text/html")
  21     result="<html><body>"
  22     result+='<a href="/hello">Hello World</a><br><br>'
  23     result+='<a href="/protect">你能进来算你牛</a><br><br>'
  24     result+='<a href="http://1:[email protected]:8080/protect">都告诉密码了还能进不来</a><br><br>'
  25     result+='<a href="/msn.jpg">这是俺的msn,zq老大做的,频繁访问他的网站会受不了</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 msn(wkp):
  45     wkp.set_content_type('image/jpeg')
  46     result=wkp.web.urlget(
  47         'http://wiki.woodpecker.org.cn/moin/WukooPy/TouchAuthor?action=AttachFile&do=get&target=hui5774hot.png'
  48         )
  49     return result
  50 
  51 def root():
  52     result=index
  53     result.hello=helloworld
  54     result.images=images
  55     result.protect=protect
  56     result.favicon_ico=favicon   #使用扩展名为.ico
  57     result.msn_jpg=msn
  58     return result

URL MAP处理

增加urlmap函数,用来作为缺省urlmap的处理函数,很简单,有*args参数即可

   1 def _charsetGB2312(fn):
   2     '''函数包装函数,将页面设为gb2312'''
   3     def _init(dgn,*args):
   4         dgn.set_charset('gb2312')
   5         return fn(dgn,*args)
   6     return _init
   7 
   8 def _baseAuth(dgn,func,realm='Protected'):
   9     t=dgn.get_baseauth()
  10     if t is not  None and t==('1','1'):
  11         result=None
  12     else:
  13         dgn.set_status(401)
  14         dgn.set_charset('gb2312')
  15         dgn.set_header('WWW-Authenticate', 'Basic realm="%s"' % realm)
  16         result='密码虽然弱智,你还是访问不了'
  17     return result
  18 
  19 
  20 #---------------------
  21 def index(wkp):
  22     wkp.set_content_type("text/html")
  23     result="<html><body>"
  24     result+='<a href="/hello">Hello World</a><br><br>'
  25     result+='<a href="/protect">你能进来算你牛</a><br><br>'
  26     result+='<a href="http://1:[email protected]:8080/protect">都告诉密码了还能进不来</a><br><br>'
  27     result+='<a href="/msn.jpg">这是俺的msn,zq老大做的,频繁访问他的网站会受不了</a><br><br>'
  28     result+='<a href="/urlmap/1/1/m/1.html">什么样的垃级,俺都照吃不误</a><br><br>'
  29     result+='</body></html>'
  30     return result
  31 index=_charsetGB2312(index)
  32 
  33 def helloworld(wkp):
  34     return 'Hello World'
  35 
  36 def protect(wkp):
  37     return '哈哈,你进来了'
  38 protect._q_access=_baseAuth
  39 
  40 def urlmap(wkp,*args):
  41     return ''+str(args)+',原来俺吃的是这个'
  42 
  43 
  44 import os.path
  45 def images(wkp,*args):
  46     return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
  47 
  48 def favicon(wkp):
  49     return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
  50 
  51 def msn(wkp):
  52     wkp.set_content_type('image/jpeg')
  53     result=wkp.web.urlget(
  54         'http://wiki.woodpecker.org.cn/moin/WukooPy/TouchAuthor?action=AttachFile&do=get&target=hui5774hot.png'
  55         )
  56     return result
  57 
  58 def root():
  59     result=index
  60     result.hello=helloworld
  61     result.images=images
  62     result.protect=protect
  63     result.urlmap=urlmap
  64     result.favicon_ico=favicon   #使用扩展名为.ico
  65     result.msn_jpg=msn
  66     return result

使用页面变量,设置页面访问权限

增加一个权限函数_formAuth,将formprotect页面设置访问权限

   1 def _charsetGB2312(fn):
   2     '''函数包装函数,将页面设为gb2312'''
   3     def _init(dgn,*args):
   4         dgn.set_charset('gb2312')
   5         return fn(dgn,*args)
   6     return _init
   7 
   8 def _baseAuth(dgn,func,realm='Protected'):
   9     t=dgn.get_baseauth()
  10     if t is not  None and t==('1','1'):
  11         result=None
  12     else:
  13         dgn.set_status(401)
  14         dgn.set_charset('gb2312')
  15         dgn.set_header('WWW-Authenticate', 'Basic realm="%s"' % realm)
  16         result='密码虽然弱智,你还是访问不了'
  17     return result
  18 
  19 def _formAuth(dgn,func):
  20     if dgn.get_form('user')=='王二' and dgn.get_form('password')=='麻子'
  21         result=None
  22     else:
  23         dgn.set_charset('gb2312')
  24         result='只有王二有权进,去求他吧'
  25     return result
  26 
  27 #---------------------
  28 def index(wkp):
  29     wkp.set_content_type("text/html")
  30     result="<html><body>"
  31     result+='<a href="/hello">Hello World</a><br><br>'
  32     result+='<a href="/protect">你能进来算你牛</a><br><br>'
  33     result+='<a href="http://1:[email protected]:8080/protect">都告诉密码了还能进不来</a><br><br>'
  34     result+='<a href="/msn.jpg">这是俺的msn,zq老大做的,频繁访问他的网站会受不了</a><br><br>'
  35     result+='<a href="/urlmap/1/1/m/1.html">什么样的垃级,俺都照吃不误</a><br><br>'
  36     result+='<a href="/form_protect">试试能不能进</a><br><br>'
  37     result+='<a href="/form_protect?user=王二&password=麻子">只有王二才能进</a><br><br>'
  38     result+='</body></html>'
  39     return result
  40 index=_charsetGB2312(index)
  41 
  42 def helloworld(wkp):
  43     return 'Hello World'
  44 
  45 def protect(wkp):
  46     return '哈哈,你进来了'
  47 protect._q_access=_baseAuth
  48 protect=_charsetGB2312(protect)
  49 
  50 def form_protect(wkp):
  51     return '哈哈,我王二麻子进来了'
  52 form_protect._q_access=_formAuth
  53 form_protect=_charsetGB2312(form_protect)
  54 
  55 
  56 def urlmap(wkp,*args):
  57     return ''+str(args)+',原来俺吃的是这个'
  58 
  59 
  60 import os.path
  61 def images(wkp,*args):
  62     return wkp.StaticDirectory(os.path.join(os.path.dirname(__file__),'images'),*args)
  63 
  64 def favicon(wkp):
  65     return wkp.StaticFile(os.path.join(os.path.dirname(__file__),'favicon.ico'),mime_type='image/x-icon')
  66 
  67 def msn(wkp):
  68     wkp.set_content_type('image/jpeg')
  69     result=wkp.web.urlget(
  70         'http://wiki.woodpecker.org.cn/moin/WukooPy/TouchAuthor?action=AttachFile&do=get&target=hui5774hot.png'
  71         )
  72     return result
  73 
  74 def root():
  75     result=index
  76     result.hello=helloworld
  77     result.images=images
  78     result.protect=protect
  79     result.form_protect=form_protect
  80     result.urlmap=urlmap
  81     result.favicon_ico=favicon   #使用扩展名为.ico
  82     result.msn_jpg=msn
  83     return result

暂时到这:)

WukooPyQuickInto (last edited 2009-12-25 07:15:25 by localhost)