Страницы

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

воскресенье, 12 января 2020 г.

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

#python #веб_программирование #flask #tornado


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

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

P.S. Если кто желает поучастовать в разработке данного проекта - милости прошу. Хочу
сделать нечто для голосового общения в веб. Цель - получения опыта в подобного рода
разработке.
    


Ответы

Ответ 1



Очень интересный и актуальный вопрос для 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.

Ответ 2



Можно, например, по cookies Если у вас общая база логично передавать логин в secure_cookies. На этом принципе основана аутентификация tornado из коробки Про фласк не скажу, увы с ним не сталкивался, но думаю там есть что-то похожее или в крайнем случаем можно написать самому.

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

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