Django代码在本地和服务器上表现不同

时间:2014-12-09 17:46:35

标签: python django django-forms django-views

这是一个古老的问题,我从来没有得到满意的答案,我决定在这里添加赏金,以便有人可能会兴趣并弄清楚发生了什么。

以下代码在本地运行正常,但是当我将其部署到服务器时,我一直收到以下错误。我认为问题在于images[1]位置没有值代码运行。但是,我不明白为什么这只发生在服务器而不是本地机器上。

  • 本地: OS X 10.9.5,Python 2.7.5,Django 1.6.2
  • 服务器: Ubuntu 12.04,Apache 2.2.22,mod_wsgi版本:3.3-4ubuntu0.1,Python 2.7.3,Django 1.6

error image

我在下面标记了### line 143 ###

This is related to a previous issue I was having关于在Django SessionWizardView中将数据从一个页面保存到下一个页面,建议我使用会话对象来存储我想要保留的数据,以便在以后的页面中使用。

images []
PATH_ONE_IMAGES =   ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg']


class SurveyWizardOne(SessionWizardView):                      

    def get_context_data(self, form, **kwargs):
        context = super(SurveyWizardOne, self).get_context_data(form, **kwargs)  
        step = int(self.steps.current)

        if step in range (5, 19):

            if step in (5, 6, 7):
                image = random.choice(PATH_ONE_IMAGES)   
                images.insert(step - 5, image)        

                PATH_ONE_IMAGES.remove(image)
                context['display_image'] = image

                if step == 5:
                    self.request.session['first_image'] = images[0] 
                    self.request.session.get('first_image', 'default_request_session_value') 

                elif step == 6:
                    self.request.session['second_image'] = images[1]  ### line 143 ###
                    self.request.session.get('second_image', 'default_request_session_value') 

                elif step == 7:        
                    self.request.session['third_image'] = images[2] 
                    self.request.session.get('third_image', 'default_request_session_value')

            elif step == 8:                 
                slider_value = self.request.POST.get('slider_value')
                if slider_value is not None:
                    slider_DV_values.insert(step - 5, slider_value)  

                context['first_image'] = self.request.session['first_image']
                context['second_image'] = self.request.session['second_image']
                context['third_image'] = self.request.session['third_image']                 
                context['first_slider'] = slider_DV_values[0]  
                context['second_slider'] = slider_DV_values[1]       
                context['third_slider'] = slider_DV_values[2] 


                ....

                ....

        return context 

如果有人能够解释为什么在部署中发生此错误而不是在本地发生并提供修复,那将非常感激。

谢谢,Deepend

2 个答案:

答案 0 :(得分:3)

我不擅长解释事情,但我会尝试一下。

关键问题是因为您在全球范围内定义了images列表。它在本地适用于您,因为您在local django development server下运行了单个进程。每个请求都共享相同的内存空间",在同一进程中访问相同的images变量。

当您将应用程序部署到服务器时,您正在进入多进程环境 - 简单来说,images的值不会在多个进程之间共享,因此,不同的请求之间不共享它。换句话说,您在不同的请求中插入不同的images列表:

不要使用全局变量,真的,请不要。

要解决此问题,您需要将images保留在其他位置 - 会话内或数据库中:

def get_context_data(self, form, **kwargs):
    context = super(SurveyWizardOne, self).get_context_data(form, **kwargs)  
    step = int(self.steps.current)

    images = self.request.session.get('images', [])

    ...

    self.request.session['images'] = images
    return context

答案 1 :(得分:0)

您可以添加try-except块以避免此错误破坏您的视图:

...

if step == 5:
    try:
        self.request.session['first_image'] = images[0] 
        self.request.session.get('first_image', 'default_request_session_value')
    except IndexError:
        # TODO: do something here to debug instead of passing
        # eg.: import pdb; pdb.set_trace(), so you will be able to debug it in the python console where you ran your app
        pass
elif step == 6:
    try:
        self.request.session['second_image'] = images[1]  ### line 143 ###
        self.request.session.get('second_image', 'default_request_session_value')
    except IndexError:
        # TODO: do something here to debug instead of passing
        # eg.: import pdb; pdb.set_trace(), so you will be able to debug it in the python console where you ran your app
        pass
# and so on

...

希望它能为您提供调查的线索!祝你好运!