400. Это ошибка. Ваш клиент отправил неправильный или нелегальный запрос. Это все, что мы знаем - Google App Engine Django App

Я программировал API с помощью Django и djangorestframework для развертывания в Google App Engine. API по сути является реестром пакетов, поэтому с помощью API можно создавать, обновлять, получать и удалять пакеты.

Все конечные точки работают, кроме одной. Единственная конечная точка, которая не работает, это та, которая отображает постраничный список всех пакетов в онлайн реестре.

Все конечные точки работают, но по какой-то причине, когда я попадаю на определенную конечную точку '/packages/', GCP выдает мне ошибку

400. That’s an error.

Your client has issued a malformed or illegal request. That’s all we know

Когда я запускаю приложение локально на своем компьютере, все конечные точки работают отлично. Приложение перестает работать только для этого конкретного маршрута, когда я развертываю его на Google App Engine.Полезная нагрузка API должна быть:

[ { "Имя": "*" } ]

Я совершенно запутался в этом вопросе и буду благодарен за любую помощь.

VIEWS.py

URLS.py

from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.apiOverview),
    path('packages/', views.packages_middleware, name='packages_middleware'),
    path('package/<str:pk>', views.package_middleware, name='package'),
    path('package/', views.create_package_middleware, name='create'),
    path('package/byName/<str:name>', views.byName_middleware, name='byName')

]

MODELS.py

from django.db import models


# Create your models here.
class PackageData(models.Model):
    Content = models.TextField(blank=True, null=True)  # actual zip file
    URL = models.CharField(max_length=500, blank=True, null=True)  # url of package

    # class Meta:
    #     constraints = [
    #         models.CheckConstraint(
    #             name="%(app_label)s_%(class)s_content_or_url",
    #             check=models.Q(Content__isnull=True, URL__isnull=False) | models.Q(Content__isnull=False, URL__isnull=True)
    #         )
    #     ]


class PackageMetadata(models.Model):
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['Name', 'Version'], name='unique_package')
        ]

    ID = models.CharField(primary_key=True, max_length=50)
    Name = models.CharField(max_length=50)
    Version = models.CharField(max_length=50)


class Package(models.Model):
    Data = models.ForeignKey(PackageData, on_delete=models.CASCADE)
    Metadata = models.ForeignKey(PackageMetadata, on_delete=models.CASCADE)


class PackageRating(models.Model):
    BusFactor = models.DecimalField(max_digits=10, decimal_places=9)
    Correctness = models.DecimalField(max_digits=10, decimal_places=9)
    GoodPinningPractice = models.DecimalField(max_digits=10, decimal_places=9)
    LicenseScore = models.DecimalField(max_digits=10, decimal_places=9)
    RampUp = models.DecimalField(max_digits=10, decimal_places=9)
    ResponsiveMaintainer = models.DecimalField(max_digits=10, decimal_places=9)


class PackageQuery(models.Model):
    Name = models.CharField(max_length=50)
    Version = models.CharField(max_length=50)

Вы делаете GET вызов /packages/, который обрабатывается определением маршрута packages_middleware(request).

В этой функции у вас есть queries = request.data, а остальная часть вашей логики зависит от queries. В этом документе говорится, что request.data предназначена для POST, PATCH, PUT. Если это верно, то, похоже, именно здесь кроется ваша ошибка.

Вы можете поместить оператор печати непосредственно перед и после этой строки и посмотреть, печатает ли ваше приложение оператор после. Это поможет вам подтвердить, что проблема именно в этом.

Вы также должны вывести содержимое queries. Поскольку вы не отправляете тело GET-запроса, возможно, что остальная часть вашей логики не работает, потому что значение queries не соответствует ожидаемому.

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