Heroku : Ошибка сервера, Статус=(500), байт=403

#python #django #heroku #django-rest-framework

#питон #джанго #героку #django-rest-фреймворк

Вопрос:

Все в проекте работает, но у меня проблема только с этим запросом, и я не знаю, что это такое.

журналы 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()   

url-адреса:

 app_name = 'api' urlpatterns = [   path('',include(router.urls)),  path('player=lt;str:playergt;/matches',views.MatchesView)  ]   

Комментарии:

1. вам нужно добавить as_view() . так что views.MatchesView.as_view()

Ответ №1:

Возможно, это из более новой части django, с которой я не знаком, однако я думаю, что просто нужно что-то изменить:

 path('player=lt;str:playergt;/matches',views.MatchesView)  

Для этого:

 path('lt;str:playergt;/matches',views.MatchesView.as_view())  

И даже еще лучше:

 path('matches/lt;str:playergt;',views.MatchesView.as_view())  

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

matches/statistics например, или matches/lt;str:playergt;/statistics/

Добавляя player= , вы, по сути, делаете доступным URI yourserver.com/api/player=PlayerName/matches

Ретроспективно этот параметр НИКОГДА не был бы введен таким образом в этой части URL-адреса.

Параметры всегда добавляются в конце после ? и разделяются, amp; И, возможно, это на самом деле то, что вы хотите сделать, и в этом случае у вас не будет lt;str:playergt; части URL-адреса, а вместо этого вы позволите сценариям на стороне клиента добавлять эти параметры или пользователям API, в зависимости от того, что взаимодействует с вашим представлением.

В качестве бонусного раунда вам также не нужно этого делать queryset.filter().all() , потому .all() что это избыточно 🙂