"Индекс списка вне диапазона" для 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)
Вернуться на верх