Привет, я создал приложение aiohttp, которое функционирует как автономная система, выполняющая периодические задачи, и возвращает json и текстовые ответы для получения статуса операций и поддерживает получение триггеров для задач с использованием различных запросов GET, PUT и POST.
например. Я реализовал запрос GET для получения текущего текущего списка задач в виде ответа json.
Я хочу использовать пользовательский интерфейс responsejs в качестве интерфейса, который потребляет запросы моего приложения aiohttp. Это приложение для реагирования будет похоже на панель администратора для приложения aiohttp.
Я вижу здесь два архитектурных варианта -
Опция 1. встраивает приложение реакции в кодовую базу приложения aiohttp и заставляет aiohttp / gunicorn обслуживать весь проект как один сервер
option2. отдельный бэкэнд aiohttp с реакционным интерфейсом
Вместо того, чтобы использовать aiohttp для обслуживания статических файлов и html для приложения реакции, я хочу реализовать логическое разделение проблем, запустив приложение responsejs в отдельном контейнере докера со следующим ожидаемое поведение
Приложение React показывает, что серверная часть недоступна в компонентах пользовательского интерфейса, которые зависят от и извлекают данные из API, реализованного в серверной части aiohttp
Это также поможет интегрировать интерфейс реагирования с другими остальными API в моем стеке (например, докер), чтобы я мог создать полный интерфейс администратора для всего моего стека.
Мне не удалось найти краткий пример, который помог бы мне реализовать интерфейс реагирования с ленивой загрузкой для такого приложения (также необходимо понять, можно ли заставить это работать с push-запросами, когда приложение aiohttp вызывает приложение реагирования, чтобы избежать опроса )
Я полный новичок в мире JS, но много поработал над python, asyncio и aiohttp.
Вопросов -
выбрал ли я надежный вариант (вариант 2) и есть ли некоторые известные / распространенные проблемы чего я мог бы избежать с вариантом 1?
Пожалуйста, помогите мне с простым пошаговым примером или репозиторием рабочего кода о том, как создать интерфейс реагирования для моего приложения без необходимости слишком сильно менять мои обработчики aiohttp
Могу ли я добавить функциональность в свое приложение aiohttp, чтобы оно могло вызывать приложение реакции для отправки обновлений статуса, а не ждать, пока приложение реакции вызовет интерфейс в следующем опросе
я уверен, что вопросы раскрывают мой уровень незнания того, как это работает. Любая помощь очень ценится





Молчаливые отрицатели съели мой вопрос, так что вот кое-что, что я использую в качестве временной меры, пока не разберусь. Даже если бригада -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 и т. д.
как передавать данные из бэкэнда во фронтенд
Если вы согласны со статическим экспортом приложения React (в файлы HTML и JS), то, конечно, вы можете обслуживать их напрямую из aiohttp или даже из CDN, и вам не нужен Node.js во время производственного выполнения.
Мое личное предсказание (или, по крайней мере, желание :)) на 2019 год заключается в том, что появится веб-фреймворк, сочетающий бэкэнд Python с пользовательским интерфейсом Javascript React, чтобы получить максимальную отдачу от языков и экосистем.