热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DjangoRestFramework和Stripe,最佳实践?-DjangoRestFrameworkandStripe,bestpractice?

ImstrugglingwithphilosophicalquestionsinmyDRFstructureusingthepayementhandlerStripe.I

I'm struggling with philosophical questions in my DRF structure using the payement handler Stripe. I'm selling a product that has a django model Product through my DRF REST API. I'm wondering if I should create the Product and then handle the payment in my create view as follow:

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

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

        ...

or instead, if I should handle the payement in the serializer of 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 

Which one is the better practice? Or, do I completely miss the point and should do it differently?

哪一个更好的做法?或者,我是否完全忽略了这一点,应该采用不同的方式吗?

Secondly, is there a way to embed Stripe.js and the required form in the Browsable API template for the create route so I can test my REST without the need of any frontend?

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

Thank you for your help

谢谢您的帮助

1 个解决方案

#1


1  

In my opinion the right approach is a mix of the two provided approaches because you should send the Stripe request in the ModelViewSet class but save the Product entity only after the service's successful response.

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

Otherwise if the service's response is not successful I would rollback each database operation(with Django 1.6+ you can do it using transaction.atomic() documented here).

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

I don't like your second approach because according to the DRF documentation about the create method of serializers.Serializerthis method should only return a new Entity instance given the validated data, so I would not add other business logic.

我不喜欢你的第二种方法,因为根据DRF文档有关serializers的创建方法.Serializert这个方法应该只返回给定验证数据的新Entity实例,所以我不会添加其他业务逻辑。

Regarding the second question I would structure the create method to use an injected mock object for the Striperequest, in this way you can test your code regarding any frontend interaction (obviously in this way you don't do an integration test but a unit test).

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


推荐阅读
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • Django Token 认证详解与 HTTP 401、403 状态码的区别
    本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
author-avatar
xeyuxing369
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有