Django Rest Framework 和 Stripe,最佳实践?

Posted

技术标签:

【中文标题】Django Rest Framework 和 Stripe,最佳实践?【英文标题】:Django Rest Framework and Stripe, best practice? 【发布时间】: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?

感谢您的帮助

【问题讨论】:

【参考方案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 检索一些数据才能收费...您能否在第二部分添加更多详细信息(例如代码位)?

以上是关于Django Rest Framework 和 Stripe,最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django 的 ORM 和 Django Rest Framework 序列化嵌套关系的查询集的正确方法?

Django Rest Framework:序列化程序响应错误

Python前后端分离开发Vue+Django REST framework实战

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers

Django Rest Framework组件:解析器JSONParserFormParserMultiPartParserFileUploadParser