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.Serializer
的 create
方法的 DRF 文档应该只返回一个新的实体实例给定的验证数据,所以我不会添加其他业务逻辑。
关于第二个问题,我将构造create
方法以使用Stripe
request 的注入模拟对象,这样你就可以测试你的代码关于任何前端交互(显然你不这样做一个集成测试,但一个单元测试)。
【讨论】:
谢谢。我只是在验证数据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