Микросервис с помощью django

я попытался переделать старый проект, чтобы посмотреть, смогу ли я заставить его работать как микросервис это приложение для чата

я разделил их на две части

  1. auth-сервис (который обрабатывает регистрацию, вход, контакты и электронную почту)
  2. 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 возвращает информацию о пользователе

Вернуться на верх