2015-01-05 2 views
6

Ich schrieb eine maschinelle Lernanwendung in Django, so dass ein Benutzer in einer Form einige Parameter spezifizieren und ein Modell trainieren kann. Sobald das Modell trainiert wird, möchte ich Anfragen bedienen wie:Django und REST-API, um auf Berechnungen basierende Anfragen zu bedienen

curl http://localhost:8000/.../?model_input='XYZ' 

und ich möchte Django die Ausgabe des Modells des Eingangs XYZ gegeben zurück. Jedes Beispiel, das ich von Tastypie oder REST Framework gesehen habe, erstellt seine Antwort aus einem Abfrage-Set. Wie kann ich fortfahren, wenn die Antwort nicht das Ergebnis eines Abfrage-Sets ist, sondern das Ergebnis einer reinen In-Memory-Berechnung? In meinem Fall ist die Antwort das Ergebnis einer Matrixmultiplikation (das trainierte Modell) durch einen Vektor (die Eingabe) und dieses Ergebnis wird nicht in einer Tabelle gespeichert.

Wie wird die Verwaltung solcher Anfragen empfohlen? Jede Hilfe wird sehr geschätzt. Grüße, Patrick

+0

Auschecken: [Verwenden von Tastypie mit Nicht-ORM-Datenquellen] (http://django-tastypie.readthedocs.org/en/latest/non_orm_data_sources.html) –

+1

empfehlen dringend DRF über TP http: //www.django -rest-framework.org/api-guide/views/ – Anentropic

Antwort

5

Django REST-Framework erfordert keine Modellquelle oder ein Abfrage-Set, obwohl es am besten funktioniert, wenn Sie mit einem von beiden arbeiten. It does provide a basic Serializer aus diesem Grund, as well as basic APIView classes zu ermöglichen, dass Inhaltsverhandlung über Standard Django klassenbasierte Ansichten verwendet werden.

Sie werden die Serializer höchstwahrscheinlich nicht verwenden müssen, außer Sie wollten das Ergebnisobjekt serialisieren. Die andere allgemeine Verwendung für eine Serializer besteht darin, die eingehenden Daten zu validieren und in ein erwartetes Format zu konvertieren.

Wenn Sie nur einen Basiswert zurückgeben möchten (Sie haben nicht angegeben, was "das Ergebnis einer Matrixmultiplikation" eigentlich sein könnte), dann ist sogar die Verwendung der Basisansichten ein Schritt vom manuellen manuellen Ausführen . Mit dem Objekt Response, das von Django REST Framework bereitgestellt wird, können Sie beliebige Daten zurückgeben und automatisch in eine vergleichbare JSON- oder XML-Darstellung konvertieren. Sie müssen nie aufrufen oder die Daten in eine bestimmte Darstellung zwingen, das Objekt Response erledigt alles für Sie.

from rest_framework.response import Response 
from rest_framework import serializers, views 

class IncredibleInputSerializer(serializers.Serializer): 
    model_input = serializers.CharField() 

class IncredibleView(views.APIView): 

    def get(self, request): 
     # Validate the incoming input (provided through query parameters) 
     serializer = IncredibleInputSerializer(data=request.query_params) 
     serializer.is_valid(raise_exception=True) 

     # Get the model input 
     data = serializer.validated_data 
     model_input = data["model_input"] 

     # Perform the complex calculations 
     complex_result = model_input + "xyz" 

     # Return it in your custom format 
     return Response({ 
      "complex_result": complex_result, 
     }) 

In dem obigen Beispiel erstellen wir ein IncredibleInputSerializer, die die model_input Abfrageparameter, um sicherzustellen, bestätigt, dass es in der Anforderung enthalten ist. Dies ist ein sehr einfaches Beispiel, da Django REST Framework unterstützt, zusätzliche Dinge für die Eingabe zu tun, z. B. das Konvertieren in eine Zahl or validating, die einem bestimmten Format entspricht.

Natürlich, wenn Sie ein Objekt oder eine Liste von Objekten serialisieren müssen, dann ist das das Django REST Framework. Es muss kein Modellobjekt sein, es kann ein Objekt mit einem Attribut oder Methoden sein, um die Daten zu erhalten, oder auch nur ein einfaches Wörterbuch, und Django REST Framework sollte es für Sie serialisieren können.

+0

Vielen Dank Kevin, Ihre Antwort wird sehr geschätzt! Ich weiß, dass dies vielleicht ein anderer Aspekt der Frage ist, aber gibt es in Ihrem Beispiel eine Möglichkeit, das Laden der Matrix jedes Mal zu vermeiden, wenn eine Anfrage gesendet wird? Mit anderen Worten, die Matrix - sehr groß - ist für alle Anfragen gleich und ich möchte sie nur einmal laden, wenn der Server startet. Mit freundlichen Grüßen, Patrick – Patrick

+0

Das erfordert, dass eine Art globaler Status eingerichtet wird, der je nachdem, wo Sie die Daten benötigen, variieren kann, aber [Sie können sich in Djangos bereitstehende Ereignisse einklinken] (http://stackoverflow.com)/a/16111968/359284), es zu tun. –

+0

Danke für den Link Kevin. Nachdem ich den Beitrag von Pykler gelesen habe, verstehe ich, dass Code ausgeführt werden kann, wenn der Server startet, aber ich bin mir immer noch nicht sicher, wie die Daten * geteilt * werden können.Jedenfalls werde ich diese spezifische Frage dort richten. Nochmals vielen Dank, Patrick – Patrick

Verwandte Themen