web.py sessions:AttributeError:'ThreadedDict'对象没有属性'count'

时间:2012-05-17 12:28:34

标签: python web.py

我刚刚运行了wiki提供的这个简单的代码片段,因为我无法使会话正常工作:

import web
web.config.debug = False
urls = (
    "/count", "count",
    "/reset", "reset"
)
app = web.application(urls, locals())
session = web.session.Session(app, web.session.DiskStore('sessions'), initializer={'count': 0})

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

class reset:
    def GET(self):
        session.kill()
        return ""

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

但它导致了这个错误:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/web/application.py", line 237, in process
    return self.handle()
  File "/usr/local/lib/python2.7/dist-packages/web/application.py", line 228, in handle
    return self._delegate(fn, self.fvars, args)
  File "/usr/local/lib/python2.7/dist-packages/web/application.py", line 411, in _delegate
    return handle_class(cls)
  File "/usr/local/lib/python2.7/dist-packages/web/application.py", line 387, in handle_class
    return tocall(*args)
  File "temp.py", line 12, in GET
    session.count += 1
  File "/usr/local/lib/python2.7/dist-packages/web/session.py", line 71, in __getattr__
    return getattr(self._data, name)
AttributeError: 'ThreadedDict' object has no attribute 'count'

webpy与2.7.3不兼容吗?我在webpy的内部网络服务器上运行它。我正在使用Ubuntu 12.04。

4 个答案:

答案 0 :(得分:3)

session.count += 1等于session.count = session.count + 1,因此必须存在session.count才能生效。

添加以下检查以使其正常工作:

if 'count' not in session:
    session.count = 0
session.count += 1

还有另一种方法甚至可以在文档的very simple session simple example中显示:

try:
    s.click += 1
except AttributeError:
    s.click = 1

答案 1 :(得分:0)

对于尝试的伎俩好了...除了我也不相信这是最好的方法(根本不干净)。 如前所述,Session构造函数提供了一种初始化会话变量的方法。

我不确定我们是否可以依赖“very simple session simple example”。

首先,我们几乎没有任何关于各种变量的目的的解释。例如,* db_parameter * dict的目的是什么?

最后但并非最不重要的是,它需要一个严肃的更新。提供的代码根本不适用于实际框架。 根本没有 web.ctx.session

顺便说一句,我在示例中实现了一个简单的计数器。 您显示的错误是由于Session的API发生了重大变化。 你不能只从你的会话中调用“计数器”。 这样会更加模糊: session.store.store_instance.get('counter')。其中store_instance是一个架子或数据库。 就像我说的那样,官方文档需要认真更新。

那就是说,我注意到这与docstring不一样。为了进步我开始Ipython,我看到了我的每一个可能性。 我知道这是纯粹的猜测,但命名很好,所以我们可以弄清楚要做什么。

我会将我的示例提交给web.py团队,以便他们可以更新官方文档。

答案 2 :(得分:0)

在我的拉取请求被GitHub接受之前,我发布了代码片段,说明了使用简单的增量器:

import web
import shelve


urls = (
    '/add', 'counter',
    '/reset', 'reset'
)

shelf = shelve.open('session')
shelfStore = web.session.ShelfStore(shelf)
app = web.application(urls, globals())
s = web.session.Session(app, shelfStore)

class counter:        
    def GET(self):
        numberToAdd = web.input().get('number')
        if not numberToAdd:
            numberToAdd = 1
        try:
            print  numberToAdd
            s.store.shelf["count"] += int(numberToAdd)
        except Exception:
            s.store.shelf["count"] = 1
        return s.store.shelf.get("count")


class reset:
    def GET(self): 
        s.store.shelf.clear()

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

答案 3 :(得分:0)

问题是python版本。我有同样的问题,当我执行2.7版本的python时,我解决了它。只是做> python2.7 code.py和会话完美。 遗憾的是web.py的文档很差。