我正在Django中开发一个应用程序,当你输入他们的steam ID时,它可以让你看到有关steam用户的信息。
我正在使用Django Steam API在这个链接中找到:https://pypi.org/project/django-steam-api/,不幸的是,没有提供一些文档/足够的帮助如何正确设置它。
我从那里跟着步骤走。安装pip包,将django-steam-api
添加到INSTALLED_APPS
元组,从他们的官方网站生成STEAM_API_KEY
(在"localhost"上,因为我的web应用程序目前没有托管),并通过应用当前迁移更新数据库。
我在backend/views.py
中有一个视图,(backend
是我用django-admin startapp backend
命令创建的应用程序名称),它从包含使用POST
方法的文本框steam_user_id
的表单中获取数据。
我试图从Steam获得关于id为steam_user_id
的用户的一切,但是当我在视图内调用方法时:
Player.objects.steam_create(steam_user_id)
(…)我在我的页面上收到以下错误:
IndexError在{{/link_to_my_view/-在这里手动替换它以避免并发症}}列表索引超出请求范围方法:POST请求URL: http://127.0.0.1:8000/profile/edit/版本号:3.2.7异常类型:IndexError异常值:list index超出范围异常地点:C:UsersmateaAppDataLocalProgramsPythonPython39lib网站 django_steam_api managers.py,在steam_create中的第21行可执行:C:UsersmateaAppDataLocalProgramsPythonPython39python.exePython路径:['E:gitgameprofile',"C: 用户 matea AppData 本地Python 程序 Python39 python39.zip","C: 用户 matea AppData 本地Python 程序 Python39 dll ',"C: 用户 matea AppData 本地Python Python39 lib 程序 ',"C: matea AppData 用户本地Python 程序 Python39 ',"C: 用户 matea AppData 本地Python 程序 Python39 lib 网站")服务器时间:周六,2021年10月30日22:09:37 +0000
Traceback指向包含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)