Рендеринг шаблона с параметрами из другого приложения (микросервиса)
Я делаю веб-приложение с микросервисной архитектурой, и когда дело доходит до входа в систему, я хочу перенаправить успешно вошедшего пользователя на его приборную панель (которая находится на другом микросервисе). У меня проблема с передачей параметров, таких как: имя, фамилия, 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)