将一些 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