Примеры внешнего интерфейса reactjs для backend aiohttp

Привет, я создал приложение aiohttp, которое функционирует как автономная система, выполняющая периодические задачи, и возвращает json и текстовые ответы для получения статуса операций и поддерживает получение триггеров для задач с использованием различных запросов GET, PUT и POST.

например. Я реализовал запрос GET для получения текущего текущего списка задач в виде ответа json.

Я хочу использовать пользовательский интерфейс responsejs в качестве интерфейса, который потребляет запросы моего приложения aiohttp. Это приложение для реагирования будет похоже на панель администратора для приложения aiohttp.

Я вижу здесь два архитектурных варианта -

Опция 1. встраивает приложение реакции в кодовую базу приложения aiohttp и заставляет aiohttp / gunicorn обслуживать весь проект как один сервер

option2. отдельный бэкэнд aiohttp с реакционным интерфейсом

Вместо того, чтобы использовать aiohttp для обслуживания статических файлов и html для приложения реакции, я хочу реализовать логическое разделение проблем, запустив приложение responsejs в отдельном контейнере докера со следующим ожидаемое поведение

  1. если конечная точка API aiohttp не работает, а приложение реагирования работает -

Приложение React показывает, что серверная часть недоступна в компонентах пользовательского интерфейса, которые зависят от и извлекают данные из API, реализованного в серверной части aiohttp

  1. если оба aiohttp и response работают, приложение React должно иметь возможность периодически вызывать различные обработчики aiohttp, необходимые для заполнения компонентов пользовательского интерфейса данными и отображения отзывчивого пользовательского интерфейса.

Это также поможет интегрировать интерфейс реагирования с другими остальными API в моем стеке (например, докер), чтобы я мог создать полный интерфейс администратора для всего моего стека.

Мне не удалось найти краткий пример, который помог бы мне реализовать интерфейс реагирования с ленивой загрузкой для такого приложения (также необходимо понять, можно ли заставить это работать с push-запросами, когда приложение aiohttp вызывает приложение реагирования, чтобы избежать опроса )

Я полный новичок в мире JS, но много поработал над python, asyncio и aiohttp.

Вопросов -

  1. выбрал ли я надежный вариант (вариант 2) и есть ли некоторые известные / распространенные проблемы чего я мог бы избежать с вариантом 1?

  2. Пожалуйста, помогите мне с простым пошаговым примером или репозиторием рабочего кода о том, как создать интерфейс реагирования для моего приложения без необходимости слишком сильно менять мои обработчики aiohttp

  3. Могу ли я добавить функциональность в свое приложение aiohttp, чтобы оно могло вызывать приложение реакции для отправки обновлений статуса, а не ждать, пока приложение реакции вызовет интерфейс в следующем опросе

я уверен, что вопросы раскрывают мой уровень незнания того, как это работает. Любая помощь очень ценится

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
0
2 171
2

Ответы 2

Молчаливые отрицатели съели мой вопрос, так что вот кое-что, что я использую в качестве временной меры, пока не разберусь. Даже если бригада -1 овладеет этим, по крайней мере, это поможет тому, кто пришел сюда из Google.

Я обнаружил, что этот проект - https://github.com/aio-libs/aiohttp_admin основан на этом проекте - https://github.com/marmelab/ng-admin, поэтому вы можете создать интерфейс администратора aiohttp с помощью Angular.

издатель ng-admin также выпустил https://github.com/marmelab/admin-on-rest - вот кое-что, что я пробовал с моими обработчиками aiohttp (вам понадобятся COR, если вы хотите следовать варианту 2, как это сделал я)

У aiohttp_admin есть открытая проблема с переходом на admin-on-rest https://github.com/aio-libs/aiohttp_admin/issues/359

поэтому я предполагаю, что это решит проблему для всех, кому нужна эта функциональность, и не является программистом reactjs

Это то, что я мог бы заставить работать (я все еще пытаюсь решить ошибки разбиения на страницы, мне нужно работать над настраиваемым restclient для моего приложения)

Приведенные ниже примеры должны помочь кому-то, кто имеет представление обо всем коде, который должен произойти, чтобы активный администратор мог разговаривать с вашим API aiohttp и как сериализовать ваши ответы. Используйте с осторожностью, это не работает на 100%

обработчик aiohttp -

async def get_limits(request):
    """
    ---
    description: This end-point lists task IDs.
    tags:
    - scheduler
    produces:
    - application/json
    responses:
        "200":
            description: successful operation returns task IDs
        "405":
            description: invalid HTTP Method
    """
    limits = copy(request.app.limits)
    pages = str(len(limits.keys()))
    response_ = serialize_limits(limits)
    return json_response(response_[0], headers = {
        "X-Total-Count": pages, "X-Content-Range": pages})

Сериализатор -

import toastedmarshmallow
from marshmallow import Schema, fields


class LimitSchema(Schema):
    """
    schema for scheduler limits
    """
    resource = fields.Str()
    limit = fields.Int()
    id = fields.Int()


class Limit(object):
    """
    model for scheduler limits
    """

    def __init__(self, resource, limit, id):
        self.resource = resource
        self.limit = limit
        self.id = id

    def __repr__(self):
        return '<Limit(resource = {self.resource!r})>'.format(self=self)


def serialize_limits(dict_):
    """
    output a serialized version of an input dict
    :param dict_:
    :return:
    """
    limits = []
    schema = LimitSchema(many=True)
    schema.jit = toastedmarshmallow.Jit
    id = 0
    for key, value in dict_.items():
        limits.append(Limit(resource=key, limit=value, id=id))
        id += 1

    return schema.dump(limits)

reactjs -

list.js -

import React from 'react';
import { List, Datagrid, TextField } from 'admin-on-rest';

export const Limitlist = (props) => (
    <List title = "Limits" {...props}>
        <Datagrid>
            <TextField source = "resource" />
            <TextField source = "limit" />
        </Datagrid>
        </List>
);

App.js

import React from 'react';
import { jsonServerRestClient, simpleRestClient, Admin, Resource} from 'admin-on-rest';
import myApiRestClient from './avionicsRestClient';
import { Limitlist } from './limits';
import Dashboard from './Dashboard';


const App = () => (
<Admin restClient = {myApiRestClient}>
<Resource name = "limits" list = {Limitlist} />
</Admin>
);

export default App;

Я бы сказал, что сочетание интерфейса Javascript с серверной частью Python является довольно частым случаем для больших команд, особенно при выполнении микросервисов на основе HTTP. Есть несколько стратегий, как справиться, например, аутентификация - шлюз API, токены JWT ...

В случае одного бэкэнда Aiohttp (напрямую доступного через HTTP, без проксирования через Node.js) и одного интерфейса Node.js - никаких микросервисов и т. д. - я сейчас занимаюсь таким проектом: pyladies-courseware, но он полностью WIP (но уже имеет реальные пользователи). Я также создал несколько примеров / демонстраций (в основном в качестве личных экспериментов): github.com/messa/aiohttp-nextjs-demo-chat, github.com/messa/redis-rpc-nodejs-python-demo

Области, вызывающие наибольшую головную боль, были:

  • аутентификация, файлы cookie, CORS, OAuth и т. д.

    • следует ли использовать один и тот же домен (источник) как для внутреннего, так и для внешнего интерфейса (требуется маршрутизация nginx или промежуточное ПО для проксирования)
  • как передавать данные из бэкэнда во фронтенд

    • как из бэкэнда в браузер, так и из бэкэнда в интерфейс Node.js (при выполнении SSR)
    • Я решил использовать GraphQL, чтобы упростить задачу (проще кодировать, но это еще одна технология, которую нужно изучить)
      • но это может не относиться к сценарию использования интерфейса администратора
      • GraphQL, Aiohttp и клиентские Apollo или Relay поддерживают веб-сокеты - для любых обновлений по запросу, уведомлений и т. д.

Если вы согласны со статическим экспортом приложения React (в файлы HTML и JS), то, конечно, вы можете обслуживать их напрямую из aiohttp или даже из CDN, и вам не нужен Node.js во время производственного выполнения.

Мое личное предсказание (или, по крайней мере, желание :)) на 2019 год заключается в том, что появится веб-фреймворк, сочетающий бэкэнд Python с пользовательским интерфейсом Javascript React, чтобы получить максимальную отдачу от языков и экосистем.

Другие вопросы по теме