2006年02月05日 星期日 11:01
由于 cherrypy 版本的更新,去掉了 cpg 模块,session也有些变化,因此一些模块无法兼容,cherryflow模块的更新很慢(怀疑有没有人在管),最近在学习 continuation 因此想尝试一下这个 cherryflow 自己动手修改了 cherryflow 中的 common.py #========== common.py ======== """ See docstring for flow decorator. """ #from cherrypy import cpg, cperror import cherrypy import gencopy import gentree _counter = 0 # this is the seed variable which assigns each flow a unique ID; internal back_button_error = not gencopy.can_copy_generators # should we not allow the back button or refreshes? # the following internal functions encompass most of the common # functionality between the two different decorators (flow and chunked_flow) def _get_flowid(): """ Internal. """ # first, give this flow an id and increment the counter global _counter flowid = _counter _counter += 1 return flowid def _check_resume(flowid, _resume): """ Internal. """ global back_button_error # if we can't copy generators, we should make sure the client doesn't abuse the back button and corrupt data # because previous resume point state will be corrupted. if _resume != cherrypy.session.get("flow_%d_lastresume" % flowid, 0) and _resume != 0 and back_button_error: print "Session Map: %s" % cherrypy.session.get("flow_%d_lastresume" % flowid, 0) print "_resume: %s" % _resume print "error: %s" % back_button_error # if we are not on the current resumepoint, and we aren't starting the flow again, and we should display errors... raise cherrypy._cperror.InternalError, "Please don't use the back button or refresh." # display the error cherrypy.session["flow_%d_lastresume" % flowid] = cherrypy.request.resume_id def _save_resumepoint(flowid, gen): """ Internal. """ cherrypy.session["flow_%d_%d" % (flowid, cherrypy.request.resume_id)] = gen # save the current resume point... def _get_gen(flowid, _resume, method, self): """ Internal. """ cherrypy.request.resume_id = _resume + 1 # generate the resume id for the current resume point _check_resume(flowid, _resume) # first, try to fetch the saved state from the last resume point gen = cherrypy.session.get("flow_%d_%d" % (flowid, _resume), None) if not gen or _resume == 0: gen = gentree.GeneratorTree(method(self)) # if there was no saved state, start the flow anew return gencopy.copy(gen) # copy the generator so the previous resume point's state remains untouched #===== end common.py ============ 修改其自带的 example.py 文件如下: #from cherrypy import cpg #from cherrypy.lib.filter import generatorfilter import cherrypy import cherryflow class MyController: def _miniflow(self, i, j): # miniflow exists to demonstrate generator trees yield "This is iteration %d. j = %d Next iteration j++" % (i, j, cherrypy.request.resume_id, cherrypy.request.resume_id) def index(self): j = 1 i = 0 while True: i += 1 yield self._miniflow(i,j) if int(cherrypy.request.paramMap.get("add", 0)) == 1: j += 1 index = cherrypy.expose(cherryflow.flow(index)) # py2.3 def chunked(self): yield "hello " yield "world " yield "Next" % cherrypy.request.resume_id yield cherryflow.SEND_AND_WAIT yield "goodbye " yield "world" yield cherryflow.SEND_AND_WAIT chunked = cherrypy.expose(cherryflow.chunked_flow(chunked)) if __name__ == "__main__": #cherryflow.back_button_error(True) cherrypy.root = MyController() cherrypy.config.update({'sessionFilter.on': True}) cherrypy.server.start() -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060205/82c58976/attachment.html
Zeuux © 2025
京ICP备05028076号