"detail": "Not Found" Error With Python Django REST API

У меня возникла проблема с созданным на Python Django REST API, который управляет загрузкой и получением файлов из и в SQL-базу данных Google Cloud. Я точно не знаю, что вызывает ошибку, но когда я запускаю его, он работает нормально, успешно подключается к базе данных и соединяется по адресу http://127.0.0.1:8000/, но всякий раз, когда я тестирую конечную точку, например http://127.0.0.1:8000/upload, он возвращает 404. { "detail": "Not Found" }

Когда запускается само приложение, оно выводит в консоль следующее сообщение:

Could not find platform independent libraries <prefix>
Could not find platform independent libraries <prefix>
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 18, 2024 - 19:03:09
Django version 5.0.6, using settings 'JurisScan_REST_API.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

Вот файлы проекта

asgi.py

"""
ASGI config for JurisScan_REST_API project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'JurisScan_REST_API.settings')

application = get_asgi_application()

settings.py

views.py

import base64

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.core.exceptions import ObjectDoesNotExist
from django.db import connection
from .models import UserFile
from .serializers import UserFileSerializer

class UploadFileView(APIView):
    def post(self, request):
        user_id = request.data.get('user_id')
        file = request.data.get('file')
        file_path = request.data.get('file_path')
        if not user_id or not file:
            return Response({'error': 'user_id and file are required'}, status=status.HTTP_400_BAD_REQUEST)

        # Save file to user's table
        table_name = f'user_{user_id}'
        with connection.cursor() as cursor:
            cursor.execute(
                f"CREATE TABLE IF NOT EXISTS {table_name} (file_name VARCHAR(255), file_path VARCHAR(255), file LONGBLOB)")
            cursor.execute(f"INSERT INTO {table_name} (file_name, file_path, file) VALUES (%s, %s, %s)",
                           [file.name, file_path, file.read()])

        return Response({'message': 'File uploaded successfully'}, status=status.HTTP_201_CREATED)


class GetUserFilesView(APIView):
    def get(self, request, user_id):
        table_name = f'user_{user_id}'
        with connection.cursor() as cursor:
            cursor.execute(f"SHOW TABLES LIKE '{table_name}'")
            if cursor.fetchone() is None:
                return Response({'error': 'User table does not exist'}, status=status.HTTP_404_NOT_FOUND)

            cursor.execute(f"SELECT file_name, file_path, file FROM {table_name}")
            files = cursor.fetchall()

            response_files = [
                {'file_name': file[0], 'file_path': file[1], 'file_content': base64.b64encode(file[2]).decode('utf-8')}
                for file in files]

            return Response({'files': response_files}, status=status.HTTP_200_OK)

urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('myapp.urls')),
]

REST_API/urls.py

from django.urls import path
from .views import UploadFileView, GetUserFilesView

urlpatterns = [
    path('upload/', UploadFileView.as_view(), name='file-upload'),
    path('get_user_files/<str:user_id>/', GetUserFilesView.as_view(), name='get-user-files'),
]

wsgi.py

"""
WSGI config for JurisScan_REST_API project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'JurisScan_REST_API.settings')

application = get_wsgi_application()

manage.py

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'JurisScan_REST_API.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

В вашем urls.py вы можете попробовать изменить path('api/', include('myapp.urls')), на path('api/', include('REST_API.urls')),? Похоже, что папка с урлами конечных точек называется "REST_API", а не "myapp".

Извините, я не могу комментировать, поэтому приходится публиковать ответ. Если это не сработает, я отредактирую ответ еще раз или удалю его.

Я действительно исправил это, это оказалось ошибкой с моей стороны, у меня был другой API, работающий на порту 8000, а django по умолчанию работает на 8000, поэтому мне просто нужно было изменить его, чтобы он работал на другом порту.

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