【问题标题】:How to re-initialize a session variable in a Django SessionWizardView如何在 Django SessionWizardView 中重新初始化会话变量
【发布时间】:2015-03-25 22:27:04
【问题描述】:

我正在使用 Djago SessionWizardView 将调查应用程序划分为多个页面。下面的代码旨在在每一步从PATH_ONE_IMAGES列表中随机选择一张图片,显示给用户,然后将其从列表中移除,这样就无法再次选择,直到所有图片都被选中走了。

这很好用,但是当我在同一个浏览器中重新访问调查时,PATH_ONE_IMAGES 仍然是空的,尽管我在开始时重新初始化了它。如果我删除浏览器历史记录或者每次使用它时使用不同的浏览器,它工作正常,但是当我使用相同的浏览器重新访问应用程序时,我不断收到以下错误。

/surveyone/ 处的索引错误

列表索引超出范围

我只是在学习如何使用会话变量,但我认为通过重新初始化 PATH_ONE_IMAGES 包含所有 9 个 jpg,就像我在下面的 SessionWizardView 顶部所做的那样,列表将是“重新-每次都填充”。

PATH_ONE_IMAGES = self.request.session.get('path_one_images', ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']) 

这不正确吗?

从下面的调试脚本中我可以看到,当我第一次使用“新”浏览器访问应用程序时,PATH_ONE_IMAGES 中存储了 9 个项目。

logger.debug('\n\nThis is the available list of PATH_ONE_IMAGES in 5: %s', PATH_ONE_IMAGES)

然后我随机选择其中一个PATH_ONE_IMAGES,将其显示给用户,然后将其从列表中删除。

first_image = random.choice(PATH_ONE_IMAGES)   
PATH_ONE_IMAGES.remove(first_image)               
context['display_image'] = first_image

我的问题是,当我再次使用同一个浏览器重新访问时,列表是空的,即使我在顶部重新初始化它。

问题:即使使用相同的浏览器,我如何在每次用户重新访问应用程序时重新填充我的PATH_ONE_IMAGES 列表?

如果我使用了错误的术语,我深表歉意,希望您能理解我的意思。

注意:由于an issue I had previously with using Global variables and Multi-threaded processing,我需要将PATH_ONE_IMAGES 存储为会话变量。

我的代码

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

        PATH_ONE_IMAGES = self.request.session.get('path_one_images', ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg'])        
        images = self.request.session.get('images', [])
        slider_DV_values = self.request.session.get('slider_DV_values', [])

        if step in range (5, 19):   
            self.request.session['path_one_images'] = PATH_ONE_IMAGES               

            self.request.session['images'] = images
            self.request.session['slider_DV_values'] = slider_DV_values

            if step == 5:
                logger.debug('\n\nThis is the available list of PATH_ONE_IMAGES in 5: %s', PATH_ONE_IMAGES)

                first_image = random.choice(PATH_ONE_IMAGES)   
                PATH_ONE_IMAGES.remove(first_image)               
                context['display_image'] = first_image                                 
                images.insert(0, first_image)   
                self.request.session['first_image'] = images[0] 
                self.request.session.get('first_image')                          


            elif step == 6:
                logger.debug('\n\nThis is the available list of PATH_ONE_Images in 6: %s', PATH_ONE_IMAGES)

                second_image = random.choice(PATH_ONE_IMAGES)   
                PATH_ONE_IMAGES.remove(second_image)
                context['display_image'] = second_image                                 
                images.insert(1, second_image)   
                self.request.session['second_image'] = images[1] 
                self.request.session.get('second_image')    
                ....
                ....

任何帮助,一如既往,非常感谢

【问题讨论】:

    标签: python django python-2.7 session-variables


    【解决方案1】:

    你应该只在向导的第一步初始化你的变量path_one_images

    ....
    
    step = int(self.steps.current)    
    if step == 0:
        self.request.session['path_one_images'] = ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']    
    
    PATH_ONE_IMAGES = self.request.session.get('path_one_images', [])        
    images = self.request.session.get('images', [])
    slider_DV_values = self.request.session.get('slider_DV_values', [])
    
    if step in range (5, 19):   
        # You don't need to reinit here your session variable
        # self.request.session['path_one_images'] = PATH_ONE_IMAGES               
    
    ....
    

    也许您需要对imagesslider_DV_values 变量采用相同的方法。

    【讨论】:

      【解决方案2】:

      实际上,当您使用未初始化的同一浏览器访问时,您实际上使用的是在 9th 步骤中保存的同一 PATH_ONE_IMAGES。发生这种情况是因为如果这行代码 -

      PATH_ONE_IMAGES = self.request.session.get('path_one_images', ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']) 
      

      请注意,get 仅在字典中不存在提供的键(第一个参数)时返回第二个参数,它既不检查值是什么,也不使用提供的默认值(第二个参数)初始化字典)。因此,使用此行代码,会话中 path_on_images 的值永远不会更新,它只会检查该值是否存在 - 它不会检查空值、无或其他任何内容。

      我将描述场景,你的情况发生了什么 -

      1. 当您第一次打开浏览器时,session 中没有任何内容。所以上面的代码第一次会在PATH_ONE_IMAGES里面分配['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']

      2. 一直持续到PATH_ONE_IMAGES 为空.. 没有错误..

      3. 现在您刷新了浏览器,但请记住 session 不会因为仅刷新浏览器而被清除,因此您在会话中保存的 PATH_ONE_IMAGE 不会被清除,因此包含一个空的项目列表在上一步保存。

      所以,当它是第一步时,你必须以某种方式清除变量。您可以获取@salvatore 提供的代码示例,并添加一个检查以仅在第 0 步对其进行初始化。

      step = int(self.steps.current)    
      if step == 0:
          self.request.session['path_one_images'] = ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']    
      
      PATH_ONE_IMAGES = self.request.session.get('path_one_images', [])        
      images = self.request.session.get('images', [])
      slider_DV_values = self.request.session.get('slider_DV_values', [])`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-29
        • 2010-09-24
        • 2020-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-21
        相关资源
        最近更新 更多