【问题标题】:Django Session Not Matching QueryDjango 会话不匹配查询
【发布时间】:2014-01-02 13:03:59
【问题描述】:

我想在不登录的情况下为用户订购服务。我正在使用session 来处理这个问题。用户在被重定向到第三方支付网站之前必须填写表格。

我编写了以下代码,它在开发服务器上运行良好。在 Chrome 和 Mozilla 上。部署到生产服务器后,我在 Chrome 上测试,它工作正常,但是当我在 Mozilla 上测试它时,它会带出这个错误:

DoesNotExist: Session matching query does not exist.

型号:

class Pay(models.Model):
    user=models.ForeignKey(User,blank=True, null=True)
    session=models.ForeignKey(Session)
    pub_date=models.DateTimeField()
    esell=models.ForeignKey(Esell)
    full_name=models.CharField(max_length=100)
    email_ad=models.EmailField(verbose_name="Email")
    phone_num=models.CharField(max_length=20)

    def __unicode__(self):
        return '%s %s' % (self.full_name, self.esell)

接受用户数据的视图

@csrf_exempt
def pay_dig(request,esellid):
    if request.method=="POST":
        form=PayForm(request.POST)
        if form.is_valid():
            data=form.cleaned_data
            newpayy=Pay(
                session=Session.objects.get(session_key=request.session._session_key),
                pub_date=datetime.datetime.now(),
                esell=Esell.objects.get(pk=esellid),
                full_name=data['full_name'],
                email_ad=data['email_ad'],
                phone_num=data['phone_num'])
            newpayy.save()
            return HttpResponseRedirect('/confirm_payment/')
        else:
            return HttpResponse('Go back and fill the form correctly')
    else:
        return render_to_response('pay.html',{'PayForm':PayForm},context_instance=RequestContext(request))

填写上述表格后重定向的视图

def confam_pay(request):
    return render_to_response('after_pay_form.html',{'newpayy':Pay.objects.filter(session=request.session._session_key).latest('id')},context_instance=RequestContext(request))

模板

<p><strong> Details</strong> </p>
  <p> Your Name is {{newpayy.full_name }} </p>
<p> Price: N{{ newpayy.esell.up_price }} </p>
<p>  Name Of Product: {{ newpayy.esell.up_name }} </p>
<input type='image'  src='image/file' alt='Make Payment' />

我错过了什么?还是有更好的方法来解决这个问题?

【问题讨论】:

标签: python django


【解决方案1】:

我不明白你在用这个会话做什么。会话不是您创建外键的东西 - 它们可能存储在 db 表中,但它们是与用户当前会话关联的临时数据。

与其将会话存储在 Pay 表中,不如将 Pay 模型的 ID 存储在会话中。

编辑

我不会尝试基于会话进行过滤,而是将支付 ID 列表存储在会话本身中。然后要显示购买,您只需按 ID 获取所有实例。

newpayy = Pay(...)
newpayy.save()
pay_list = request.session.setdefault('pay_list', [])
pay_list.append(newpayy.id)
request.session.modified = True

并取回值:

pay_ids = request.session.get('pay_list')
if pay_ids:
    pay_objects = Pay.objects.filter(pk__in=pay_ids)

不要忘记,无论您是按照我的方式还是按照您的方式进行操作,会话都是短暂的,并且对于长期存储而言并不可靠。如果用户登录或注销、清除他们的 cookie 或使用不同的机器,会话中的项目将会丢失。

【讨论】:

  • 如何在会话中存储 Pay ID? :(
  • 我之所以使用session,是因为用户必须付费后,从第三方支付网站重定向后,用户才能下载自己支付的内容。
  • @limelights 你想让我写什么博客?前一周我确实写了一些关于我相当晦涩的 AST 解析 vim 扩展的文章,我怀疑除了我之外的任何人都会感兴趣。有一段时间没有写过关于 Django 的文章了,尽管我在这里给出了答案,但目前我并没有真正每天使用它。不过,这种情况可能很快就会改变。
  • @picomon 你可以在保存后做request.session['pay_id'] = newpayy.id,然后当用户想要下载时从request.session['pay_id']取回ID。
  • 因此,根据您的回答,这意味着我应该从模型中删除会话, session=models.ForeignKey(Session) 和视图中的 this。 session=Session.objects.get(session_key=request.session._session_key)。支付后是否可以过滤用户提交的数据?
猜你喜欢
  • 2013-09-22
  • 2011-08-19
  • 2015-01-28
  • 2022-01-05
  • 2020-10-15
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多