【问题标题】:dealing with web.py sessions with subapp?处理带有子应用程序的 web.py 会话?
【发布时间】:2013-04-12 08:43:06
【问题描述】:

我已阅读http://webpy.org/cookbook/sessions_with_subapp。 会话工作正常,而我 只有一个应用程序,但是当我创建一个子应用程序时,我遇到了错误〜,详情如下:

ma​​in.py:

import web
from sub import subapp
web.config.debug = False

urls = ("/sub",subapp,"/", "count",)

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

db = web.database(dbn='sqlite', db='./session.db')
store = web.session.DBStore(db, 'sessions')
session = web.session.Session(app, store, initializer={'count': 0})

def session_hook():
    web.ctx.session = session

app.add_processor(web.loadhook(session_hook))

class count:
    def GET(self):
        session.count += 1
        return str(session.count)

if __name__ == "__main__":
    app.run()

subapp.py:

import web

urls = ("/", "count",)

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

session = web.ctx.session

class count:
    def GET(self):
        session.count += 1
        return str(session.count)

尝试运行时出错:

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    from sub import subapp
  File "/tmp/session/sub.py", line 9, in <module>
    session = web.ctx.session
AttributeError: 'ThreadedDict' object has no attribute 'session'

【问题讨论】:

    标签: session web.py subapplication


    【解决方案1】:

    您不能简单地分配session = web.ctx.session,因为此行仅在应用程序初始化期间执行,而ctx 属性只能在请求时访问。您可以from web import ctx,然后在所有子应用中使用ctx.session 而不是session。

    subapp.py 示例:

    import web
    from web import ctx
    
    urls = (
        "/", "count",
    )
    
    subapp = web.application(urls, globals())
    
    class count:
        def GET(self):
            ctx.session.count += 1
            return str(ctx.session.count)
    

    【讨论】:

    • 您只能在控制器方法和 loadhooks 中使用ctx。
    猜你喜欢
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2011-07-26
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多