2013-02-24 77 views
0

我制作了一个简单的文件服务器,运行在我的树莓派(1/2 GB内存,1个CPU)上。它运行在nginx(1名工作人员)背后的gunicorn(3名工作人员)之下。Django:片状文件下载

我有一个奇怪的问题,当我试图同时下载太多的文件(比如5)时,他们都会部分通过,然后放弃。 django服务器没有输出(我也使用开发服务器来解决这个问题,这就是为什么它现在运行在nginx的后面,但仍然没有喜悦)。

我下载的观点是:

@never_cache 
def download_media(request, user_id, session_key, id, filepath): 
    "Download an individual media file" 

    context = RequestContext(request) 

    # validate the user_id & session_key pair 
    if not __validate_session_key(user_id, session_key): 
     return HttpResponseRedirect(reverse('handle_logout')) 

    filepath = unicode(urllib.unquote(filepath)) 

    if '..' in filepath: 
     raise SuspiciousOperation('Invalid characters in subdir parameter.') 

    location = MediaCollectionLocation.objects.get(id=id) 

    path = os.path.join(location.path, filepath) 

    response = HttpResponse(FileWrapper(file(path)), content_type='application/octet-stream') 
    response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(path) 

    response['Content-Length'] = os.path.getsize(path) 
    response["Cache-Control"] = "no-cache, no-store, must-revalidate" 
    return response 

我提供文件服务这种方式,因为我希望客户端进行身份验证(所以不要只是想重定向和服务nginx的静态内容)。

任何人都知道为什么它会退出,如果我并行发出几个请求?

+0

你有没有试过在另一台linux机器上运行这个脚本(即不是在你的树莓派 - 大概运行raspbian)? – Hzmy 2013-02-24 23:04:10

回答

0

我不完全确定为什么这些文件会失败,但我想可能与下载更多的文件有关,比您有工作人员,或者在nginx和gunicorn之间发生超时。

只有在django通过让django设置一个特定的头文件,然后nginx读取(仅限内部文件)并为文件提供服务之后,才能让nginx提供文件。

XSendFile是nginx用来做到这一点的。然后,您可以创建一些中间件或函数来设置django中的相应头文件,或者使用类似django-sendfile的内容与nginx后端一起完成。

如果您遇到的问题是由django和nginx之间的超时引起的,则此修复程序应解决此问题。如果不是,则也增加nginx工作者的数量,因为它现在负责提供文件。

+0

不知道。好多了,谢谢。 – 2013-02-25 19:29:23