我刚刚运行了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。
答案 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的文档很差。