【问题标题】:Django with Apache : Global variable in view.pyDjango 与 Apache:view.py 中的全局变量
【发布时间】:2017-07-21 17:37:14
【问题描述】:

我需要一些帮助,我有一个具有经典用户管理功能的 Web 应用程序(帐户创建、登录、...)。我的问题是我试图在每个用户连接(登录)时为每个用户创建一个对象“UserObject”(不可序列化对象)的实例,该对象将用于处理某些视图中的用户请求,因此该对象必须是可以从任何视图访问,因为我在 view.py 中有一个全局字典“users_objects”,其中包含所有用户对象(字典键是用户名,值是“UserObject”对象),所以 view.py 看起来像这样:

from user_object import UserObject

users_objects = {}

def login(request):

    //login control and creation of session and context
    ......
    ......
    global users_objects
    user_name = request.session['name']
    users_objects[user_name] = UserObject()
    return render(request, 'mySite/home.html', context)

def request_view(request):

    param = request.GET.get('parameter', None)
    global users_objects
    user_name = request.session['name']
    obj = users_objects[user_name]
    res = obj.process(param)
    return HttpResponse(str(res))

这种方法适用于 django dev-server,但是当我使用真正的生产服务器 (apache) 配置 django 时,全局字典“users_objects”的内容消失了,我得到了一个空字典。请问,有谁知道为什么会这样??以及使用全局字典的最佳解决方案是什么 在django ?? 提前谢谢你

【问题讨论】:

    标签: python django apache dictionary


    【解决方案1】:

    发生这种情况的原因是 mod_wsgi 正在使用多个进程运行您的应用程序,每个进程都有自己的变量空间。

    但是没有充分的理由这样做。数据存储在数据库中,不要放在全局对象中。

    【讨论】:

    • 感谢您的回复,“UserObject”对象是不可序列化的对象,此外,当我实例化一个新的“UserObject”时,与远程服务器的连接已建立,我需要保持此连接处于活动状态处理用户请求,所以我无法将对象存储在数据库中
    • 好吧,这行不通。在多进程环境中,绝对不能保证您将获得最初创建对象的相同进程。你需要重新考虑你的结构;您可能需要将数据保存在本地数据库中,并在每次需要处理某些内容时与远程服务器建立短暂的连接。
    • 一个快速的方法,但不是丹尼尔解释的长期解决方案,是确保您使用 mod_wsgi 的守护程序模式。那使用一个过程。守护进程模式也是首选的部署机制。您不应该使用默认的嵌入模式。 blog.dscpl.com.au/2012/10/…
    • 感谢您的回复 Graham 这正是我所需要的,仅用于演示目的。
    • 那么如果 apache 与多个进程一起运行,这是否意味着每个进程都会获得 django 项目的单独实例?
    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多