2

Я изучаю, как обслуживать временные файлы в Django, и даже после прочтения docs У меня возникли проблемы с его окончанием. Эти файлы динамически генерируются временно с пользовательского ввода.Как загрузить временный файл в Django?

def get_queryset(self): 
    gcode = "/home/bradman/Documents/Programming/DjangoWebProjects/3dprinceprod/fullprince/media/uploads/tmp/skull.gcode" 
    test_file = open(gcode, 'r') 

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

Код выше должен поместить мой файл временного GCode с моего сервера в объект HttpResponse, а функция возврата должна загрузить файл. Он даже замедляется, как при загрузке, но после его завершения нет файла.

This question предоставил большую часть полезной информации и this one был полезен, но я не могу заставить его работать и не знаю, как еще его проверить. Я не уверен, что переход на apache или что-то уместно, так как у меня есть проблемы с правами пользователя, и эти файлы сразу же удаляются после загрузки. Я проверил, что «gcode» - это url каталога, а gcode content_type должен быть текстовым/открытым. Итак, в основном, как я могу на самом деле загрузить мой ответ?

Edit1

Вот полный код, а не только проблемный участок.

class SubFileViewSet(viewsets.ModelViewSet): 
    queryset = subfiles.objects.all() 
    serializer_class = SubFilesSerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, 
          IsOwnerOrReadOnly,) 

    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') 


     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']  

      gcode = TheMagic(
       make=make, 
       model=model, 
       plastic=plastic, 
       qual=quality, 
       path=path, 
       title=title, 
       hotendtemp=hotend, 
       bedtemp=bed) 

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

     else: 
      print ('normal or non complete download') 
      return self.queryset 

Я использую Django Rest Framework и пытается создать динамический ответ от моего API получить запрос реагировать на параметры, приведенные в URL. Поэтому я посылаю запрос на получение запроса, передавая переменные в качестве параметров, он создает файл на основе этих переменных и, наконец, отправляет обратно созданный файл. Все это уже работает, за исключением фактической загрузки файла в конце. Запрос get возвращает ошибку HTTP 500.

+0

Каковы разрешения для файла gcode? Действительно ли django может открыть этот файл? – Igle

+0

Django может открыть файл, мне нужно использовать класс разрешений API из Django Rest Framework. Пользователь должен иметь разрешение от уже выбранного класса разрешений. – RknRobin

+0

Не могли бы вы поделиться своим классом разрешений и, возможно, отладочной трассой вызова конечной точки? – Igle

ответ

1

Для теста, вы можете создать представление так:

def download_file(request): 
    gcode = "/home/bradman/Documents/Programming/DjangoWebProjects/3dprinceprod/fullprince/media/uploads/tmp/skull.gcode" 
    resp = HttpResponse('') 

    with open(gcode, 'r') as tmp: 
     filename = tmp.name.split('/')[-1] 
     resp = HttpResponse(tmp, content_type='application/text;charset=UTF-8') 
     resp['Content-Disposition'] = "attachment; filename=%s" % filename 

    return resp 

Если тест в скорлупе (Джанго):

print(response.content) 

В конце кода, чтобы убедиться, что ваш файл был прочитан ,

+0

Мне удалось запустить команду печати, и она отобразила правильный текстовый файл! Я бегу, нажимая свой сервер с помощью запроса GET, я добавил свой взгляд на вопрос. Так что это правильно прочитано. – RknRobin

+0

Эти тесты помогают мне продолжить, спасибо. – RknRobin

0

Из некоторых дополнительных исследований here кажется, что поскольку функция get_query ожидает QuerySet, а не объект Response. Благодаря предлагаемым методам тестирования выше, я знаю, что моя проблема связана с представлением Django Rest Framework и выходит за рамки исходного вопроса.