将变量传递给函数

时间:2013-08-08 18:28:15

标签: django python-2.7

我有一个模块,其中包含一个名为'edit'的视图函数和一个名为'handle_upload'的函数。

我想将两个变量值(在编辑函数中可用)传递给handle_upload函数,但我不知道如何,因为我没有在view函数中调用handle_upload函数,所以我可以不要将值作为参数传递。

为清楚起见:

# my_module.py

def edit():
    dynamic variable #1
    dynamic variable #2
    render_to_response(some_site.html, locals(), context_instance = RequestContext(request))

def handle_upload():
    # here is where I would want to get both variables. 

3 个答案:

答案 0 :(得分:2)

在我看来,你希望变量在两个单独的django服务器请求中可用 - 首先你要在用户进入edit视图时设置它们,然后你想在另一个中检索它们查看调用handle_upload

此处有两个选项,具体取决于您要传递的实际数据。

  • 将其传递给模板,并将其作为隐藏字段添加到编辑表单中。

这可能是最简单的方法,但请注意敏感数据。如果您不希望恶意用户查看(甚至编辑)此数据,请不要这样做。如果用户有不良意图,用户可以编辑隐藏的html字段。如果这些信息可能危及服务器的安全,请不要依赖此信息。

首先,我建议您使用render代替render_to_response,因为后者已过时,很快就会被弃用。 render确保您拥有RequestContext个对象,并要求第一个参数为实际的request对象:

render(request, 'some_site.html', locals())

然后在您的模板中,在表单内:

<input type='hidden' name='name1' value='{{ dynamic_variable_1 }}' />
<input type='hidden' name='name2' value='{{ dynamic_variable_2 }}' />

然后使用request.POST.get('name1')获取dynamic_variable_1等的值。

  • 使用会话中间件。

这样数据将保留在服务器上,甚至可以保留为Python对象,因此它处理各种对象(我认为,不是100%肯定)。

首先,确保'django.contrib.sessions.middleware.SessionMiddleware'位于您的settings.py中的MIDDLEWARE_CLASSES。默认情况下,如果您使用Django的startapp命令。

然后,在edit中执行以下操作:

request.session['name1'] = dynamic_variable1
request.session['name2'] = dynamic_variable2

然后在调用handle_upload的视图中,只需执行以下操作并将变量传递给handle_upload

dynamic_variable1 = request.session['name1']
dynamic_variable2 = request.session['name2']

答案 1 :(得分:0)

您有两种选择。

  • 使用global关键字
  • 声明您的两个变量是全局的
  • handle_upload接受两个参数,然后传递
  • 中的两个变量

如果您没有从edit()拨打电话,则表示您需要将两个变量从edit()返回到呼叫站点,然后将其从那里传递到handle_upload()

答案 2 :(得分:0)

您可以选择以下内容:

 dynamic variable #1
 dynamic variable #2

 def edit():
      global dynamic variable #1, dynamic variable #2
      render_to_response(… )

 def handle_upload():
       global dynamic variable #1, dynamic variable #2
      #… 

但是如果你是多线程的话,要小心全局变量。如果这样做,请考虑锁定; - )