【问题标题】:"List index out of range" for Django Steam APIDjango Steam API 的“列表索引超出范围”
【发布时间】:2021-12-15 08:05:25
【问题描述】:

我正在 Django 中开发一个应用程序,当您输入 Steam 用户 ID 时,它可以让您看到有关他们的信息。

我正在使用在此链接中找到的 Django Steam API:https://pypi.org/project/django-steam-api/,不幸的是,它没有提供有关如何正确设置它的一些文档/足够的帮助。

我从那里按照步骤操作。安装了 pip 包,将django-steam-api 添加到INSTALLED_APPS 元组,从他们的官方网站(在“localhost”上,因为我的网络应用程序目前没有托管)生成了一个STEAM_API_KEY,并且还通过应用更新了数据库当前的迁移。

我在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/ - 在这里手动替换它以避免并发症}}列表索引超出范围请求 方法:POST 请求地址: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 行,在 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'] 服务器时间:2021年10月30日星期六22:09:37 +0000

Traceback 指向包含Player.objects.steam_create(list(steam_user_id)) 的代码行。

我做错了什么?我还尝试将steam_user_id 转换为列表(list(steam_user_id)),但还是不行。

有什么意见或解决方案吗?帮助将不胜感激。谢谢。

【问题讨论】:

  • 我建议你不要使用这个包,特别是如果你是唯一的用户(可能你是github.com/voblivion/django-steam-api)第二个如果你绝对需要使用这个可能会打开github中的问题会更合适

标签: python django pip


【解决方案1】:

该异常仅在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)

【讨论】:

    【解决方案2】:

    我建议你不要使用这个包,如果你是唯一的用户(可能是你),可能会出现问题,如果你绝对需要使用这个包,那么在 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 运行此代码时,它是否有效? 顺便说一下,只要阅读所有的包文件,它实际上真的很小,最好是在你的项目中实现和修复问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      相关资源
      最近更新 更多