Django 为静态站点设置密码保护的最简单方法?

Django 为静态站点设置密码保护的最简单方法?,django,authentication,mod-auth,static-site,Django,Authentication,Mod Auth,Static Site,我有一个静态站点 我想用最简单的方法来保护一个目录,用一个基本的管理用户界面来添加/删除用户。我会有这么少的用户,我不关心性能 我不在乎它是PHP还是Django或者其他什么,我只想要一个完整的软件包 Apache basic auth不好,因为您无法注销。也没有用于添加用户的UI 我试着用Django auth处理所有的东西,并通过Django提供文件。然而,Chrome将我所有的text/css头都视为text/plain,所以我没有看到任何样式表显示 我无法在服务器上使用modxsend

我有一个静态站点

我想用最简单的方法来保护一个目录,用一个基本的管理用户界面来添加/删除用户。我会有这么少的用户,我不关心性能

我不在乎它是PHP还是Django或者其他什么,我只想要一个完整的软件包

  • Apache basic auth不好,因为您无法注销。也没有用于添加用户的UI

  • 我试着用Django auth处理所有的东西,并通过Django提供文件。然而,Chrome将我所有的text/css头都视为text/plain,所以我没有看到任何样式表显示

  • 我无法在服务器上使用modxsendfile,因为我无法重新配置Apache以添加新模块。我认为这种方法无论如何都是矫枉过正的


是否有一个代码包可以实现静态站点的基本管理员身份验证?

我使用nginx,这通常是我的解决方案。Apache可能也有类似的功能。不知道

在nginx中,代理可以返回一个带有header
X-Accel-Redirect
的响应,其中包含nginx应该重定向到的位置。例如,使用以下nginx配置:

server {
   ...
   location / {
       proxy_pass: ...;
   }
   location /media/secure/ {
       internal;
       alias ...;
   }
}
如果代理通行证将返回:

X-Accel-Redirect: /media/secure/somefile;
然后nginx将请求从代理重定向到
/media/secure/
位置,从而为静态文件提供服务

因此,我通常在Django中对用户进行身份验证,然后将带有位置的头返回到nginx提供服务的文件。这很好,因为Django不必提供静态文件,用户不能只访问该安全位置(因为
internal
指令),还因为如果在nginx中配置了所有mime类型,那么所有文件都可以正常提供

同样,这是针对nginx的,不是针对Apache的,但对于Apache可能也有类似的东西

编辑

这里是一个简单的Django代码片段,假设您使用的是与上述nginx相同的设置。如果GET中提供了此视图的路径,则此视图将提供安全文件:

@login_required()
def serve_secure_static(request, file_root=os.path.join(settings.MEDIA_ROOT, 'secure')):
    if not request.method == 'GET':
        return HttpResponseBadRequest('Only GET allowed')

    if not 'file' in request.GET:
        return HttpResponseBadRequest('File query must be provided')

    # make sire loggen user is allowed to see the file
    # maybe check some custom permission

    file_path = request.GET['file']

    # if in DEBUG, make Django serve static file
    # because nginx might not be configured
    if settings.DEBUG:
        abs_file_path = os.path.join(file_root, file_path)
        file_data = open(abs_file_path, 'rb').read()
        return HttpResponse(file_data, mimetype=mimetypes.guess_type(file_path))

    # else make nginx serve static file
    else:
        redirect_url = '/%s' % file_path
        response = HttpResponse()
        response['X-Accel-Redirect'] = redirect_url
        return response
因此,如果将此视图添加到urlconfig:

url(r'^serve_secure_static/$', 'server_secure_static')
您可以通过以下方式请求安全文件:

http://domain.com/serve_secure_static/?file=path/to/file/here/relative/to/media/secure.css
哪一个将从

/media/secure/path/to/file/here/relative/to/media/secure.css

我相信这就是Apache的x-sendfile所做的。我可能会尝试你的解决方案,如果没有一个现有的软件包,做我想要的。