IIS部署DRF+React应用后Django Admin CSS不加载问题求助
我太懂这种卡壳的滋味了——Django Admin样式加载失败,明明主体应用跑起来了,就是后台界面光秃秃的,试了好几种方法都没解决,真的闹心。咱们从settings.py核心配置和IIS部署细节两个核心方向一步步排查,应该能搞定:
一、先把settings.py的静态文件配置拉到正轨
这是基础中的基础,先确认这些配置没出错:
import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent # 生产环境必须设为False!DEBUG=True时Django会自动处理静态文件,但生产环境开这个有安全风险,也会导致collectstatic的配置失效 DEBUG = False # 必须包含你的域名/服务器IP,不然Django会拒绝静态文件请求 ALLOWED_HOSTS = ['your-domain.com', '192.168.x.x'] # 替换成你的实际域名或IP INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 这个必须在列表里!没有它collectstatic不会收集Admin的静态资源 # 你的其他应用,比如DRF 'rest_framework', ] # 静态文件访问URL前缀 STATIC_URL = '/static/' # collectstatic命令会把所有静态资源(包括Admin的)收集到这个目录,必须是绝对路径 STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 如果你有自定义的静态文件目录,加在这里,但**绝对不要包含STATIC_ROOT**,否则会重复收集导致冲突 # STATICFILES_DIRS = [ # os.path.join(BASE_DIR, 'custom-static'), # ] # 静态文件查找器,用默认的就行,别乱改 STATICFILES_FINDERS = [ 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ]
二、确保collectstatic执行到位
配置完settings后,必须在项目根目录执行:
python manage.py collectstatic
执行时会提示是否覆盖文件,选yes就行。执行完去staticfiles目录里看,必须有admin文件夹,里面包含css、js、img这些子目录——如果没有,说明INSTALLED_APPS里漏了django.contrib.staticfiles,或者DEBUG没设为False。
三、IIS的关键配置(大部分人栽在这里)
配置/static虚拟目录
- 打开IIS管理器,找到你的站点,右键添加虚拟目录:
- 别名填
static - 物理路径指向你刚才的
STATIC_ROOT(也就是staticfiles文件夹的绝对路径)
- 别名填
- 然后给这个虚拟目录设置权限:确保IIS应用池的用户(一般是
IIS AppPool\你的应用池名称)对staticfiles文件夹有读取权限。
- 打开IIS管理器,找到你的站点,右键添加虚拟目录:
添加缺失的MIME类型
IIS默认没有一些静态文件的MIME类型,会导致浏览器把.css/.js当成下载文件,无法加载。在站点级别或static虚拟目录级别添加这些类型:.css→text/css.js→application/javascript.woff2→font/woff2.png→image/png.svg→image/svg+xml
修改web.config的重写规则
如果用wfastcgi部署Django,你的web.config里肯定有转发请求到Django的重写规则,但必须让/static/路径的请求跳过这个转发,直接由IIS返回静态文件。在rewrite规则里加一条优先级最高的规则:<rewrite> <rules> <!-- 先处理静态文件请求,直接返回,不转发给Django --> <rule name="Skip Static Files" stopProcessing="true"> <match url="^static/(.*)$" /> <action type="None" /> </rule> <!-- 你的Django转发规则放在下面 --> <rule name="Django App" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="wfastcgi.py" /> </rule> </rules> </rewrite>
四、最后检查两个容易忽略的点
- 清除浏览器缓存!有时候浏览器会缓存旧的失败请求,按
Ctrl+Shift+R强制刷新试试。 - 确认服务器防火墙没有拦截静态文件的请求,比如端口80/443的静态资源请求是否允许。
按这个流程走下来,Admin的样式应该就能正常加载了。我之前帮好几个朋友排查过IIS部署Django的这个问题,大部分都是IIS的重写规则或MIME类型没配置对。
内容的提问来源于stack exchange,提问作者Yasmine
相关产品推荐
相关产品推荐

