programing

다운로드 가능한 파일을 장고에게 제공

nicescript 2022. 10. 20. 21:38
반응형

다운로드 가능한 파일을 장고에게 제공

사이트상의 유저가 패스가 불분명한 파일을 다운로드 할 수 있도록 해, 직접 다운로드 할 수 없게 하고 싶다.

예를 들어 URL은 다음과 같습니다.http://example.com/download/?f=somefile.txt

그리고 서버에서는 다운로드 가능한 모든 파일이 폴더에 있는 것을 알고 있습니다./home/user/files/.

파일을 표시하기 위해 URL과 보기를 찾는 대신 다운로드하기 위해 Django를 사용할 수 있는 방법이 있습니까?

"양쪽 모두의 장점"을 얻으려면 S를 결합할 수 있습니다.xsendfile 모듈을 사용한 Lott의 솔루션: django는 파일(또는 파일 자체)에 대한 경로를 생성하지만 실제 파일 서비스는 Apache/Lighttpd에 의해 처리됩니다.mod_xsend 파일을 설정한 후 뷰와 통합하려면 몇 줄의 코드가 필요합니다.

from django.utils.encoding import smart_str

response = HttpResponse(mimetype='application/force-download') # mimetype is replaced by content_type for django 1.7
response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name)
response['X-Sendfile'] = smart_str(path_to_file)
# It's usually a good idea to set the 'Content-Length' header too.
# You can also set any other required headers: Cache-Control, etc.
return response

물론 이 기능은 서버를 제어할 수 있거나 호스팅 회사가 mod_xsend 파일을 이미 설정한 경우에만 작동합니다.

편집:

mimtype은 django 1.7의 content_type으로 대체됩니다.

response = HttpResponse(content_type='application/force-download')  

편집: 대상nginx체크해 주세요.X-Accel-Redirect대신apacheX-Sendfile 헤더

"다운로드"는 단순히 HTTP 헤더 변경입니다.

다운로드로 응답하는 방법에 대해서는, http://docs.djangoproject.com/en/dev/ref/request-response/#telling-to-to-to-to-to-the-response-as-a-file을 참조해 주세요.

필요한 URL 정의는 1개뿐입니다."/download".

요청은GET또는POST사전에는 다음이 있습니다."f=somefile.txt"정보.

뷰 함수는 기본 경로를 "와 간단히 병합합니다.f" value, 파일을 열고 응답 개체를 만들고 반환합니다.12줄 미만의 코드여야 합니다.

매우 심플하지만 효율성이나 확장성이 떨어지는 솔루션에는 내장된 django를 사용할 수 있습니다.serve보기. 이것은 빠른 프로토타입이나 일회성 작업에는 매우 좋지만, 이 질문에서 언급한 바와 같이 apache나 nginx와 같은 것을 프로덕션에서 사용해야 합니다.

from django.views.static import serve
filepath = '/some/path/to/local/file.txt'
return serve(request, os.path.basename(filepath), os.path.dirname(filepath))

S.Lott는 "좋은"/심플한 솔루션을, Elo80ka는 "최고의"/효율적인 솔루션을 제공합니다.「더 좋은」/중간 솔루션을 소개합니다.서버 셋업은 필요 없습니다만, 큰 파일의 경우, 간단한 수정보다 효율적입니다.

http://djangosnippets.org/snippets/365/

기본적으로, 장고는 여전히 파일 서비스를 처리하지만 모든 것을 한 번에 메모리에 로드하지는 않습니다.이것에 의해, 메모리 사용량을 늘리지 않고, 큰 파일을 (느리게) 처리할 수 있습니다.

다시 S.Lott의 X-SendFile은 더 큰 파일에도 적합합니다.그러나 이러한 문제를 해결할 수 없거나 원하지 않는 경우, 이 중간 솔루션을 사용하면 번거로움 없이 효율성을 높일 수 있습니다.

Django 1.10에서 사용할 수 있는 FileResponse 오브젝트에 대해 설명하겠습니다.

편집: Django를 통해 파일을 쉽게 스트리밍할 수 있는 방법을 찾다가 제 답변을 발견했습니다. 더 완벽한 예를 다음에 제시하겠습니다.이 FileField라고 합니다.imported_file

views.py

from django.views.generic.detail import DetailView   
from django.http import FileResponse
class BaseFileDownloadView(DetailView):
  def get(self, request, *args, **kwargs):
    filename=self.kwargs.get('filename', None)
    if filename is None:
      raise ValueError("Found empty filename")
    some_file = self.model.objects.get(imported_file=filename)
    response = FileResponse(some_file.imported_file, content_type="text/csv")
    # https://docs.djangoproject.com/en/1.11/howto/outputting-csv/#streaming-large-csv-files
    response['Content-Disposition'] = 'attachment; filename="%s"'%filename
    return response

class SomeFileDownloadView(BaseFileDownloadView):
    model = SomeModel

urls.py

...
url(r'^somefile/(?P<filename>[-\w_\\-\\.]+)$', views.SomeFileDownloadView.as_view(), name='somefile-download'),
...

@Rocketmonkeys 솔루션을 시도했지만 다운로드된 파일이 *.bin으로 저장되고 임의의 이름이 지정되었습니다.물론 괜찮지 않아요.@hyp80ka 에 @ @ @ @ @ @ @ @ @ @ @ @ 。
현재 사용하고 있는 코드는 다음과 같습니다.

from wsgiref.util import FileWrapper
from django.http import HttpResponse

filename = "/home/stackoverflow-addict/private-folder(not-porn)/image.jpg"
wrapper = FileWrapper(file(filename))
response = HttpResponse(wrapper, content_type='text/plain')
response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(filename)
response['Content-Length'] = os.path.getsize(filename)
return response

이제 파일을 개인 디렉토리(/media 또는 /public_html 내부가 아님)에 저장하고 특정 사용자 또는 특정 상황에서 django를 통해 파일을 노출할 수 있습니다.
도움이 됐으면 좋겠다.

@elo80ka @SOEMENTERODE.Lott와 @Rocketmonkeys는 모두 완벽한 솔루션을 제공했습니다. =

mod_xsendfile 메서드는 비ASC를 허용하지 않는다고 위에서 설명했습니다.파일 이름의 II 문자

따라서 이름이 url로 인코딩되어 있으면 모든 파일을 전송할 수 있는 mod_xsendfile용 패치와 추가 헤더가 있습니다.

X-SendFile-Encoding: url

송신도 됩니다.

http://ben.timby.com/?p=개요

시험: https://pypi.python.org/pypi/django-sendfile/

"Django가 권한 등을 확인한 후 웹 서버(mod_xsendfile이 있는 Apache 등)에 파일 업로드를 오프로드하는 추출"

sendfile apis는 sendfile apis와 같이 인 서버에서 를 사용해야 .apache ★★★★★★★★★★★★★★★★★」nginx실가동 중입니다.수년간 파일을 보호하기 위해 이러한 서버의 sendfile api를 사용해 왔습니다.그 후 개발 및 제작 목적에 적합한 심플한 미들웨어 기반의 django 앱을 만들었습니다.여기서 소스코드에 액세스 할 수 있습니다.

UPDATE : version 데데 : 새 update updatepython "django"를 사용합니다.FileResponse 구현에 대한 되어 있는 경우 Lightttp, caddy, hiawatha는 Lighttp, caddy, hiawatha를 지원합니다.

사용.

pip install django-fileprovider
  • fileprovider에 적용하다.INSTALLED_APPS 삭제,
  • fileprovider.middleware.FileProviderMiddleware로로 합니다.MIDDLEWARE_CLASSES
  • 설정하다FILEPROVIDER_NAME「」로 설정"nginx ★★★★★★★★★★★★★★★★★」apache로는 「」, 「」, 「」입니다.python발목목개

뷰 또는 뷰에서 헤더를 합니다.X-File이치예를 들어 다음과 같습니다.

def hello(request):
   # code to check or protect the file from unauthorized access
   response = HttpResponse()  
   response['X-File'] = '/absolute/path/to/file'  
   return response

django-fileprovider최소한의 수정만으로 구현됩니다.

Nginx 설정

파일을 직접 액세스로부터 보호하기 위해 다음과 같이 구성을 설정할 수 있습니다.

location /files/ {
  internal;
  root   /home/sideffect0/secret_files/;
}

서 ★★★★nginx URL 을 합니다./files/ internaly의 설정을 경우는, access internaly 를 할 수 있습니다."이것들"은 "이것들"은 "이것들"은 "이것들은 "이것들,X-File같이요.

response['X-File'] = '/files/filename.extension'

설정을 nginx에서 .views

def qrcodesave(request): 
    import urllib2;   
    url ="http://chart.apis.google.com/chart?cht=qr&chs=300x300&chl=s&chld=H|0"; 
    opener = urllib2.urlopen(url);  
    content_type = "application/octet-stream"
    response = HttpResponse(opener.read(), content_type=content_type)
    response["Content-Disposition"]= "attachment; filename=aktel.png"
    return response 

Django는 스태틱미디어에 다른 서버를 사용할 것을 권장합니다(같은 머신에서 실행되고 있는 다른 서버도 상관없습니다).이들은 lighttp와 같은 서버를 사용할 것을 권장합니다.

이것은 매우 간단하게 설정할 수 있습니다.하지만.'some file'인 경우.txt'는 요청에 따라 생성됩니다(콘텐츠는 동적임).그러면 django가 서비스를 제공할 수 있습니다.

장고 문서 - 정적 파일

또 다른 프로젝트: http://readthedocs.org/docs/django-private-files/en/latest/usage.html는 약속을 하고 있는 것 같습니다.아직 직접 테스트해 본 적이 없습니다.

기본적으로 이 프로젝트에서는 mod_xsendfile 설정을 추상화하여 다음과 같은 작업을 수행할 수 있습니다.

from django.db import models
from django.contrib.auth.models import User
from private_files import PrivateFileField

def is_owner(request, instance):
    return (not request.user.is_anonymous()) and request.user.is_authenticated and
                   instance.owner.pk = request.user.pk

class FileSubmission(models.Model):
    description = models.CharField("description", max_length = 200)
        owner = models.ForeignKey(User)
    uploaded_file = PrivateFileField("file", upload_to = 'uploads', condition = is_owner)

xsendfile 모듈과 auth view decorator의 django-filebrary를 사용하여 여러 번 같은 문제에 직면했습니다.자신의 솔루션에 대한 영감을 주는 것으로써, 자유롭게 사용해 주세요.

https://github.com/danielsokolowski/django-filelibrary

https://github.com/johnsensible/django-sendfile을 사용하여 스태틱html 폴더에 대한 보호된 접근을 제공합니다.https://gist.github.com/iutinvg/9907731

나는 이것에 대한 프로젝트를 했다.내 gitub repo를 볼 수 있습니다.

https://github.com/nishant-boro/django-rest-framework-download-expert

이 모듈은 Apache 모듈 Xsendfile을 사용하여 django rest 프레임워크에서 파일을 다운로드하기 위한 간단한 방법을 제공합니다.또한 특정 그룹에 속한 사용자에게만 다운로드 서비스를 제공하는 추가 기능도 있습니다.

언급URL : https://stackoverflow.com/questions/1156246/having-django-serve-downloadable-files

반응형