问题分析
这是浏览器正常的请求类型分析:互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:”text/html”代表html文档,”image/png”是PNG图片,”text/css”是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。
所以解决方法中不能通过屏蔽猜测来解决,排除在配置文件中手动屏蔽的方法:SECURE_CONTENT_TYPE_NOSNIFF = False
(此解决方法对我也无效);在配置文件末尾手动声明资源类型又破坏了规范的完整性:
import mimetypes mimetypes.add_type('text/css', '.css') mimetypes.add_type('application/javascript', '.js')
。
注:以上两种解决方法均来自参考二
解决方法
开发环境
在主urls.py
中添加路由定位到static文件夹。
From:EvalAI源码
# evalai/urls.py 主路由
# DJANGO-SPAGHETTI-AND-MEATBALLS URLs available during development only.
from django.conf.urls.static import static
if settings.DEBUG:
urlpatterns += (
[... ]
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
)
EvalAI是一个AI竞赛平台。
生产环境
添加nginx服务器与uwsgi的socket对接即可。
uWsgi对于mime-types的校验文件位于/etc/mime.types
。
文档地址:https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/StaticFiles.html#mime
uWsgi配置如下,其中主要配置为声明socket端口而不是http服务。
# web为地址
[uwsgi]
chdir = /code
module = web.wsgi:application
master = true
processes = 4
socket = :8001
vaccum = true
python-autoreload = 1
buffer-size=32768
chmod-socket = 777
因为我所使用的为docker-compose部署,nginx和django属于同一网关下,所以在upstream轮询规则中定义django即可,其中监听80端口,对于/的访问定义uwsgi_pass指向django这一轮询规则,对于static则指明django的静态文件目录,code/uwsgi_params
来源于https://github.com/nginx/nginx/blob/master/conf/uwsgi_params,放置到你所指定目录即可,里面是请求头部规则声明。
Nginx配置如下:
upstream django {
server django:8001; # 和ini文件中的socket端口保持一致
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / {
uwsgi_pass django;
include /code/uwsgi_params;
}
location /static {
alias /code/static; # 静态资源路径
}
location /media {
alias /code/media; # 你项目中静态文件的存放路径
}
}