如何在django中的不同视图函数中第二次使用一个变量

时间:2014-03-25 13:00:23

标签: python django

让我举个例子。我的views.py是这样的。

def view1(request):
  if request.method == 'POST':
    #gather form put in a list
    li=[form_value1,form_value2]
    #do something with li
    return HttpResponse()# Have to use HttpResponse
    # in that there is a link of view2 
 return render(request,'form.html',{})
def view2(request):
  #here i want to use li again

我可以将其视为全球

def view1(request):
  global li
  li=[form_value1,form_value2]

或者我可以像这样使用

li = []
def view1(request):
  li.append(form_value1)
def view2(request):
  #extract li 

在这两种情况下我都没有成功 所以请指导我。提前致谢

3 个答案:

答案 0 :(得分:2)

会话是实现这一目标的最简单方法:

def view1(request):

    if request.POST: 
        request.session['li'] = [form_value1,form_value2]
        return HttpResponse()

    return render(request,'form.html',{})

def view2(request):

    li = request.session['li']

    ...

https://docs.djangoproject.com/en/dev/topics/http/sessions/

答案 1 :(得分:1)

您需要在响应中将值传递回客户端,然后在请求第2页时再返回到服务器。这可以通过cookie,隐藏的表单字段,嵌入在Javascript或许多其他选项中完成。

有很多方法可以解决这个问题,但所有这些方法都要求您的服务器具有状态。

下一个最佳选择是会话的概念。这是一个具有有限生命周期的每用户存储空间(通常在每次请求来自该用户时延长至--20分钟)。您可以在那里存储特定于用户的变量。这减轻了线程问题并限制了浪费的服务器资源。客户端被赋予唯一ID(通常在cookie中),用于在服务器上查找其会话数据。有关详细信息,请参阅Django Sessions

如果您创建了一个全局变量,它将适用于您站点的所有用户,并且可以从多个线程访问(这意味着您需要了解所有常见的线程问题,如竞争条件)。

答案 2 :(得分:0)

将为每个请求重新创建

li,因为无状态的Web服务器的性质。每个视图都处理一个请求,因此下一个视图将无法使用。您可以使用memcached存储li的值并在另一个视图中检索它,或者您可以查看会话。