我有一个令人难以置信的问题,我的团队一直在努力解决它.我们确实缩小了范围,但不是100%.

介绍

我们正在try 在带有Vue前端的Django应用程序中实现LTI.要从URL获取令牌,后端会向URL发出一个包含数据的POST请求,如果令牌过期或无效,则应收到一个令牌或错误.

设计


浏览器----发布请求--->查看Server (Django)--POST请求上的函数-->Auth URL

问题


Django view发出的post请求超时为504 Gateway Timeout.如果服务器花费大量时间,这可能是正常的.然而,增加时间并没有帮助,并与postman 一起判断Auth-URL,它工作正常,没有停机.

What I have tried


我们决定调试或诊断这个问题,即为什么代码块在通过shell调用时在函数中工作,而在被POST请求调用时却不工作.

  1. 消除了前端,并使用POSTMAN向Django服务器发送POST请求—验证URL超时
  2. 使用Django shell调用相同的函数--已工作
  3. 将代码复制到Django之外的一个单独的python文件中
  4. 对以上所有内容使用相同的虚拟环境

What it appears to be


当调用一个POST函数并在其中发出另一个POST请求时,它就会超时.请注意:如果我在同样的情况下发出一个POST请求,并且数据无效(比如缺少grant_type),那么它不会超时.


代码块


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个设置的项目,并且成功了.在调查其为何无法进行登台时,我们发现以下情况:

  1. 前端向后端发送POST请求
  2. 后端然后使用私钥对数据进行编码,并将其发送到第三方服务器
  3. 因为第三方服务器需要验证我们的jwks条消息,所以它向登台服务器上的URL发送了另一个请求.
  4. 由于服务器只有一个线程,因此第三个请求没有得到解决.在gunicorn中添加一个threads参数就成功了

gunicorn ripple.wsgi --reload --log-level debug --threads 4

Python相关问答推荐

实现的差异取决于计算出的表达是直接返回还是首先存储在变量中然后返回

jit JAX函数中的迭代器

将HTML输出转换为表格中的问题

使用mySQL的SQlalchemy过滤重叠时间段

使用SciPy进行曲线匹配未能给出正确的匹配

将数据框架与导入的Excel文件一起使用

NP.round解算数据后NP.unique

实现自定义QWidgets作为QTimeEdit的弹出窗口

提取相关行的最快方法—pandas

计算分布的标准差

dask无groupby(ddf. agg([min,max])?''''

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

未调用自定义JSON编码器

numpy.unique如何消除重复列?

将标签移动到matplotlib饼图中楔形块的开始处

使用嵌套对象字段的Qdrant过滤

删除特定列后的所有列

如何在Python中自动创建数字文件夹和正在进行的文件夹?

如何为需要初始化的具体类实现依赖反转和接口分离?

用由数据帧的相应元素形成的列表的函数来替换列的行中的值