#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()
что это избыточно 🙂