@Sazoks

Как настроить аутентификацию и API в Flower?

Что мне нужно: Мне нужно через веб-интерфейс Flower иметь возможность следить за воркерами, останавливать, перезапускать их и в целом использовать всё API Flower, которое он предоставляет. При этом также требуется настроить аутентификацию во Flower, чтобы посторонний не имел доступа к этому сервису.

Проблема: Из-за кривизны Flower, если включить аутентификацию в самом Flower через --basic_auth, то тогда API Flower становится недоступно! На github'е все пишут, что это баг в самом Flower. Т.е. я не смогу просмотреть подробную информацию о воркере, не смогу перезапустить его через Flower, к примеру. Все это работает, если отключить аутентификацию через --basic_auth.

Что я пробовал: Немного подумав, я решил отключить --basic_auth во Flower и переложить эту задачу на сервис с Django-приложением. Мой Nginx проксирует запрос в Django, а уже Django в своей вьюшке проверяет необходимые права и проксирует запрос в сервис Flower. Ниже представлен код прокси-контроллера Flower.

import requests
from django.http import (
    HttpResponse,
    HttpRequest,
)
from django.http import HttpResponseForbidden
from rest_framework.views import APIView


class FlowerProxyAPI(APIView):
    """
    Эндпойнт для проксирования запросов к Flower.
    
    Т.к. при включенной аутентификации в Flower у него 
    не работает API'шка через веб-интерфейс, пришлось отключить 
    аутентификацию во Flower и перенести ее в Django-сервис.
    """

    def dispatch(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
        """Обработка всех запросов к Flower"""

        if not request.user.is_superuser:
            return HttpResponseForbidden(*args, **kwargs)

        response: requests.Response = requests.request(
            method=request.method,
            url='http://flower:5555' + request.get_full_path(),
            headers=request.headers,
            params=request.GET,
            data=request.POST,
        )

        return HttpResponse(
            content=response.content, 
            content_type=response.headers['content-type'],
            *args, **kwargs,
        )


Проблема такого подхода заключается в том, что эта штука работает очень нестабильно. Бывает, работает, бывает, выдает 404 ошибку, бывает content-type ему не нравится. Поэтому, сейчас у меня два варианта: либо полностью правильно сформировать запросы к Flower из контроллера Django, либо как-то настроить в самом Flower и --basic_auth, и API.

Вот ошибки, которые стали появляться сами собой при запросе к Flower:
  • Refused to apply style from '' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
  • Refused to execute script from '' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.
  • Uncaught ReferenceError: jQuery is not defined


Я действительно не знаю, в чем дело, т.к. все прекрасно работало несколько дней. Ничего не менял, просто Flower взял и отвалился.

Кто-нибудь сталкивался с такой проблемой? Если да, то как решали? Буду очень благодарен за любые ответы и подсказки!
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы