@matlex
Влюблен в Python!

Flask API и Чат. Как реализовать, куда копать?

Выполняю тестовое задание.
Нужна подсказка в этапах и методах реализации чата, где в качестве бекенда выступает REST API реализованное на Flask-е.
Я как-то имел дело с апи на DRF(Django Rest Framwork), но работал чисто с бэкендом и апи. Там как-то было попроще - от клиента пришел запрос, сервер отправил ответ. И как-там работает фронтенд клиент меня особо не волновало. А тут мною же, по заданию должен быть реализован фронтенд-клиент так же на Flask-е.
Начал реализовывать, но что-то я запутался каким образом все это дело должно крутиться.
Сейчас у меня есть несколько вьюх. Но проблема в том, что они используют шаблоны для отображения страниц на клиенте. То есть всё смешалось в кучу и нет разделения клиента и апи бэкенда.

Например возьмем этап с регистрацией: есть адрес 127.0.0.1/register
При заходе на эту страницу отображается форма с полями. Далее после того как пользователь нажал на кнопку отправить, вьюха выполняет простую валидацию, заносит данные в БД, устанавливает клиенту куки с сессией и перенаправляет через редирект на главную страницу чата.
И всё бы ничего, но по заданию, всё должно быть немого не так. По идее клиент должен был отправить json с запросом на 127.0.0.1/api/register где сервер должен был что-то отправить в ответ. И далее уже что-то должно произойти.
Вот именно так бы хотелось реализовать данную задачу, но что-то совершенно не пойму каким образом реализовать такую работу фронта с апишкой.

На текущий момент код вьюх выглядит вот так pastebin.com/UGt8qPhU.
  • Вопрос задан
  • 2283 просмотра
Решения вопроса 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Чтобы сервер выдавал json, а не рендерил темплейты, достаточно просто возвращать через flask jsonify()

Вот например у меня так
from flask import jsonify

# Begin AJAX requests
@cart.route("/api/total")
def total():
    count = 0
    if "cart" in session:
        cart = session.get("cart")
        l = [int(i) for i in redis.hvals(getCartKey(cart))]
        count = sum(l)
        logger.debug('cart %s : %d', cart, count)
    data = calculateItems()
    data.pop("products")
    return jsonify(dict(count=count, **data))


Ну и описание jsonify из кода flask.
"""Creates a :class:`~flask.Response` with the JSON representation of
the given arguments with an `application/json` mimetype. The arguments
to this function are the same as to the :class:`dict` constructor.

Example usage::

from flask import jsonify

@app.route('/_get_current_user')
def get_current_user():
return jsonify(username=g.user.username,
email=g.user.email,
id=g.user.id)

This will send a JSON response like this to the browser::

{
"username": "admin",
"email": "admin@localhost",
"id": 42
}

For security reasons only objects are supported toplevel. For more
information about this, have a look at :ref:`json-security`.

This function's response will be pretty printed if it was not requested
with ``X-Requested-With: XMLHttpRequest`` to simplify debugging unless
the ``JSONIFY_PRETTYPRINT_REGULAR`` config parameter is set to false.

.. versionadded:: 0.2
"""


Что касается сообщений и их ожидания на стороне сервера, есть техника, называется long pooling, или использовать websocket (но к нему все тоже самое относится!"), и для реализации необходимо или запускать flask в режиме тредов app.run(threading=True), или использовать WSGI-враппер на основе gevent.
Как пример - https://bitbucket.org/jeunice/flask-ws-example/src...
и
https://github.com/sigilioso/long_polling_example
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@KIN1991
Python, PHP developer
Попробуй вот это, https://pypi.python.org/pypi/json-rpc/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы