Django:阻止直接访问文件

时间:2010-10-10 17:31:01

标签: django

我想从我的web目录的根目录后面动态提供文件。目前我正在静态提供所有文件,我只是为了包含我的javascripts和css文件。我意识到这可能是愚蠢的,但我无法以任何其他方式提供文件!

所以,我想动态提供文件,而用户只需使用网址就可以在其他时间访问。

我的设置

ADMIN_MEDIA_PREFIX = '/media/'
MEDIA_ROOT = os.path.join( APP_DIR, 'site_media' )
MEDIA_URL = 'http://localhost:8000/site_media/'

我的网址

( r'^site_media/(?P<path>.*)$', 'django.views.static.serve', { 'document_root': settings.MEDIA_ROOT } )

谢谢!

2 个答案:

答案 0 :(得分:5)

“动态”是什么意思?你想要实现的是什么?您想控制对文件的访问吗?

如果你想运行一些决定是否允许用户访问该文件的Django-view,你可以使用sendfile。有关如何设置正确标头的代码,请参阅以下代码段:http://djangosnippets.org/snippets/2226/

你的网络服务器也需要支持这个标题,至少我和我合作过的是apache和nginx。

您还需要考虑如何存储和分发文件,因为运行Web服务器的服务器需要访问文件。这取决于您的设置。

答案 1 :(得分:1)

您可能会以很难猜测的方式对网址进行模糊处理;这根本不是安全的,但它会阻止随意的扑克游戏。您还需要确保在生产中用于提供静态媒体的任何内容都未设置为显示目录列表。

如果您需要更安全的东西,这就是我过去所做的事情:

在models.py中:

my_storage = FileSystemStorage(location=settings.MY_FILES_ROOT, base_url='DO_NOT_USE')

class Resource (models.Model):
    //...snip...
    resource_file = models.FileField(storage = my_storage)

其中settings.MY_FILES_ROOT是正常保存静态文件的路径。

然后,在views.py中:

def get_file(request, whatever_id):
    //check if the user is allowed to access the file here
    resource = Resource.objects.get(id=resid)
    response = HttpResponse(resource.resource_file.read(), mimetype='text/whatever')
    response['Content-Disposition'] = 'attachment; filename=whatever.ext'
    return response

当然,只有当您知道文件的MIME类型和文件扩展名时,此方法才有效,无论它是否始终相同(我在常用的PDF文件中执行此操作的应用程序),或者您从文件中提取它。

相关问题