глобальный доступ к объектам через сеанс в web2py?

Я новичок в webdev, в эти дни планирую написать boradgame с web2py.

Когда я начал программировать, я обнаружил, что не могу легко использовать глобальные переменные.

для демонстрационных целей мне нужен доступ к объекту списка python для многих игроков, я использую sqlite, чтобы заставить его работать.

база данных (использование DAL('sqlite:memory:') не сработает), поэтому я пробую файл, он работает, как я и думал:

memdb = DAL('sqlite://storage.sqlite')
memdb.define_table('room', Field('card_on_desk', 'blob'))

создать комнату:

roomid = memdb.room.insert(card_on_desk=pickle.dumps(list()))
memdb.commit()

изменить поле card_on_desk комнаты:

record = memdb.room(roomid)
cards = pickle.loads(record.card_on_desk)
cards.append(','.join(c))
memdb(memdb.room.id==roomid).update(card_on_desk=pickle.dumps(cards))
memdb.commit()

Некоторые гуру сказали, что есть способ cache.ram(), и я хочу знать, как это сделать.

ждать ваших ответов.

S.Lott упомянул, что я не описывал, что происходит при использовании DAL('sqlite:memory:'):

используя sqlite:memory вместо 'sqlite://storage.sqlite', вставка memdb в http-запросе в порядке, но ничего не сохраняется, каждый раз, когда вы звоните, memdb.room.insert() возвращает время, которое я вызывал, и когда запрос завершен, в памяти ничего не сохраняется, memdb.room(1) всегда возвращает None.

Совет Энтони более полезен, я постараюсь использовать его таким образом, но это сложно сделать.


person Gohan    schedule 24.05.2011    source источник
comment
но не получится? Поскольку это не имеет смысла, вы будете вечно ждать ответов. Возможно, вам следует объяснить, но это не сработает.   -  person S.Lott    schedule 24.05.2011
comment
@ S.Lott кажется, вы меня неправильно поняли, извините за плохое описание. Я имею ввиду DAL('sqlite:memory:') не получится, файловый способ работает.   -  person Gohan    schedule 24.05.2011
comment
@Gohan: Похоже, ты меня неправильно понял. Извините за расплывчатость. не будет работать ничего не значит. Это бессмысленно. Это невозможно понять. Вы должны указать реальную ошибку, которую вы фактически получаете. Резюме (не сработает) неприемлемо. Факт (например, сообщение об ошибке) приемлем.   -  person S.Lott    schedule 24.05.2011
comment
Вы видели раздел книги по кешированию? Там должно быть довольно просто ? Кроме того, как правило, вам не нужно явно вызывать commit() — транзакции фиксируются автоматически в конце каждого запроса (см. здесь).   -  person Anthony    schedule 24.05.2011
comment
@S.Lott обновляет результат в вопросе, используя sqlite:memory. @ Энтони работает над этим, но все еще путается.   -  person Gohan    schedule 25.05.2011
comment
@Gohan: а ничего не спасает? Это на самом деле невозможно ни на чем сохранить. Во-первых, база данных :memory: является временной. Во-вторых, почему вы думаете, что memdb.room(1) что-нибудь найдет? Почему вы думаете, что идентификатор будет 1? С таким же успехом это может быть 0 или случайное число, назначенное SQLite. Значение roomid на самом деле может не быть 1.   -  person S.Lott    schedule 25.05.2011


Ответы (1)


Если вам не нужно сохранять информацию, вы можете использовать сеанс

session.myvariable

если вам нужно сохраниться и вы хотите ускорить работу с кешем, вы можете кэшировать выбор:

def cache_db_select():
    logs = db().select(db.log.ALL, cache=(cache.ram, 60))
    return dict(logs=logs) 
person Seb    schedule 25.06.2011