use*_*621 5 python django rest stripe-payments django-rest-framework
我正在使用付款处理程序Stripe在我的DRF结构中与哲学问题作斗争.我正在Product通过我的DRF REST API 销售具有django模型的产品.我想知道我是否应该创建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
...
Run Code Online (Sandbox Code Playgroud)
或者,如果我应该处理序列化器中的付款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
Run Code Online (Sandbox Code Playgroud)
哪一个更好的做法?或者,我是否完全忽略了这一点,应该采用不同的方式吗?
其次,有没有办法在路径的Browsable API模板中嵌入Stripe.js和所需的表单,create这样我就可以在不需要任何前端的情况下测试我的REST了?
谢谢您的帮助
在我看来,正确的方法是混合提供的两种方法,因为您应该Stripe在类中发送请求,但仅在服务成功响应后才ModelViewSet保存实体。Product
否则,如果服务的响应不成功,我将回滚每个数据库操作(使用 Django 1.6+,您可以使用此处transaction.atomic()记录的方法来完成此操作)。
我不喜欢你的第二种方法,因为根据 DRF 文档,关于该方法create的方法serializers.Serializer应该只返回一个给定验证数据的新实体实例,所以我不会添加其他业务逻辑。
关于第二个问题,我将构造方法create以使用注入的模拟对象来处理请求Stripe,这样您就可以测试有关任何前端交互的代码(显然,通过这种方式,您不进行集成测试,而是进行单元测试)。