Микросервис с помощью django
я попытался переделать старый проект, чтобы посмотреть, смогу ли я заставить его работать как микросервис это приложение для чата
я разделил их на две части
- auth-сервис (который обрабатывает регистрацию, вход, контакты и электронную почту)
- chat сервис (который обрабатывает чат с контактами)
служба авторизации работает отлично но у меня проблемы с чатом, сначала позвольте мне отправить модели
class Message(models.Model):
sender_id = models.IntegerField() # Store user IDs instead of foreign keys
receiver_id = models.IntegerField()
message = models.TextField()
timestamp = models.DateTimeField(default=timezone.now)
is_read = models.BooleanField(default=False)
def __str__(self):
return f"Message from {self.sender_id} to {self.receiver_id} at {self.timestamp}"
поскольку я не могу ссылаться на внешний ключ, я использую integerfield
я также сделал пользовательское промежуточное ПО, которое проверяет токен, введенный при вызове конечной точки чата
class SimpleUser:
def __init__(self, user_id, email, full_name, is_active):
self.id = user_id
self.email = email
self.full_name = full_name
self.is_active = is_active
@property
def is_authenticated(self):
return True
@property
def is_anonymous(self):
return False
def __str__(self):
return f"{self.full_name} ({self.email})"
class AuthenticateJWTMiddleware:
AUTH_SERVICE_URL = "http://127.0.0.1:8800/api/auth/verify_token/"
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.path.startswith('/admin/'):
return self.get_response(request)
self.process_request(request)
response = self.get_response(request)
return response
def process_request(self, request):
print(f"Middleware Processing: Path={request.path}")
token = self.get_token_from_headers(request)
if not token:
print("No Authorization token found.")
request.user = AnonymousUser()
return
user = self.authenticate_token(token)
print(user)
if user:
print(f"Authenticated User: {user}")
request.user = user
else:
print("Token authentication failed")
request.user = AnonymousUser()
print(f"Request.user after middleware: {request.user}")
def get_token_from_headers(self, request):
auth_header = request.headers.get("Authorization")
if auth_header and auth_header.startswith("Bearer "):
return auth_header.split(" ")[1]
return None
def authenticate_token(self, token):
try:
response = requests.post(self.AUTH_SERVICE_URL, json={"token": token})
print("Auth Service Response:", response)
if response.status_code == 200:
data = response.json()
print("Response Data:", data)
user_id = data.get("id")
email = data.get("email")
full_name = data.get("full_name")
is_active = data.get("is_active")
if user_id:
return SimpleUser(user_id=user_id, email=email, full_name=full_name, is_active=is_active)
except requests.RequestException as e:
print(f"Auth Service request failed: {e}")
return None
это отправляет запрос в службу auth для проверки токена и возвращает данные пользователя
но теперь проблема в том, что я хочу отправить сообщение другому пользователю, используя эту конечную точку
api/chat/messages/{user_id}/ выдает ошибку
это views.py
class MessageView(APIView):
permission_classes = [IsAuthenticatedCustom]
authentication_classes = [JWTAuthentication]
def get_queryset(self, user_id):
print(f"Request user: {self.request.user}")
return Message.objects.filter(
sender_id=self.request.user.id, receiver_id=user_id
) | Message.objects.filter(
sender_id=user_id, receiver_id=self.request.user.id
)
def get(self, request, user_id):
print(f"GET method called with user: {request.user}, ID: {request.user.id}")
print(f"Retrieving messages for user ID: {user_id}")
messages = self.get_queryset(user_id=user_id)
for message in messages:
if message.receiver_id == request.user.id:
message.is_read = True
message.save(update_fields=['is_read'])
serializer = MessageSerializer(messages, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request, user_id):
print(f"Request user: {request.user}") # Check user info
data = {
"message": request.data.get("message"),
"receiver_id": user_id,
"sender_id": request.user.id,
}
serializer = MessageSerializer(data=data, context={'request': request})
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
он даже не выводит отладочное сообщение в представлениях
он просто бросает следующее { «detail": «Пользователь не найден», «code": «user_not_found» }
но middeware возвращает информацию о пользователе