Рендеринг шаблона с параметрами из другого приложения (микросервиса)

Я делаю веб-приложение с микросервисной архитектурой, и когда дело доходит до входа в систему, я хочу перенаправить успешно вошедшего пользователя на его приборную панель (которая находится на другом микросервисе). У меня проблема с передачей параметров, таких как: имя, фамилия, email, токен

microservice 1 (views.py):

class SignInView(viewsets.ViewSet):
    def post(self, request):
        email = request.data['email']
        password = request.data['password']
        user = User.objects.filter(email=email).first()
        print(bool(user.is_coordinator))
        if user is None:
            messages.error(request, 'User not found. Please try again')
            return HttpResponseRedirect('/sign-in')

        if not user.check_password(password):
            messages.error(request, 'Invalid password. Please try again')
            return HttpResponseRedirect('/sign-in')

        payload = {
            'id': user.id,
            'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=60),
            'iat': datetime.datetime.utcnow()
        }

        token = jwt.encode(payload, 'secret', algorithm='HS256')

        response = Response()
        response.set_cookie(key='jwt', value=token, httponly=True)
        response.data = ({
            'jwt': token
        })

        if user.is_coordinator:
            return redirect('http://127.0.0.1:8001/dashboard-coordinator')
        else:
            return HttpResponseRedirect('http://127.0.0.1:8001/dashboard-employee', {'name': user.name, 'surname': user.surname, 'email': user.email, 'response.data': response.data})
...

microservice 2 (views.py):

class HomeView(viewsets.ViewSet):
    def get(self, request):
        return render(request, 'dashboard-employee.html', {'name': name, 'surname': surname, 'email': email, 'response.data': response.data})

Не работает то, что я включаю в микросервис 2. Как я могу получить и обработать параметры из микросервиса 1? Есть ли лучшее решение/подход?

Контекст Python этих двух микросервисов не является непосредственно общим, но он не был бы общим так, как это нужно микросервису 2 сейчас, даже если бы get() и post() находились в одном микросервисе. Отложим на мгновение в сторону микросервисы и HTTP и представим, если бы у нас были эти две функции рядом:

def post():
    name = 'First'
    surname = 'Last'
    return get()

def get():
    return name, surname

Мы получим ошибку NameError, потому что name и surname не существуют в области видимости функции get(). Итак, как мы можем это исправить? Мы могли бы установить какое-то глобальное состояние, но это не обязательно. Вместо этого мы можем передать некоторую информацию от post() к get():

def post():
    name = 'First'
    surname = 'Last'
    data = {'name': name, 'surname': surname}
    return get(data)

def get(data):
    return data['name'], data['surname']

Это, конечно, глупый пример, но, возможно, вы уже видите сходство между ним и вашим реальным кодом. На самом деле вы уже проделали работу в put() для передачи данных, теперь в get() вам нужно получить их обратно из request.query_params:

class HomeView(viewsets.ViewSet):
    def get(self, request):
        name = request.query_params['name']
        surname = request.query_params['surname']
        email = request.query_params['email']
        response_data = request.query_params['response.data']
        return render(request, 'dashboard-employee.html', {'name': name, 'surname': surname, 'email': email, 'response.data': response_data})

Или более просто,

class HomeView(viewsets.ViewSet):
    def get(self, request):
        return render(request, 'dashboard-employee.html', request.query_params)
Вернуться на верх