2015-02-26 12 views
5

Sto lottando con le domande filosofiche nella mia struttura DRF usando il gestore paghe Stripe. Sto vendendo un prodotto che ha un modello django Product attraverso la mia API REST DRF. Mi chiedo se devo creare il Product e poi gestire il pagamento a mio create vista come segue:Django Rest Framework e Stripe, best practice?

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 

     ... 

o, invece, se devo gestire il payement nel serializzatore di 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 

Qual è la migliore pratica? Oppure, mi manca completamente il punto e dovrei farlo in modo diverso?

In secondo luogo, c'è un modo per incorporare Stripe.js e il modulo richiesto nel modello API navigabili per il percorso create in modo da poter testare il mio REST senza la necessità di alcun frontend?

Grazie per il vostro aiuto

risposta

1

A mio parere il giusto approccio è un mix dei due approcci previsti siccome è necessario inviare la richiesta Stripe nella classe ModelViewSet ma salvare l'entità Product solo dopo risposta positiva del servizio.

In caso contrario, se la risposta del servizio non riesce, eseguirò il rollback di ogni operazione di database (con Django 1.6+ è possibile farlo utilizzando transaction.atomic() documentato here).

Non mi piace il tuo secondo approccio, perché in base alla documentazione DRF sul metodo di serializers.Serializercreate questo metodo deve restituire solo una nuova istanza Entità dato i dati validati, in modo da non aggiungere altra logica di business.

Per quanto riguarda la seconda domanda che vorrei strutturare il metodo create di utilizzare un oggetto finto iniettato per la richiesta Stripe, in questo modo è possibile testare il codice per quanto riguarda qualsiasi interazione frontend (ovviamente in questo modo non si fa un test di integrazione ma un test unitario).

+0

Grazie. Sto semplicemente caricando dopo aver convalidato i dati 'serializer.is_valid (raise_exception = True)' ma prima di creare l'oggetto 'product = serializer.save()' nella mia vista. È un po 'triste dover recuperare alcuni dati da 'request.data' per caricare ... Puoi aggiungere più dettagli (ad es. Bit di codice) sulla seconda parte? – user2024621