【问题标题】:make some django/wagtail files private将一些 django/wagtail 文件设为私有
【发布时间】:2017-11-17 21:09:25
【问题描述】:

有没有办法使某些文件无法通过直接 url 访问?例如,图像出现在页面上,但图像位置不能单独使用。

【问题讨论】:

    标签: django wagtail


    【解决方案1】:

    事情的正常运作方式 默认情况下,所有静态和媒体文件都从静态根和媒体根文件夹提供。一个好的做法是让 NGINX 或 Apache 路由到这些,或者使用 Django Whitenoise 之类的东西来提供静态文件。

    在生产环境中,您绝对不希望 runserver 提供这些文件,因为 1) 这不能很好地扩展,2) 这意味着您在生产环境中以 DEBUG 模式运行,这是绝对不允许的.

    保护这些文件 您可以为大多数不需要保护的文件保留此配置。相反,您可以在 Django 中从不同的文件路径提供您自己的文件。使用文件字段的upload_to 参数来指定您希望这些文件存在的位置。例如,

    protectedfile = models.FileField(upload_to="protected/")
    publicfile = models.FileField(upload_to="public/")
    

    然后在 NGINX 中将您的块直接指向 /var/www/myproject/MEDIAROOT/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
    

    并在您的模板中链接到此视图

    <a href='/downloadFileView/12345'>Download File #12345 Here!</a>
    

    参考 有关 FileResponse 对象的更多信息:https://docs.djangoproject.com/en/1.11/ref/request-response/#fileresponse-objects

    【讨论】:

      猜你喜欢
      • 2016-11-04
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      • 2014-05-18
      • 2020-01-10
      • 2018-06-07
      • 1970-01-01
      • 2020-12-05
      相关资源
      最近更新 更多