2016-11-02 62 views
0

我正在构建一个API函数,它允许客户端发送带有URL参数的GET请求,服务器接收并处理基于给定信息的文件,并返回一个自定义文件。好消息是我所有的步骤都是独立工作的!如何使用Django Rest Framework返回HttpResponse?

我能够得到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的REST框架缺乏经验,我不知道是否有实现这个更好的办法,否则我怎么会调用该函数def send_file

回答

2

您正在寻找自定义路线。设置你的send_filelist_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

,它运行'高清get_query'并返回404错误。 – RknRobin

+0

@RknRobin你的意思是'def get_queryset'? –

+0

双重检查后,它实际上运行整个'class SubFileViewSet',包括'def get_queryset',但仍然忽略'def send_file'。 – RknRobin

相关问题