"Индекс списка вне диапазона" для Django Steam API
Я работаю над приложением на Django, которое позволяет просматривать информацию о пользователе steam, если ввести его steam ID.
Я использую Django Steam API, найденный по этой ссылке: https://pypi.org/project/django-steam-api/, который, к сожалению, не предоставляет некоторой документации / достаточной помощи о том, как правильно настроить его.
Я следовал шагам оттуда. Установил пакет pip, добавил django-steam-api
в кортеж INSTALLED_APPS
, сгенерировал STEAM_API_KEY
с их официального сайта (на "localhost", потому что мое веб-приложение в данный момент не размещено на хостинге), а также обновил базу данных, применив текущие миграции.
У меня есть представление в backend/views.py
, (backend
- имя моего приложения, созданного с помощью команды django-admin startapp backend
), которое получает данные из формы, содержащей текстовое поле steam_user_id
, используя метод POST
.
Я пытаюсь получить все из Steam о пользователе с id steam_user_id
, но когда я вызываю внутри представления метод:
Player.objects.steam_create(steam_user_id)
(...) Я получаю следующую ошибку на моей странице:
IndexError at {{ /link_to_my_view/ - заменил его здесь вручную, чтобы избежать осложнений }} list index out of range Request Метод: POST URL запроса: http://127.0.0.1:8000/profile/edit/ Django Версия: 3.2.7 Тип исключения: IndexError Значение исключения: list index вне диапазона Исключение Местоположение: C:\Users\matea\AppData\Local\Programs\Python\Python39\lib\site-packages\django_steam_api\managers.py, строка 21, in steam_create Python Исполняемый файл: C:\Users\matea\AppData\Local\Programs\Python\Python39\python.exe Версия Python: 3.9.7 Путь Python: ['E:\git\gameprofile', 'C:\Users\matea\AppData\Local\Programs\Python\Python39\python39.zip', 'C:\Users\matea\AppData\Local\Programs\Python\Python39\DLLs', 'C:\Users\matea\AppData\Local\Programs\Python\Python39\lib', 'C:\Users\matea\AppData\Local\Programs\Python\Python39', 'C:\Users\matea\AppData\Local\Programs\Python\Python39\lib\site-packages']. Время сервера: Sat, 30 Oct 2021 22:09:37 +0000
.
Отслеживание ведет к строке кода, содержащей Player.objects.steam_create(list(steam_user_id))
.
Что я сделал не так? Я также попробовал преобразовать steam_user_id
в список (list(steam_user_id)
), но это все равно не сработало.
Есть мнения или решения? Помощь была бы очень признательна. Спасибо.
Я бы посоветовал вам не использовать этот пакет, могут возникнуть проблемы, особенно если вы единственный пользователь (а вы, вероятно, им являетесь). Во-вторых, если вам абсолютно необходимо использовать этот пакет, возможно, было бы правильнее открыть проблему на github. Если вы посмотрите исходный код, то увидите, что не так с этим Django Steam API. Метод, который выдает ошибку, находится здесь https://github.com/voblivion/django-steam-api/blob/master/django_steam_api/managers.py
На мой взгляд, это действительно ненужный пакет. Переменная STEAM_API_KEY может быть проблемой
def steam_query(self, url, params={}):
params['key'] = settings.STEAM_API_KEY
raw_data = requests.get(url, params)
data = raw_data.json()
return data['response']
Работает ли этот код, когда вы пытаетесь запустить его через shell? Кстати, просто прочитайте все файлы пакета, он на самом деле очень маленький, лучше всего было бы реализовать и исправить проблемы в вашем проекте.
Исключение возникает только в django-steam-api
, где get
запрос возвращает ответ типа {"players": []}
и в дополнение к этому api проверяет данные players
в нулевом индексе, что вызывает нижеприведенное исключение.
На нижней строчке :- https://github.com/voblivion/django-steam-api/blob/master/django_steam_api/managers.py#L21
Если вы хотите протестировать его локально, вы можете исправить код так :-
def steam_create(self, steam_id):
raw_data = self.steam_query(self.player_url, {'steamids': steam_id})
# add a small check here.
if 'players' in raw_data and raw_data['players']:
raw_data = raw_data['players'][0]
data = {
'id': raw_data['steamid'],
'username': raw_data['personaname'],
'profile': raw_data['profileurl'],
'avatar_small': raw_data['avatar'],
'avatar_medium': raw_data['avatarmedium'],
'avatar_large': raw_data['avatarfull'],
'state': raw_data['personastate'],
'is_public': raw_data['communityvisibilitystate'] == 3,
}
return self.create(**data)