Пишу небольшой проект на связке 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.
Комментариев нет:
Отправить комментарий