Python2.7升级后游戏MongoDB/PostgreSQL配置及Unity登录报错求解
问题解答
配置相关疑问解答
- 疑问1:
th_frontend、e5e6af02519f110093d76dcc1f55b25d不是PostgreSQL的用户名和密码。这两个值是前后端服务内部通信的鉴权凭证,对应后端配置里的FRONTEND_USERNAME和FRONTEND_PASSWORD,前端调用后端接口时需要用这两个值做身份校验,和PostgreSQL的访问凭证无关。PostgreSQL的凭证是Frontend配置里DB_开头的四个参数。 - 疑问2:MongoDB找不到tdta库的原因:你当前的配置里
DB_开头的参数是PostgreSQL的连接配置,MongoDB的配置只有MONGODB_HOST和MONGODB_PORT两项,如果你的MongoDB开启了身份认证,现有配置没有传入MongoDB的用户名、密码和认证库,pymongo新版本默认不会自动完成认证,自然无法访问tdta库。另外还要检查MongoDB服务是否放开了10.0.0.1地址的访问权限、27017端口是否通、你使用的MongoDB账号是否有tdta库的访问权限。 - 疑问3:
BIND_ADDRESS = "0.0.0.0"表示前端服务监听服务器所有可用的网卡,不管是内网还是公网IP的请求都可以接收;BIND_PORT = 7071表示前端服务对外提供接口的端口为7071。注意后端配置里的FRONTEND_PORT当前写的是7070,和前端配置不匹配,需要修改为7071,否则前后端无法通信。
运行报错修复
报错1:TypeError: Unicode-objects must be encoded before hashing
这是Python2升级到Python3的典型语法兼容问题,Python3中字符串默认是Unicode类型,md5哈希只接受bytes类型输入。修改Frontend.py第915行的代码即可:
把
user = authenticate(db, request_dict["username"], md5(request_dict["password"]).hexdigest())
修改为
user = authenticate(db, request_dict["username"], md5(request_dict["password"].encode('utf-8')).hexdigest())
报错2:AttributeError: 'NoneType' object has no attribute 'user_id'
该报错是因为authenticate方法没有查询到对应用户,返回了None,后续代码没有做判空就直接访问了user.id属性,按以下步骤排查修复:
- 先检查Unity端发起请求时传的用户名是否正确:日志里显示的是
auth for user test1,但你说测试账号是user1,确认有没有传错用户名。 - 登录PostgreSQL的tdta库,执行
SELECT * FROM users WHERE username = 'user1',确认是否存在该用户记录,且密码字段存储的哈希值是否为ee11cbb19052e40b07aac0ca060c23ee(user密码的md5值)。 - 确认你调整后的PostgreSQL连接凭证(
DB_USERNAME、DB_PASSWORD等)是否有users表的查询权限。
额外优化点
开头的Secret key missing for non-string Cookie警告可以通过在Frontend配置中添加SECRET_KEY参数解决,设置一个任意复杂字符串作为session加密密钥即可。
内容的提问来源于stack exchange,提问作者zille
相关产品推荐
相关产品推荐

