다운로드 가능한 파일을 장고에게 제공
사이트상의 유저가 패스가 불분명한 파일을 다운로드 할 수 있도록 해, 직접 다운로드 할 수 없게 하고 싶다.
예를 들어 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
대신apache
X-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
송신도 됩니다.
시험: 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
'programing' 카테고리의 다른 글
Javadoc: HTML 태그가 없는 줄 바꿈? (0) | 2022.10.30 |
---|---|
사용자 정의 기준을 충족하는 각 그룹에서 레코드를 선택하는 MySQL 쿼리 (0) | 2022.10.20 |
Windows의 MariaDB - 데이터베이스 엔진을 시작하려고 할 때 이 오류는 무엇입니까? (0) | 2022.10.20 |
gradle을 사용하는 aar 라이브러리에 대해 전이 종속성을 확인할 수 없습니다. (0) | 2022.10.20 |
socket.io에 대한 좋은 초보 튜토리얼? (0) | 2022.10.20 |