【问题标题】:Django Rest Framework and Stripe, best practice?Django Rest Framework 和 Stripe,最佳实践?
【发布时间】:2015-04-28 12:04:39
【问题描述】:

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

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 

哪个是更好的做法?或者,我完全没有抓住重点,应该采取不同的方式吗?

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

感谢您的帮助

【问题讨论】:

    标签: python django rest django-rest-framework stripe-payments


    【解决方案1】:

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

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

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

    关于第二个问题,我将构造create 方法以使用Striperequest 的注入模拟对象,这样你就可以测试你的代码关于任何前端交互(显然你不这样做一个集成测试,但一个单元测试)。

    【讨论】:

    • 谢谢。我只是在验证数据serializer.is_valid(raise_exception=True) 之后但在我看来创建对象product= serializer.save() 之前进行收费。有点遗憾,我必须从request.data 检索一些数据才能收费...您能否在第二部分添加更多详细信息(例如代码位)?
    猜你喜欢
    • 2018-12-06
    • 2021-10-15
    • 1970-01-01
    • 2020-05-11
    • 2018-03-17
    • 2020-03-22
    • 2013-10-23
    • 1970-01-01
    相关资源
    最近更新 更多