Сеансы web.py: AttributeError: объект 'ThreadedDict' не имеет атрибута 'count'

Я просто запустил этот простой фрагмент кода, предоставленный вики, потому что я не мог заставить работать сеансы:

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. Я использую Убунту 12.04.


person Lucas Kauffman    schedule 17.05.2012    source источник
comment
Я получил эту ошибку, когда пропустил web.config.debug = False   -  person BennyMcBenBen    schedule 05.06.2013


Ответы (4)


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
person ThiefMaster    schedule 17.05.2012
comment
Разве это не делает инициализатор в строке session = web.session.Session(app, web.session.DiskStore('sessions'), initializer={'count': 0})? - person afaulconbridge; 24.08.2012
comment
Я задавался тем же вопросом. Какой смысл в инициализаторе, если нам нужно инициировать этот параметр сеанса? - person Razique; 31.12.2013

Хорошо, для уловки попробуйте...кроме, также я не уверен, что это лучший способ сделать это (совсем не чистый). Как было сказано ранее, конструктор сеанса предлагает способ инициализации переменной сеанса.

Я не совсем уверен, что мы можем полагаться на "пример очень простого сеанса".

Во-первых, у нас почти нет разъяснений о назначении различных переменных. Например, для чего нужен *db_parameter* dict?

И последнее, но не менее важное: он нуждается в серьезном обновлении. Предоставленный код просто не работал с реальной структурой. Просто нет web.ctx.session.

Кстати, я реализовал простой счетчик, как в примере. Отображаемая ошибка связана с радикальным изменением API сеанса. Вы не можете просто вызвать «счетчик» из своего сеанса. Это будет выглядеть примерно так: session.store.store_instance.get('counter') . Где store_instance — это либо полка, либо база данных. Как я уже сказал, официальная документация нуждается в серьезном обновлении.

Тем не менее, я заметил, что это не то же самое для строки документации. Чтобы прогрессировать, я запускаю Ipython и вижу все возможности, которые у меня есть. Я знаю, что это чистое предположение, но имена хороши, чтобы мы могли понять, что делать.

Я отправлю свой пример команде web.py, чтобы они могли обновить официальный документ.

person chaiyachaiya    schedule 06.10.2013

Пока мой запрос на вытягивание не будет принят на 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()
person chaiyachaiya    schedule 07.10.2013

Проблема в версии python. У меня была такая же проблема, и я решил ее, когда выполнил версию 2.7 Python. Просто выполните > python2.7 code.py, и сеансы работают отлично. Жаль, что документация к web.py очень плохая.

person Juan Antonio    schedule 19.08.2015