静态文件使用nginx是比较有效率的,但是有时,我们需要对文件下载做细粒度的处理,比如鉴权下载,此时就需要写代码了。
下面将一步步实现一个自定义的文件handler。
关闭自带的static handler
确保没有开启 django.contrib.staticfiles
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
# 'django.contrib.staticfiles',
定义文件下载handler
读取一个文件建议使用迭代器,否则内存吃不消。
要下载一个文件,需要返回正确的 Content-Type 和 Content-Disposition。
get_real_path 是把相对路径转成硬盘的实际路径,自已实现吧
具体看代码:
from django.http import HttpResponse, StreamingHttpResponse
....
def handler_statics(request, path):
short_file_name, real_file_path = get_real_path(request, path)
response = StreamingHttpResponse(readFile(real_file_path))
response['Content-Type'] = get_right_content_type(short_file_name)
response['Content-Disposition'] = get_right_content_disposition(short_file_name)
logging.info(u"handler_statics type {} path {}".format(get_right_content_type(short_file