将一些 django/wagtail 个文件设为私有
make some django/wagtail files private
有没有办法让某些文件无法通过直接访问 url?例如,页面上显示了一张图片,但图片位置本身不起作用。
事情通常是如何运作的
默认情况下,所有静态和媒体文件都从静态根文件夹和媒体根文件夹提供。一个好的做法是让 NGINX 或 Apache 路由到这些,或者使用 Django Whitenoise 之类的东西来提供静态文件。
在生产环境中,您绝对不希望运行服务器提供这些文件,因为 1) 这不能很好地扩展,2) 这意味着您 运行 在生产环境中处于 DEBUG 模式,这绝对不行。
保护这些文件
您可以为不需要保护的大多数文件保留此配置。相反,您可以从不同的文件路径在 Django 中提供您自己的文件。使用文件字段的 upload_to 参数指定您希望这些文件存放的位置。例如,
protectedfile = models.FileField(upload_to="protected/")
publicfile = models.FileField(upload_to="public/")
然后在 NGINX 中将您的块直接指向 /var/www/myproject/MEDIAROOT/public。这将使您能够继续提供 public 个文件。
同时,对于受保护的文件,视图可以提供这些文件:
def view_to_serve_up_docs(request, document_id):
my_doc = MyDocumentModel.objects.get(id=document_id)
# Do some check against this user
if request.user.is_authenticated():
response = FileResponse(my_doc.privatefile)
response["Content-Disposition"] = "attachment; filename=" + my_doc.privatefile.name
else:
raise Http404()
return response
并且 link 到您模板中的此视图
<a href='/downloadFileView/12345'>Download File #12345 Here!</a>
参考
有关 FileResponse 对象的更多信息:https://docs.djangoproject.com/en/1.11/ref/request-response/#fileresponse-objects
有没有办法让某些文件无法通过直接访问 url?例如,页面上显示了一张图片,但图片位置本身不起作用。
事情通常是如何运作的 默认情况下,所有静态和媒体文件都从静态根文件夹和媒体根文件夹提供。一个好的做法是让 NGINX 或 Apache 路由到这些,或者使用 Django Whitenoise 之类的东西来提供静态文件。
在生产环境中,您绝对不希望运行服务器提供这些文件,因为 1) 这不能很好地扩展,2) 这意味着您 运行 在生产环境中处于 DEBUG 模式,这绝对不行。
保护这些文件 您可以为不需要保护的大多数文件保留此配置。相反,您可以从不同的文件路径在 Django 中提供您自己的文件。使用文件字段的 upload_to 参数指定您希望这些文件存放的位置。例如,
protectedfile = models.FileField(upload_to="protected/")
publicfile = models.FileField(upload_to="public/")
然后在 NGINX 中将您的块直接指向 /var/www/myproject/MEDIAROOT/public。这将使您能够继续提供 public 个文件。
同时,对于受保护的文件,视图可以提供这些文件:
def view_to_serve_up_docs(request, document_id):
my_doc = MyDocumentModel.objects.get(id=document_id)
# Do some check against this user
if request.user.is_authenticated():
response = FileResponse(my_doc.privatefile)
response["Content-Disposition"] = "attachment; filename=" + my_doc.privatefile.name
else:
raise Http404()
return response
并且 link 到您模板中的此视图
<a href='/downloadFileView/12345'>Download File #12345 Here!</a>
参考 有关 FileResponse 对象的更多信息:https://docs.djangoproject.com/en/1.11/ref/request-response/#fileresponse-objects