django - 摆脱 Django View 中的全局变量?

标签 django django-views

我创建了一个依赖全局变量的 Django 应用程序。它实际上是一种存储库对象,应该可供我的 view.py 中的所有函数使用。

从代码中可以看出,每个 View 函数都会修改 rp 全局变量。

查看.py

def index(request):
    global rp
    rp = repo.Repo()
    ...
    rp.function1()
    rp.function2()
    rp.attribute1 = value

    return render_to_response('result_pick.html',{'result_list': rp.parsed_output_data, 'input_file_name': rp.input_file_name }, context_instance = RequestContext(request))

def result(request):
    global rp
    rp.function3()
    local_atribute = rp.attribute1
    ....
    return render_to_response('result_show.html' ,{'rp':rp}, context_instance = RequestContext(request))

浏览了一下后,我的印象是,当多个用户访问该网页时,这会失败,因为他们会共享全局 rp,这会导致问题。

摆脱全局变量但仍然能够在两个函数中访问 rp 的首选解决方案是什么?

最佳答案

使用session框架;它在请求之间(以及您的 View 方法之间)保留对象。

设置完成后,就很简单:

def a_method(request):
   shared_obj = request.session.get('myobj',{}) # set dict as default
   shared_obj['key'] = 'val'
   request.session['myobj'] = shared_obj
   # your normal code
   return render(request,'sometemplate.html') # no need to pass 'shared_obj'

def b_method(request):
    shared_obj = request.session.get('myobj',{})
    if not shared_obj:
       # session was terminated, so initialize this object
       shared_obj['key'] = 'value'
     else:
       the_value = shared_obj['key']
       # or, use the below to set a default value for 'key' if it doesn't exist
       the_value = shared_obj.get('key','default')
     # etc.

关于django - 摆脱 Django View 中的全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12305023/

相关文章:

Django + Nginx + Uwsgi 查看Nginx默认页面然后运行在80端口

django - 覆盖 Django ModelForm 的 Clean_unique 方法

python - view.py 中的问题 : message error Invalid literal for int() with base 10

python - Django - 清理表单数据时出现 AttributeError 'User' 对象没有属性 'cleaned_data'

python - 在同一个应用程序中使用 django 信号是否合适

jquery - 当添加权限为 False 时,Django-grappelli 添加按钮在内联中可见

python - 当我在 Django 中提交表单集时,为什么它会在表单集中返回额外的 5 个字段?

python - Django 和具有多个外键的模型

Python - 准确显示 MySQL 数据库中的数据

python - Django 形式。如何从 initial_text 隐藏冒号?