How to to make a file private by securing the url that only authenticated users can see

前端 未结 3 1807
花落未央
花落未央 2020-12-08 16:43

I was wondering if there is a way to secure an image or a file to be hidden when it is not authenticated.

Suppose there is an image in my website which can only be s

3条回答
  •  离开以前
    2020-12-08 17:25

    It would be better to handle just the authentication, and let your webserver handle the serving of files. It's probably good to put them in a different directory than your settings.MEDIA_ROOT, to prevent your webserver from serving the files before you handle the request, e.g. project_root/web-private/media/.

    import os
    
    @login_required
    def protected_file(request, path):
        # set PRIVATE_MEDIA_ROOT to the root folder of your private media files
        name = os.path.join(settings.PRIVATE_MEDIA_ROOT, path)
        if not os.path.isfile(name):
            raise Http404("File not found.")
    
        # set PRIVATE_MEDIA_USE_XSENDFILE in your deployment-specific settings file
        # should be false for development, true when your webserver supports xsendfile
        if settings.PRIVATE_MEDIA_USE_XSENDFILE:
            response = HttpResponse()
            response['X-Accel-Redirect'] = filename # Nginx
            response['X-Sendfile'] = filename # Apache 2 with mod-xsendfile
            del response['Content-Type'] # let webserver regenerate this
            return response
        else:
            # fallback method
            from django.views.static import serve
            return serve(request, path, settings.PRIVATE_MEDIA_ROOT)
    

    As your webserver is way better at serving static files than Django, this will speed up your website. Check django.views.static.serve for an idea how to sanitize file names etc.

提交回复
热议问题