2016-11-02 4 views
0

Ich erstelle eine API-Funktion, die es dem Client ermöglicht, eine GET-Anfrage mit URL-Parametern zu senden, der Server empfängt und verarbeitet eine Datei basierend auf den gegebenen Informationen und gibt eine benutzerdefinierte Datei zurück. Die gute Nachricht ist, dass ich alle Schritte selbständig mache!Wie kann ich eine HttpResponse mit Django Rest Framework zurückgeben?

Ich konnte alles innerhalb der def get_query Funktion mit Ausnahme funktioniert die Rückgabe der HttpResponse. Die Funktion erfordert eine Queryset-Antwort (sinnvoll, denke ich ..). Ich dachte mir, ich brauchte eine andere Funktion, damit ich die HttpResponse zurückgeben konnte, also habe ich def send_file erstellt. Ich bin mir nicht sicher, wie ich diese Funktion aufrufen soll und jetzt überspringt sie sie einfach.

ansichten.py.

class SubFileViewSet(viewsets.ModelViewSet): 

    queryset = subfiles.objects.all() 
    serializer_class = SubFilesSerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, 
          IsOwnerOrReadOnly,) 

    def send_file(self, request): 

     req = self.request 
     make = req.query_params.get('make') 
     model = req.query_params.get('model') 
     plastic = req.query_params.get('plastic') 
     quality = req.query_params.get('qual') 
     filenum = req.query_params.get('fileid') 
     hotend = req.query_params.get('hotendtemp') 
     bed = req.query_params.get('bedtemp') 

     if make and model and plastic and quality and filenum:    

      filepath = subfiles.objects.values('STL', 'FileTitle').get(fileid = filenum) 

      path = filepath['STL'] 
      title = filepath['FileTitle']  

      ''' 
      #Live processing (very slow) 
      gcode = TheMagic(
       make=make, 
       model=model, 
       plastic=plastic, 
       qual=quality, 
       path=path, 
       title=title, 
       hotendtemp=hotend, 
       bedtemp=bed) 

      ''' 
      #Local data for faster testing 
      gcode = "/home/bradman/Documents/Programming/DjangoWebProjects/3dprinceprod/fullprince/media/uploads" 

      test_file = open(gcode, 'r') 
      response = HttpResponse(test_file, content_type='text/plain') 
      response['Content-Disposition'] = "attachment; filename=%s" % title 


      print (response) 
      return response 

    def perform_create(self, serializer): 
     serializer.save(owner=self.request.user)   


    def get_queryset(self): 
     req = self.request 
     make = req.query_params.get('make') 
     model = req.query_params.get('model') 
     plastic = req.query_params.get('plastic') 
     quality = req.query_params.get('qual') 
     filenum = req.query_params.get('fileid') 
     hotend = req.query_params.get('hotendtemp') 
     bed = req.query_params.get('bedtemp') 

     return self.queryset 
     #function proved in here then removed and placed above 
     #get_query required a queryset response 

Ich habe wenig Erfahrung mit Django Ruhe Framework und ich bin nicht sicher, ob es ein besserer Weg, dies zu implementieren, oder wie ich die Funktion def send_file nennen könnte?

Antwort

2

Sie suchen nach benutzerdefinierten Routen. Legen Sie Ihre send_file als list_routehttp://www.django-rest-framework.org/api-guide/viewsets/#marking-extra-actions-for-routing

from rest_framework.decorators import list_route 

class SubFileViewSet(viewsets.ModelViewSet): 
    ... 

    @list_route(methods=['get']) 
    def send_file(self, request): 
     ... 

Und dann können Sie diese Methode zugreifen, als

/subfile/send_file/?params 
+0

Als ich das Zugriff von Client-Seite Anfrage, es läuft 'def get_query' und gibt einen 404-Fehler. – RknRobin

+0

@RknRobin du meinst 'def get_queryset'? –

+0

Nach der doppelten Überprüfung wird die gesamte 'class SubFileViewSet' ausgeführt, einschließlich' def get_queryset', jedoch immer noch 'def send_file'. – RknRobin

Verwandte Themen