XsendFile与apache和django

时间:2014-07-08 12:12:34

标签: python django apache x-sendfile

我使用Vhost通过apache服务我的django。 conf文件如下

WSGIPythonPath /srv/www/myproject/testproject/


<VirtualHost *:80>
    ServerAdmin admin@betarhombus.com
    ServerName www.betarhombus.com
    WSGIScriptAlias / /srv/www/testproject/testproject/testproject/wsgi.py
    <Directory /srv/www/testproject/testproject/testproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    Alias /static/ /srv/www/testproject/testproject/static/
    Alias /media/  /srv/www/testproject/testproject/media/

    <Directory /srv/www/testproject/testproject/static>
        Require all granted
    </Directory>
    <Directory /srv/www/testproject/testproject/media>
        Require all granted
    </Directory>

</VirtualHost>

我想将媒体文件限制为仅在特定用户上提供服务。所以我遇到了XsendFile。如果我正确理解它的作用是什么,当你让django对你要服务的媒体文件进行所有检查时,它将由Apache作为静态文件提供。如果我猜对了,那么程序就是以下

  1. 激活XsendFile。
  2. 创建视图以检查媒体文件权限等并为其提供服务
  3. 与urls.py文件中的url相关联
  4. 然后我可以使用`并且将正常工作,就像使用初始媒体文件URL一样。我理解正确吗?我的问题如下:

    关于1.激活XSendFile。这应该在我的Vhost标签内的conf文件中完成吗?设置XsendFile足够吗?我应该删除媒体指令的Alias以及媒体文件的部分吗?我希望媒体文件只能由我的视图提供?

    还有什么我应该注意的吗?

    编辑:我的设置是

     <VirtualHost *:80>
        ServerAdmin admin@betarhombus.com
        ServerName www.betarhombus.com
        WSGIScriptAlias / /srv/www/testproject/testproject/testproject/wsgi.py
        XSendFile On
        XsendFilePath /srv/www/testproject/testproject/media/
        <Directory /srv/www/testproject/testproject/testproject>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>
        Alias /static/ /srv/www/testproject/testproject/static/
        <Directory /srv/www/testproject/testproject/static>
            Require all granted
        </Directory>
    </VirtualHost>
    

    my urls.py

    #for xsendmedia file serving
    url(r'^media\/(?P<path>.*)$', 'customer.views.media_xsendfile'),
    

    和我的观点

    def media_xsendfile(request, path):  
        #here will be checked if user can access media
        response = HttpResponse()
        response['Content-Type']=''
        response['X-Sendfile']= smart_str(os.path.join(settings.MEDIA_ROOT, path))
        return response
    

    我的问题是某些媒体文件是正常共享的,有些则不是,并且会出现内部服务器错误

2 个答案:

答案 0 :(得分:4)

还要确保在Apache配置文件中设置XSendFilePath,如此

XSendFile on
XSendFilePath "//path/to/files/on/disk"
<Directory "//path/to/files/on/disk">
    Order Deny,Allow
    Allow from all
</Directory>

并在返回响应时将其包含在您的视图中:

  

响应[&#39; X-Sendfile&#39;] = smart_str(file_path)

并回答你的问题:

  • 在vhost标记中激活XSendFile
  • 我已在上面写了其他需要在视图中完成的内容
  • 我不确定您是否应该删除媒体别名,日志文件应告诉您是否存在问题

答案 1 :(得分:0)

如果有人在使用Apache的较新版本(2.4)时遇到同样的问题,那么我终于可以通过以下方法使其正常工作:

<VirtualHost *:80>
        XSendFile on
        
        Alias /static/ /mnt/mysite/static/
        Alias /media/ /mnt/mysite/media/

        <Directory /mnt/mysite/static>
                Require all granted
        </Directory>

        <Directory /mnt/mysite/media>
                Require all granted
        </Directory>

        <Directory /mnt/mysite/media/protected>
                Require all denied
        </Directory>
        XSendFilePath /mnt/mysite/media/protected

        <Directory /home/benbb96/mysite>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        WSGIDaemonProcess mysite python-home=/home/benbb96/mysite/venv python-path=/home/benbb96/mysite/
        WSGIScriptAlias / /home/benbb96/mysite/config/wsgi.py
</VirtualHost>

我以wagi在守护程序模式下运行我的网站(参见docs),我想保护一些以 protected / 上传的媒体文件。因此,我添加了一个<Directory>指令来阻止对其的访问,然后在我的视图中使用 XSendFile ,该指令还验证用户是否有权访问该文件以提供受保护的文件。

请注意,我的静态文件和媒体文件托管在网络中已安装的文件夹中(/mnt/),但这不会引起任何问题。