Windows Server 2019上IIS部署Django时CSS文件丢失求助
解决Windows Server 2019 + IIS部署Django时CSS无法加载的问题
我之前帮同事排查过几乎一模一样的部署问题,结合你的场景,咱们一步步来定位解决:
1. 先确认Django的静态文件核心配置
部署到生产环境时,Django不会自动管理分散在各个应用里的静态文件,必须做好这两步:
- 打开项目根目录下的
settings.py,检查以下配置:# 确保STATIC_URL和你IIS的虚拟目录别名一致 STATIC_URL = '/static/' # 绑定你项目根目录下的static文件夹 import os STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # 关键:指定静态文件收集的目标目录(必须和IIS虚拟目录的物理路径完全匹配) STATIC_ROOT = os.path.join(BASE_DIR, 'static') - 然后强制运行静态文件收集命令:打开命令提示符,切换到项目根目录,执行:
这个命令会把Django自带的、各个应用里的所有静态文件,统一复制到python manage.py collectstaticSTATIC_ROOT指定的文件夹里——如果跳过这一步,你的static文件夹可能缺少依赖的样式文件。
2. 检查IIS虚拟目录的权限(最容易踩坑的点)
你已经创建了static虚拟目录,但大概率是IIS的应用池身份没有访问这个文件夹的权限:
- 找到
C:\inetpub\wwwroot\myapp\static文件夹,右键→属性→安全标签 - 点击编辑→添加,输入你的IIS应用池身份(格式是
IIS AppPool\你的应用池名称,比如默认应用池就是IIS AppPool\DefaultAppPool),点击检查名称确认后添加 - 给这个账户勾选读取和执行、列出文件夹内容、读取的权限,保存设置。
3. 确保IIS启用了静态文件处理模块
如果IIS没开启静态文件模块,就算路径正确也无法返回CSS文件:
- 打开IIS管理器,找到你的网站→切换到功能视图→双击处理程序映射
- 检查列表里有没有
StaticFile处理程序,如果没有:- 右键→添加模块映射
- 请求路径填
*,模块选择StaticFileModule,DefaultDocumentModule,DirectoryListingModule - 执行器留空,名称填
StaticFile,点击确定保存。
4. 调整web.config的请求路由规则(针对wfastcgi部署)
如果你的Django是用wfastcgi部署的,要确保静态文件请求不会被误转发到Django的WSGI程序:
- 打开网站根目录下的
web.config,修改<handlers>节点,让静态文件处理规则优先:
或者更稳妥的方式,用<handlers> <clear /> <!-- 先处理静态文件请求 --> <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" /> <!-- 再处理Django的动态请求 --> <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="你的Python路径\python.exe|你的Python路径\Lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" /> </handlers><location>节点单独配置static目录:<location path="static"> <system.webServer> <handlers> <clear /> <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" /> </handlers> </system.webServer> </location>
5. 验证静态文件的直接访问性
最后做个简单测试:在浏览器里直接访问http://你的服务器IP/static/css/你的样式文件名.css,比如http://192.168.1.100/static/css/main.css。
- 如果能正常打开并看到CSS内容,说明IIS的静态配置没问题,问题可能出在Django模板的引用方式上——要确保模板开头加了
{% load static %},然后用{% static 'css/main.css' %}来引用静态文件,不要硬写相对路径。 - 如果打不开,回到前面的步骤重新检查权限和模块配置。
内容的提问来源于stack exchange,提问作者M.Eugene
相关产品推荐
相关产品推荐

