2016-11-02 4 views
0

Я создаю функцию API, которая позволяет клиенту отправлять запрос GET с параметрами URL, сервер получает и обрабатывает файл на основе данной информации и возвращает пользовательский файл. Хорошая новость - это все шаги, которые работают независимо!Как я могу вернуть HttpResponse с Django Rest Framework?

Я смог получить все, что работает внутри функции def get_queryкроме, возвращая HttpResponse. Функция требует ответа Queryset (имеет смысл, я думаю ..). Я решил, что мне нужна другая функция, чтобы я мог вернуть HttpResponse, поэтому я создал def send_file. Я не уверен, как назвать эту функцию, и сейчас она просто пропускает ее.

views.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 

У меня есть небольшой опыт работы с Django Framework Rest, и я не уверен, если есть лучший способ осуществить это, или как я мог бы вызвать функцию def send_file?

ответ

2

Вы ищете индивидуальные маршруты. Установите ваш send_file в 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): 
     ... 

И тогда вы можете получить доступ этот метод как

/subfile/send_file/?params 
+0

Когда я получить доступ к этому из запроса на стороне клиента, он выполняет 'Def get_query' и возвращает ошибку 404. – RknRobin

+0

@RknRobin вы имеете в виду 'def get_queryset'? –

+0

После двойной проверки он фактически запускает весь 'класс SubFileViewSet', включая' def get_queryset', но все равно игнорирует 'def send_file'. – RknRobin

Смежные вопросы