Heroku : Ошибка сервера, статус=(500), байты=403
Все в проекте работает, но у меня проблема только с этим запросом, и я не знаю, что это такое.
Журналыheroku:
2021-11-30T19:23:21.705472+00:00 app[web.1]: 10.1.43.186 - - [30/Nov/2021:19:23:21 +0000] "GET /api/player=1/matches HTTP/1.1" 500 145 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
2021-11-30T19:23:21.707787+00:00 heroku[router]: at=info method=GET path="/api/player=1/matches" host=football-players-stats-api.herokuapp.com request_id=e94d6c13-3fbd-4825-b696-282992be5bc9 fwd="186.58.74.102" dyno=web.1 connect=0ms service=27ms status=500 bytes=403 protocol=https
просмотров:
class MatchesView(generics.ListAPIView):
serializer_class = MatchesSerializer
permissions = (IsAuthenticated)
def get_queryset(self):
player = self.kwargs['player']
return Matches.objects.filter(player=player).all()
Урлы:
app_name = 'api'
urlpatterns = [
path('',include(router.urls)),
path('player=<str:player>/matches',views.MatchesView)
]
Возможно, это из более новой части django, с которой я не знаком, однако я думаю, что нужно просто изменить:
path('player=<str:player>/matches',views.MatchesView)
Для этого:
path('<str:player>/matches',views.MatchesView.as_view())
А еще лучше:
path('matches/<str:player>',views.MatchesView.as_view())
Третий вариант кажется более логичным в качестве url. Возможно, вам могут понадобиться другие url вокруг спичек.
matches/statistics
, например, или matches/<str:player>/statistics/
Добавляя player=
, вы, по сути, делаете доступный URI yourserver.com/api/player=PlayerName/matches
Ретроспективно этот параметр НИКОГДА не будет введен таким образом в этой части URL.
Параметры всегда добавляются в конце после ?
и разделяются &
И, возможно, это то, что вы хотите сделать, и в этом случае у вас не будет части URL <str:player>
, а вместо этого вы позволите скриптам на стороне клиента добавить эти параметры, или пользователям API, в зависимости от того, кто взаимодействует с вашим представлением.
В качестве бонусного раунда, вам также не нужно делать queryset.filter().all()
, потому что .all()
является избыточным :)