Самый простой способ - это использовать OpenID для аутентификации. После успешного ответа сервера тебе приходят некоторые данные пользователя, но их хранить не обязательно. БД можно не использовать, просто храни куку некоторое время.
Ну а если нужно хранить какие-то дополнительные данные - храни их в классовом поле некого класса.
class User(object):
clients = set() # можно использовать и список
# можно и словарь, чтобы быстро получать
# конкретного пользователя по какому-то ключу
def __init__(self, user=None, root=None, admin=None, moderator=None, **kwargs):
self.user = user
self.root = root
self.admin = admin
self.moderator = moderator
# Записываем в класс необходимые поля из kwargs
self.foo = kwargs.pop('foo', 'default_value')
def auth(self):
# тут аутентифицируем юзера
# данные, которые пришли в ответ, можно записать в поля класса
# после того, как всё записал, делай так:
self.clients.add(self) # добавляем подключившегося пользователя
# Этот массив/сет/словарь будет доступен из любого экземпляра этого класса
# и из самого класса тоже, например: [print(client) for client in User.clients]
# чтобы хранить данные между перезагрузкой сервера, можно использовать pickle:
import pickle
with open('foo.pickle', 'w') as f:
pickle.dump(f, User.clients)
# загружать так же:
with open('foo.pickle'. 'r') as f:
User.clients = pickle.load(f)
Вот простой пример, чтобы было яснее:
>>> class A(object):
... c = list()
... def __init__(self, **kwargs):
... self.__dict__.update(**kwargs)
... def save(self):
... self.c.append(self)
...
>>> a = A(a=1, b=2)
>>> a.save()
>>> b = A(a=[3, 4], foo={1, 2})
>>> b.save()
>>> A.c
[<__main__.A object at 0x7fd63603d0b8>, <__main__.A object at 0x7fd63603dc18>]
>>> pickle.dumps(A.c)
b'\x80\x03]q\x00(c__main__\nA\nq\x01)\x81q\x02}q\x03(X\x01\x00\x00\x00bq\x04K\x02X\x01\x00\x00\x00aq\x05K\x01ubh\x01)\x81q\x06}q\x07(X\x03\x00\x00\x00fooq\x08cbuiltins\nset\nq\t]q\n(K\x01K\x02e\x85q\x0bRq\x0ch\x05]q\r(K\x03K\x04eube.'
>>> A.c = []
>>> A.c = pickle.loads(b'\x80\x03]q\x00(c__main__\nA\nq\x01)\x81q\x02}q\x03(X\x01\x00\x00\x00bq\x04K\x02X\x01\x00\x00\x00aq\x05K\x01ubh\x01)\x81q\x06}q\x07(X\x03\x00\x00\x00fooq\x08cbuiltins\nset\nq\t]q\n(K\x01K\x02e\x85q\x0bRq\x0ch\x05]q\r(K\x03K\x04eube.')
>>> A.c
[<__main__.A object at 0x7fd63604ca58>, <__main__.A object at 0x7fd63604c908>]
>>> A.c[0].a
1
>>> A.c[1].a
[3, 4]