近两天收到一个需求,说在地址栏直接访问静态资源的时候需要添加一个用户验证登录权限,如下访问
正常开发模式下DEBUG为True的时候用个请求中间件是可以拦截到这个请求的是因为DEBUG为True的时候静态资源是使用的django自带的静态资源服务器.
但是生产环境DEBUG肯定要设置成False的 那么要访问静态资源肯定就需要一个web服务器类似apache,nginx等,但是静态资源经过服务器后直接就返回给客户端了,项目中间件就没办法拦截到静态资源请求路由并且做登录判定(技术有限有大佬能处理这种情况的欢迎指导).
所以最终方案是用uwsgi做启动服务器,静态资源static,media路由走应用程序.
修改如下:
#urls.py
from django.views.static import serve #django1.8以下建议使用
# from django.contrib.staticfiles.views import serve django1.8以上建议使用
urlpatterns = [
...
url(r"^static/(?P<path>.*)$", serve, {"document_root":settings.STATIC_ROOT},name='static'),
url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT} ,name="media"),
# static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 一定注释
...
]
结论:这样配置在debug为Flase的情况下 并且不使用任何静态资源服务器也能访问静态资源 并且拦截到静态资源请求,由于我只是个演示小项目不考虑性能负载等等,真正的商业项目还是得结合业务情况用nginx等配置静态资源用其他的办法做权限管理.