使用google协议缓冲区的Django视图中疑似csrf错误

2024-06-17 08:41:15 发布

您现在位置:Python中文网/ 问答频道 /正文

这是指向proto file的链接。在

花了很长时间试图弄清楚信息是如何编码的,结果发现,如果我注释掉了HttpResponse行,那么在发送测试存款时,我的比特币qt客户端仍然收到相同的internal server error消息:

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错误。在

如有任何意见,我们将不胜感激:)


Tags: 代码fromimportrequest错误csrfsuccessmemo
2条回答

我设法用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")

问题是我试图将返回的“Payment”对象中的信息解码为新实例化的“Payment”对象,然后将该信息编码到付款确认付款'(它们也非常相似'Payment/Payment,这也造成了一些混乱)。在

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

^{pr2}$

但这似乎是无缘无故的额外工作。在

@Daniel我知道你告诉我不要使用request.body,但我计划在heroku上托管这个应用程序,它们按我理解的cpu使用量收费,所以我尽量减少数据操作:)非常感谢您的帮助(两次都是这样),非常感谢,我现在对protobuff的理解也好多了:)

我不知道是否还有csrf错误,但是这里有一个明显的缺陷:没有实例化protobuff对象。在

xpa = x.PaymentACK()   # note parens

还有其他错误:正如我在my previous answer中所示,xpa.payment也应该是protobuff,属于Payment类型,而不是原始的http主体。我不知道你为什么把答案改了。在

相关问题 更多 >