2

我刚刚运行了 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

4 回答 4

3

session.count += 1等于session.count = session.count + 1所以session.count必须存在才能使其工作。

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

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

还有另一种方式,甚至显示在文档的非常简单的会话简单示例中:

try:
    s.click += 1
except AttributeError:
    s.click = 1
于 2012-05-17T12:31:17.433 回答
0

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

我不确定我们是否可以依赖“非常简单的会话简单示例”。

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

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

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

也就是说,我注意到这与文档字符串不同。为了取得进步,我启动了 Ipython,我看到了我所拥有的每一个可能性。我知道这纯粹是猜测,但命名很好,所以我们可以弄清楚该怎么做。

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

于 2013-10-06T15:48:38.657 回答
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()
于 2013-10-07T21:32:43.927 回答
0

问题是python版本。我有同样的问题,我在执行 2.7 版本的 python 时解决了它。只需执行 > python2.7 code.py ,会话就可以完美运行。可惜web.py的文档很差。

于 2015-08-19T10:16:48.660 回答