使用谷歌协议缓冲区在Django视图中怀疑csrf错误

时间:2014-06-18 04:34:56

标签: python django protocol-buffers bitcoin django-csrf

以下是proto file的链接。

花了很长时间试图找出信息编码方式的细节只是为了意识到如果我注释掉HttpResponse行我仍然在比特币中收到相同的internal server error消息发送测试存款时-qt客户端:

from django.views.decorators.csrf import csrf_exempt
from project import payments_pb2

@csrf_exempt
def protoresponse(request):
    x = payments_pb2

    xpo = x.Payment.FromString(request.body)

    xpa = x.PaymentACK()
    xpa.payment = xpo
    xpa.memo = 'success'

return HttpResponse(xpa.SerializeToString(), content_type="application/bitcoin-paymentack")

我看到此代码没有任何问题,但通信错误仍然存​​在,服务器错误"POST /protoresponse/ HTTP/1.1" 500 58538

我将调试代码放入脚本中以检查是否正在设置变量,并且它一直运行到xpa.memo = ''success',因此看起来HttpResponse()方法中出现错误。无论是那种还是某种东西都会阻碍回应。

怀疑它与 csrf 有关,如果没有@csrf_exempt装饰器,我会收到"POST /protoresponse/ HTTP/1.1" 403 2282错误。

非常感谢任何输入:)

2 个答案:

答案 0 :(得分:0)

我不知道是否还有csrf错误,但你确实有一个明显的错误:你没有实例化protobuff对象。

xpa = x.PaymentACK()   # note parens

还有其他错误:正如我在my previous answer中所示,xpa.payment也应该是一个类型为Payment的protobuff,而不是原始的http正文。我不知道你为什么要从那个答案中改变它。

答案 1 :(得分:0)

我设法让它使用ParseFromString()方法,如下所示:

from django.views.decorators.csrf import csrf_exempt
from project import payments_pb2

@csrf_exempt
def protoresponse(request):
    x = payments_pb2

    xpa = x.PaymentACK()
    xpa.payment.ParseFromString(request.body)
    xpa.memo = 'success'

return HttpResponse(xpa.SerializeToString(), content_type="application/bitcoin-paymentack")

问题在于我试图解码来自已退回的付款方式的信息。将对象转换为新实例化的付款方式'对象,然后编码将该信息转换为' PaymentACK.payment' (他们也很相似' 付款/付款'这也引起了一些混乱)。

它可以完美地工作,我可以使用:

x = payments_pb2

xpo = x.Payment.FromString(request.body)

xpa = x.PaymentACK()
xpa.payment.ParseFromString(xpo.SerializeToString())
xpa.memo = 'success'

但似乎没有理由做额外的工作。

@Daniel我知道你告诉我不要使用request.body,但是我打算在heroku上托管这个应用程序,他们根据我的理解收取cpu使用费,所以我试图尝试减少尽可能多的数据操作:)非常感谢你的帮助(在两种情况下),非常感谢,我现在更了解protobuffs:)