Страницы

Поиск по вопросам

четверг, 7 марта 2019 г.

Сессия пользователя

Пишу небольшой проект на связке flask + tornado. На flask написан общий функционал (на данный момент авторизация + регистрация пользователей, также создана модель), на торнадо пытаюсь написать чат.
Как tornado научить понимать, под каким пользователем мы сейчас авторизованы, и от его имени писать в чат сообщения?
P.S. Если кто желает поучастовать в разработке данного проекта - милости прошу. Хочу сделать нечто для голосового общения в веб. Цель - получения опыта в подобного рода разработке.


Ответ

Очень интересный и актуальный вопрос для Tornado. Способов реализации много, торнадо тем и хорош что из коробки нет никакого навязанного решения, можно дать волю фантазии и заточить все максимально вкусно для своего проекта.
Предлагаю такой вариант (опускаю лишний код, чтобы показать только суть):
class BaseHandler(tornado.web.RequestHandler):
...
def get_current_user(self): user = None user_json = self.get_secure_cookie("mysite_cookie_user") if not user_json: return None logging.info("User ID:%s is get response", str(user_json)) try: user = tornado.escape.json_decode(user_json) except Exception: logging.info("Error get user cookie") return user
def get_visiter_settings(self): settings_json = self.get_secure_cookie("mysite_cookie_settings") try: cur_settings = tornado.escape.json_decode(settings_json) logging.info("Visiter settings:%s is get response from cookie.", str(cur_settings)) except Exception: logging.info("Error get settings from cookie.") logging.info("Init new cookie settings.") cur_settings = { "visitor_uuid": str(uuid.uuid4()), "option1": "foo",
...
"option10": "bar"} self.set_secure_cookie("mysite_cookie_settings", json.dumps(cur_settings)) logging.info("New cookie settings initialize.") finally: return cur_settings
class MainHandler(BaseHandler):
@tornado.web.asynchronous @tornado.gen.coroutine def get(self,*args, **kwargs): current_user = self.get_current_user() visiter_settings = self.get_visiter_settings()
Хеши сессий можно хранить например в Redis.
В хендлерах состояние сессий можно получать и обновлять по ключам сформированным от current_user и visiter_settings["visitor_uuid"].
Например, для гостей сессии определять по visitor_uuid, для авторизованных по current_user + можно их линковать к их уже существующей сессии по visitor_uuid.

Комментариев нет:

Отправить комментарий