Python论坛  - 讨论区

标题:[python-chinese] Re: python的webapp讨论

2005年07月05日 星期二 17:57

Zoom Quiet zoom.quiet at gmail.com
Tue Jul 5 17:57:22 HKT 2005

呀呀呀?我看的双方邮件都正常的哪??
木头的浏览器有问题?

在 05-7-5,lihui<lihuimail at gmail.com> 写道:
> 怎么会这样,我用的是gmail啊
> 
> 在 05-7-5,limodou<limodou at gmail.com> 写道:
> > 乱码看不了。
> >
> > 在 05-7-5,lihui<lihuimail at gmail.com> 写道:
> > > python的数据库框架sqlobject还是相当不错,完全面向对象发布,以前做数据库,还得专门做个数据逻揖层,现在放在数据库类里就成拉,用起来比zodb和存储过程要爽多拉:)
> > >
> > > 在 05-7-5,lihui<lihuimail at gmail.com> 写道:
> > > > 简单做了一下karrigell的quixote发布接口,大家测一下
> > > > 条件:
> > > > 将karrigell放在karrigellLib,增加一个__init__.py,做为模块发布
> > > >
> > > > 程序代码:
> > > >
> > > > import urlparse
> > > > import sys
> > > > import os.path
> > > > import os
> > > > import time
> > > > from cStringIO import StringIO
> > > > import posixpath
> > > > import urllib
> > > > import string
> > > >
> > > > from quixote.publish import Publisher as _Publisher
> > > > import quixote.publish
> > > > from quixote.http_response import HTTPResponse as _HTTPResponse
> > > > from quixote.util import FileStream
> > > > from quixote.config import Config
> > > > from quixote.http_response import HTTPResponse
> > > > from quixote.logger import DefaultLogger
> > > >
> > > > #------------------------------------------------------
> > > >
> > > > my_k_config=dict(
> > > >     initFile='Karrigell.ini',
> > > >     PORT=8080,
> > > >     protectedDirs=['D:\\pythonMy\\KarrigellLib\\admin'],
> > > >     alias={'doc':'D:\\pythonMy\\KarrigellLib/doc','base':'D:\\pythonMy\\KarrigellLib'},
> > > >     globalScriptsList=['D:\\pythonMy\\KarrigellLib/myScript1.py','D:\\pythonMy\\KarrigellLib/myScript.py'],
> > > >     globalScripts=['myScript1','myScript'],
> > > >     extensions_map={'.gif':'image/gif','.jpg':'image/jpeg','.py':'text/html','.nwc':'application/nwc','.html':'text/html','.htm':'text/html'},
> > > >     debug=1,
> > > >     base='',
> > > >     persistentSession=False,
> > > >     silent=False,
> > > >     language='',
> > > >     ignore=['/favicon.ico'],
> > > >     serverDir=r'D:\pythonMy\KarrigellLib',
> > > >     #rootDir=r'D:\pythonMy\KarrigellLib',
> > > >     extensions=['gif','html','nwc','htm','py','jpg'],
> > > >     gzip=False,
> > > >     )
> > > >
> > > > import  KarrigellLib
> > > > m=os.path.dirname(os.path.abspath(KarrigellLib.__file__))
> > > > if m not in sys.path:
> > > >     sys.path.append(m)
> > > >
> > > > msave=sys.argv
> > > > sys.argv=[]
> > > > import k_config
> > > > sys.argv=msave
> > > >
> > > > for k,v in my_k_config.items():
> > > >     setattr(k_config,k,v)
> > > > k_config.serverDir=os.path.dirname(os.path.abspath(k_config.__file__))
> > > > if  not  k_config.alias.has_key('debugger'):
> > > >     k_config.alias['debugger']=os.path.join(k_config.serverDir,'debugger')
> > > > if not  k_config.alias.has_key('demo'):
> > > >     k_config.alias['demo']=os.path.join(k_config.serverDir,'demo')
> > > > if not  k_config.alias.has_key('fckeditor'):
> > > >     k_config.alias['fckeditor']=os.path.join(k_config.serverDir,'fckeditor')
> > > > if not  k_config.alias.has_key('doc'):
> > > >     k_config.alias['doc']=os.path.join(k_config.serverDir,'doc')
> > > > if not  k_config.alias.has_key('instant_site'):
> > > >     k_config.alias['instant_site']=os.path.join(k_config.serverDir,'instant_site')
> > > > if not  k_config.alias.has_key('components'):
> > > >     k_config.alias['components']=os.path.join(k_config.serverDir,'components')
> > > > if not  k_config.alias.has_key('listDirectory.pih'):
> > > >     k_config.alias['listDirectory.pih']=os.path.join(k_config.serverDir,'listDirectory.pih')
> > > > if not  k_config.alias.has_key('karrigell.css'):
> > > >     k_config.alias['karrigell.css']=os.path.join(k_config.serverDir,'karrigell.css')
> > > > if  not  k_config.alias.has_key('admin'):
> > > >     k_config.alias['admin']=os.path.join(k_config.serverDir,'admin')
> > > >
> > > > paths=[]
> > > > paths.append(os.path.join(k_config.serverDir,'databases'))
> > > > for v in paths:
> > > >     if v not in sys.path:
> > > >         sys.path.append(v)
> > > >
> > > > import SimpleHTTPServer, KarrigellRequestHandler, URLResolution,Template
> > > >
> > > > def list_directory(path,dirName):
> > > >     script = Template.getScript(os.path.join(k_config.serverDir,'listDirectory.pih'))
> > > >     return script.render({'path':path,'dirName':dirName}).value
> > > >
> > > > setattr(Template,'list_directory',list_directory)
> > > >
> > > > class QuixoteHandler(KarrigellRequestHandler.KarrigellRequestHandler,SimpleHTTPServer.SimpleHTTPRequestHandler):
> > > >     def __init__(self, request):
> > > >         self.response_status=(200,'OK')
> > > >         self.response_headers=[]
> > > >         self.request = request
> > > >         self.wfile = StringIO()
> > > >         fs=request.get_fields()
> > > >         self.headers=dict(request.environ.items())
> > > >         for item in self.headers.keys():
> > > >             if item.startswith("HTTP_"):
> > > >                 hd=item[5:]
> > > >                 self.headers[hd.lower()]=self.headers[item]
> > > >         self.command = self.headers['REQUEST_METHOD']
> > > >         self.body = {}
> > > >         if self.command == 'POST':
> > > >             self.body=fs
> > > >         self.client_address=(self.headers["REMOTE_ADDR"],0)
> > > >         self.path=self.path_without_qs=self.headers["PATH_INFO"]
> > > >         if self.headers.has_key("QUERY_STRING"):
> > > >             self.path+="?"+self.headers["QUERY_STRING"]
> > > >         self.request_version=self.headers["SERVER_PROTOCOL"]
> > > >         self.requestline="%s %s %s" %(self.headers["SERVER_PROTOCOL"],
> > > >             self.headers["REQUEST_METHOD"],self.path)
> > > >         try:
> > > >             self.handle_data()
> > > >         finally:
> > > >             sys.exc_traceback = None    # Help garbage collection
> > > >
> > > >     def send_response(self,status, reason=None):
> > > >         self.response_status=(status, reason)
> > > >     def send_header(self,key,value):
> > > >         self.response_headers.append((key,value))
> > > >     def end_headers(self):
> > > >         pass
> > > >
> > > > class Publisher(_Publisher):
> > > >
> > > >     def __init__(self, root_directory, logger=None,
> > > > session_manager=None,config=None, **kwargs):
> > > >         if config is None:
> > > >             self.config = Config(**kwargs)
> > > >         else:
> > > >             if kwargs:
> > > >                 raise ValueError("cannot provide both 'config' object and"
> > > >                                  " config arguments")
> > > >             self.config = config
> > > >         for k in my_k_config.keys():
> > > >             if hasattr(self.config,k.lower()):
> > > >                 setattr(k_config,k,getattr(self.config,k.lower()))
> > > >         if logger is None:
> > > >             self.logger = DefaultLogger(error_log=self.config.error_log,
> > > >                                         access_log=self.config.access_log,
> > > >                                         error_email=self.config.error_email)
> > > >         else:
> > > >             self.logger = logger
> > > >         if session_manager is not None:
> > > >             self.session_manager = session_manager
> > > >         else:
> > > >             from quixote.session import NullSessionManager
> > > >             self.session_manager = NullSessionManager()
> > > >
> > > >         if quixote.publish._publisher is not None:
> > > >             raise RuntimeError, "only one instance of Publisher allowed"
> > > >         quixote.publish._publisher = self
> > > >
> > > >         self.root_directory = root_directory
> > > >         if hasattr(root_directory,'__file__'):
> > > >             k_config.rootDir=os.path.dirname(os.path.abspath(root_directory.__file__))
> > > >         self._request = None
> > > >
> > > >     def try_publish(self, request):
> > > >         self.start_request()
> > > >         path = request.get_environ('PATH_INFO', '')
> > > >         assert path[:1] == '/'
> > > >         # split path into components
> > > >         path = path[1:].split('/')
> > > >         t=QuixoteHandler(request)
> > > >         request.response.set_status(t.response_status[0])
> > > >         for v in t.response_headers:
> > > >             request.response.set_header(v[0],v[1])
> > > >         output = t.wfile.getvalue()
> > > >         # The callable ran OK, commit any changes to the session
> > > >         self.finish_successful_request()
> > > >         return output
> > > >
> > > > 在 05-7-5,lihui<lihuimail at gmail.com> 写道:
> > > > > 我所设想的万能接口,正是为了简化和提供效能,将webapp开发的重头工作主要集中的语法规则的实现:
> > > > > 比如:
> > > > > cherrypy:对象发布
> > > > > karrigell:模块发布
> > > > > quixote:使用__q_exports等规则发布
> > > > >
> > > > > 而且使用万能接口还有其他好点:
> > > > > 1。发布简单,使用统一的发布规则,这样应用项目很容易选择mod_python,fastcgi等特定的方式发布
> > > > > 2。统一的底层api,比如get_request,get_header等等,方便在不用的语法规则下移植,满足原型开发及性能开发的移植要求
> > > > > 3。bug应该较少,比如karrigell原来在上载文件处理上的bug(limodou的blog上有)
> > > > >
> > > > > 4。将来可能很容易发布自已的语法规则。
> > > > >
> > > > > 在 05-7-5,March Liu<march.liu at gmail.com> 写道:
> > > > > > 呃,私下认为,技术上讲,我也不觉得这两个很成功,在微软系技术中,我喜欢ADO多过ODBC,至于J2EE……老实说关于它的争论太多了,不过后台硬,
> > > > > > 卖得好,这个不全是技术能决定的。当然J2EE的产品可以在各种J2EE平台实现上(基本)平滑的移植,使得用户可以根据需要选择自己会用、用的起的平台
> > > > > > 来支持工作。确实是因为存在一个标准而带来的好处。从这个角度看,有个不够好的统一接口,经常也是比没有统一接口好。至少,当开发者/用户需要可移植的技
> > > > > > 术时,可以有这样的选择。不需要时,也可以不用嘛。
> > > > > >
> > > > > >
> > > > > > 在05-7-5,River Yan <riverfor at gmail.com> 写道:
> > > > > > > 呵呵,也许这样吧
> > > > > > >
> > > > > > >
> > > > > > > 不过我个人的偏见,我不认为实现ODBC,J2EE的代码是成功的,个人偏见而已,大家不必对此争论。
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > On 7/5/05, March Liu < march.liu at gmail.com> wrote:
> > > > > > > >
> > > > > > 移植性和效率确实经常处于矛盾状态,但在一定条件下,效率上的牺牲换来可移植性也是值得的。举个例子,ODBC、J2EE,它们的成功都是源于以统一的标
> > > > > > 准提供高可移植性。如果有一个途径,使得同一个Python应用可以在不同的平台上平滑移植,那么,它必然可以吸引很多开发者和用户。对于开发者,他可以
> > > > > > 把自己的作品推销给使用不同平台的用户。对于用户,他可以为自己使用的产品挑选更适合自己的平台。
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > 在05-7-5,River Yan < riverfor at gmail.com> 写道:
> > > > > > > > > 这个移植性能带来什么应用上的优势呢?
> > > > > > > > >
> > > > > > > > > 我认为
> > > > > > > > > "万能"意味着失去效率和精简
> > > > > > > > >
> > > > > > > > > 谁愿意用低效的程序呢?如果有能够做同样的事情的程序。
> > > > > > > > > 谁愿意维护冗余的一个项目呢?
> > > > > > > > >
> > > > > > > > >
> > > > > > 我个人觉得在实际的工作中,移植性往往成为一种负担,当然,我们有必要考虑程序在不同操作平台的移植性,但没必要弄一个在一种平台上"通吃"的项目吧。
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > On 7/5/05, March Liu < march.liu at gmail.com > wrote:
> > > > > > > > > > 我想,良好的可移植性,应该可以算成一个优势吧,这在实际工作中往往是很重要的,可以极大地提高效率。
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > > 在05-7-5,River Yan <riverfor at gmail.com> 写道:
> > > > > > > > > >
> > > > > > > > > > > 万能的发布接口有什么优势??
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > > 支持那么多,那么是牺牲程序的精简性还是执行效率来达到对那么多咚咚的支持呢??
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > > 以上为在下的疑问
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > > On 7/4/05, lihui <lihuimail at gmail.com > wrote:
> > > > > > > > > > > > maillist谈论比较多的有三种:cherrypy,quixote,karrigell,
> > > > > > > > > > > > 试用了一下,感觉各有各的特点:
> > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > quixote:目前来说是最成熟的,代码结构是最好的,发布方式也最多,支持mod_python,fastcgi......,就是框架掌握上有点别扭
> > > > > > > > > > > >
> > > > > > cherrypy:完全面向对象的web发布,提供的最灵活的续开发播件,只是框架一直再改,底层api老在变,代码也很分散,比较怪异
> > > > > > > > > > > > karrigell:是最简单,最易掌握的开发框架,只是代码质量不太高,发布方式太少
> > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > 研究一下,感觉pythonweb框架多的原因也就是用python开发这个东东太简单了,造成有点想法思路就造个轮子,反而不如php就是依靠着apache大树成长。
> > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > 其实这些框架其核心代码也就100行左右,其他的都是http_request和session,http_response部分,全是重复的劳动,今天试了一下将karrigell语法转到quixote上,测了一下没什么问题
> > > > > > > > > > > >
> > > > > > > > > > > > 所以我想python
> > > > > > wehapp将来也许是基于wsgi做个万能的发布接口,支持apache,mod_python,fastcgi,iis等,将语法层发布的东东完全独立出来。
> > > > > > > > > > > >
> > > > > > > > > > > > 大家有没有兴趣就此做个开源项目。
> > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > > > > > > > --
> > > > > > > > > > > > my gmail:lihuimail(at)gmail.com
> > > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > > --
> > > > > > > > > > > riverfor's showtime.
> > > > > > > > > > > riverfor's game
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > > --
> > > > > > > > > > 欢迎访问:
> > > > > > > > > > http://blog.csdn.net/ccat
> > > > > > > > > >
> > > > > > > > > > 刘鑫
> > > > > > > > > > March.Liu
> > > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > --
> > > > > > > > > riverfor's showtime.
> > > > > > > > > riverfor's game
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > --
> > > > > > > > 欢迎访问:
> > > > > > > > http://blog.csdn.net/ccat
> > > > > > > >
> > > > > > > > 刘鑫
> > > > > > > > March.Liu
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > --
> > > > > > > riverfor's showtime.
> > > > > > > riverfor's game
> > > > > >
> > > > > >
> > > > > >
> > > > > > --
> > > > > > 欢迎访问:
> > > > > > http://blog.csdn.net/ccat
> > > > > >
> > > > > > 刘鑫
> > > > > > March.Liu
> > > > > >
> > > > >
> > > > > --
> > > > > my gmail:lihuimail(at)gmail.com
> > > > >
> > > >
> > > > --
> > > > my gmail:lihuimail(at)gmail.com
> > > >
> > >
> > > --
> > > my gmail:lihuimail(at)gmail.com
> > >
> >
> > --
> > I like python!
> > My Donews Blog: http://www.donews.net/limodou
> > New Google Maillist: http://groups-beta.google.com/group/python-cn
> >
> 
> --
> my gmail:lihuimail(at)gmail.com
> 


-- 
[Time is unimportant, only life important!]

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月05日 星期二 18:07

element element at zjip.com
Tue Jul 5 18:07:28 HKT 2005

退订!! 

  

======== 2005-07-05 18:00:38 您在来信中写道: ========

我不是大虾,如果你想帮忙的话请到http://wiki.woodpecker.org.cn/moin/JabberOrg



shiziliang 写道: 
请问大虾怎么组织?

你先写个方案,怎么样?
分析一下文档的规模,和需要的人手数,和修正方案


----- Original Message ----- 
From: "run_mei" <run_mei at 163.com>
To: <python-chinese at lists.python.cn>
Sent: Tuesday, July 05, 2005 9:29 AM
Subject: [python-chinese] xmpp ( jabber ) 中文翻译


  
大家好,我觉得即时通时技术是一个有趣的技术,而xmpp ( jabber )技术是唯一
的开源的协议,它有很多激动人心的特征,我对它有兴趣,但好象没有中文资料,
我想翻译它的英文文档,可是我的英文水平不高,所以我想找人帮我一起来翻译
它,我已经翻译了一点。我想找个地方把它共亨出来,同时请大家帮我将翻译错误
的地方纠正过来。
请问可不可在在www.woodpecker.org上建一个目录存放它。

_______________________________________________
python-chinese list
python-chinese at lists.python.cn
http://python.cn/mailman/listinfo/python-chinese

    
>

_______________________________________________
python-chinese list
python-chinese at lists.python.cn
http://python.cn/mailman/listinfo/python-chinese
  



= = = = = = = = = = = = = = = = = = = = = = 
        致
礼!

              element
              element at zjip.com
               2005-07-05
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050705/d8ec1a15/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号