django - 使基于存储函数的确认/回调系统在 django + nginx 中与多个进程一起工作
问题描述
我们的回调系统的工作原理是,在您需要更多用户输入的请求期间,您将运行以下命令:
def view(req):
# do checks, maybe get a variable.
bar = req.bar()
def doit():
foo = req.user
do_the_things(foo, bar)
req.confirm(doit, "Are you sure you want to do it")
由此,服务器将函数对象存储在字典中,并将 UID 作为键发送给客户端,其中将显示确认对话框。当按下 OK 时,另一个请求被发送到另一个视图,该视图查找存储的函数对象并运行它。
这适用于单个进程部署。但是对于 nginx,如果存在大于 1 的进程池,则另一个进程会收到确认请求,因此没有存储功能,无法运行。
我们已经研究了强制 nginx 对某些请求使用某个进程的方法,但还没有找到解决方案。
我们还研究了多处理库和 celery,但是似乎没有办法将预定义的函数发送到另一个进程。
当继续请求可能来自单独的进程时,任何人都可以提出一种允许我们存储函数以供稍后运行的方法吗?
解决方案
似乎没有充分的理由在这里使用定义为内联函数的回调。
网络是一个无状态的环境。您永远无法确定让同一台服务器连续处理两个请求,并且永远不应该编写代码来将数据存储在内存中。
相反,您需要将数据放入某种数据存储中。在这种情况下,会话是理想的场所;您可以将 ID 存储在那里,然后将用户重定向到从会话中弹出该键并在相关 ID 上运行进程的视图。同样,根本不需要内联函数。
推荐阅读
- python - 通过 subprocess.Popen 但不在 shell 中执行命令时获取权限被拒绝错误
- json - 如何简化深度嵌套 JSON 的编组
- python - AttributeError:“NoneType”对象在 tbody 中没有“find”属性
- sphinx - Sphinx(搜索) - 匹配关键字两次(三次等)的文档
- spring - Spring Boot 2、Spring Security 5 和 @WithMockUser
- next.js - 如何设置 next.js?
- php - 默认选择一个复选框
- amazon-web-services - AWS SES 电子邮件模板如何在单个命令中创建或更新?
- c# - 如何在 C# 中通过在标头中添加单个值和在正文中添加 json 数据来调用 rest api PUT 请求?
- docker - 位桶管道中的 Docker