gpt4 book ai didi

python - Django Rest Framework 和 Stripe,最佳实践?

转载 作者:太空狗 更新时间:2023-10-30 01:33:52 24 4
gpt4 key购买 nike

我在使用支付处理程序 Stripe 的 DRF 结构中遇到哲学问题.我正在通过我的 DRF REST API 销售具有 django 模型 Product 的产品。我想知道我是否应该创建 Product,然后在我的 create View 中处理付款,如下所示:

class ProductViewSet(viewsets.ModelViewSet):

...

def create(self, request):
serializer = ProductSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
product = serializer.save()

try:
response = stripe.Charge.create(
amount=product.cost,
currency="usd",
source=request.data["token"], # Done with Stripe.js
description="Product"
)
product.charge_id = response.charge_id

...

或者,如果我应该Product 的序列化器中处理付款:

class ProductSerializer(serializers.Serializer):

...

def create(self, validated_data):
product = Product.objects.create(**validated_data)

# Will raise an Excetpion and stop the creation:
response = stripe.Charge.create(
amount=product.cost,
currency="usd",
source=validated_data["token"], # Done with Stripe.js
description="Product"
)


return product

哪个是更好的做法?或者,我是否完全没有捕获要点,应该采取不同的做法?

其次,是否有一种方法可以将 Stripe.js 和所需的表单嵌入到 create 路由的 Browsable API 模板中,这样我就可以在不需要任何前端的情况下测试我的 REST?

谢谢你的帮助

最佳答案

在我看来,正确的方法是混合提供的两种方法,因为您应该在 ModelViewSet 类中发送 Stripe 请求,但保存 Product 仅在服务成功响应后的实体。

否则,如果服务的响应不成功,我将回滚每个数据库操作(对于 Django 1.6+,您可以使用 transaction.atomic() 记录的 here 来完成)。

我不喜欢你的第二种方法,因为根据关于 serializers.Serializercreate 方法的 DRF 文档,此方法应该只返回一个新的 Entity 实例给定经过验证的数据,因此我不会添加其他业务逻辑。

关于第二个问题,我将构造 create 方法以使用注入(inject)的模拟对象来处理 Stripe 请求,这样您就可以测试有关任何前端交互的代码(显然,通过这种方式,您不会进行集成测试,而是进行单元测试)。

关于python - Django Rest Framework 和 Stripe,最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28736916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com