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
не соответствует ожидаемому.