【问题标题】:KeyError: Django Losing Session Data Between CBV RedirectsKeyError:Django 在 CBV 重定向之间丢失会话数据
【发布时间】:2013-08-09 16:53:38
【问题描述】:

当我在将数据(特别是条带客户数据)添加到然后添加到我的会话中的字典后重定向到另一个视图时,我在重定向视图中丢失了会话中的所有信息。因此,当我尝试弹出这些项目时遇到 KeyError。

有趣的是,当我将其他类型的信息放在我的 payment_data 字典中时,这不会发生,例如列表而不是客户对象。

我不确定解决此问题的最佳方法是什么,但鉴于我的设计,将客户信息获取到确认视图对我来说很重要,以便我可以

  1. 列表项
  2. 向用户显示客户信息以供确认(审查敏感信息
  3. 为卡充电

这是我的代码:

   class PaymentsCreateView(FormView):
       def form_valid(self, form):
        customer = stripe.Customer.create(description="""
            Non-registered user for applying features""")
        customer.save()

        payment_data = {
            'customer': customer
        }

        self.request.session['payment_data'] = payment_data
        self.request.session.modified = True

        import ipdb;ipdb.set_trace();

        return HttpResponseRedirect(reverse('payments_confirm'))

class PaymentsConfirmView(TemplateView):
    template_name = 'payments/confirm.html'

    def get_context_data(self, **kwargs):
        context = super(PaymentsConfirmView, self).get_context_data(**kwargs)

        context['payment_data'] = self.request.session.pop('payment_data')
        context['feature_data'] = self.request.session.pop('feature_data')

        return context

我仍在调试,下一步是确认问题是否在于我正在尝试存储客户对象而不是字典或列表对象,但也许 SO 上的某个人可以确认或提供正确的答案。

【问题讨论】:

  • self.request.session.pop()代替self.request.session.get()
  • 但是key本来就在session中不存在的,那我用什么方法获取数据有什么区别呢?

标签: python django stripe-payments django-sessions


【解决方案1】:

来自Python docs

list.pop([i])

删除列表中给定位置的项目,并将其返回。如果没有指定索引,a.pop() 会移除并返回列表中的最后一项。

就像 Rohan 说的,使用 get():

context['payment_data'] = self.request.session.get('payment_data', False)
context['feature_data'] = self.request.session.get('feature_data', False)

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多