我有一个非常令人难以置信的问题,我的团队一直在努力解决它。我们确实缩小了范围,但不是100%。
介绍我们正在尝试用Vue前端在Django应用中实现LTI。为了从URL获取令牌,后端使用数据向URL发出POST
请求,并且如果它过期或无效,则应该接收令牌或错误。
浏览器---- POST请求——>查看Server (Django)
上的视图函数——POST REQUEST——>Auth URL
Django视图用504 Gateway Timeout
发出的post请求超时。如果服务器占用大量时间,这可能是正常的。然而,增加时间并没有帮助,并与POSTMAN检查了Auth URL,它工作正常,没有关闭。
What I have try
我们决定调试或诊断这个问题,为什么一个代码块在一个函数中工作,当它被一个shell调用,而不是当它被一个POST
请求调用。
- 取消了前端,使用
POSTMAN
向Django服务器发送POST
请求——Auth URL超时 - 使用
Django
调用相同的函数shell
——worked - 将代码复制到Django之外的一个单独的python文件中——worked
- 使用相同的虚拟环境
当一个POST函数被调用并且在它内部发出另一个POST请求时,它会超时。请注意:如果我在相同的情况下使用无效数据(例如缺少grant_type
)发出POST
请求,那么它不会超时。
auth_request = {
"grant_type": "client_credentials",
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
"client_assertion": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlJVbzNJWWlSR0ZDYUhNNEg0S2lid095enAtRU9KWlAweXkwd0g3bk5VOEEifQ.eyJpc3MiOiI2NjkxNmZmYy03YjE5LTQ0MWEtYjE5Zi0yOGQxMzVmYjZjOWYiLCJzdWIiOiI2NjkxNmZmYy03YjE5LTQ0MWEtYjE5Zi0yOGQxMzVmYjZjOWYiLCJhdWQiOiJodHRwczovL2RldmVsb3Blci5ibGFja2JvYXJkLmNvbS9hcGkvdjEvZ2F0ZXdheS9vYXV0aDIvand0dG9rZW4iLCJpYXQiOjE2NTMyODcyNzMsImV4cCI6MTY1MzI4NzMzOCwianRpIjoibHRpLXNlcnZpY2UtdG9rZW4tMDQyZTZhNjctNDA2My00YmQ1LWI2NmQtNTM4YjU2ZTllM2Q1In0.8Jaou965cPTCFv-7yP9iIlH8mMgQjAi0AR2li0KwCcRuHsRZ_1OpbE83bZ06RMXhbjA4crRqTI4zMi8aNfq16Mkg4lXoPj8JiJW7q8b_ZQ1rLZvIojmabehYjpyscHRitFPLibfTYF2mCjUyHqwPgnFRLNrHIVuSvM0BiK56PuYK6SiiSjxu2U3bmJqOHNW2mqx2YYfkaXx2u7ru6CKTiL3KBGzFPYjCUwwWNBdbz4R0g0aHK_l-hhA3oi_pCDZOyqdnyCmGAj5SpZbuZOqrZbQBrqPoEFtXdNDPpHGGwW7IUbbmCtsmE2NqQiYt6snmK-1pbxsLxE0mXrpDqASh4A",
"scope": "https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly",
}
response = requests.post(
"https://developer.blackboard.com/api/v1/gateway/oauth2/jwttoken",
data=auth_request,
)
response = response.json()
print(response)
经过几天的尝试,我们部署了Production
设置的项目,它工作了。在调查为什么它不能在登台工作时,我们发现了以下内容:
- 前端向后端发送POST请求
- 后端然后使用私钥编码数据并将其发送到第三方服务器
- 因为第三方服务器需要验证我们的
jwks
消息,它向我们的暂存服务器的URL发送了另一个请求。 第三个请求没有被处理,因为服务器只有一个线程。为
gunicorn
添加一个threads参数达到了目的gunicorn ripple.wsgi --reload --log-level debug --threads 4