XAMPP无法直接运行Django,因其专为PHP/MySQL/Apache设计;正确做法是用mod_proxy反向代理至Django开发服务器,并由Apache托管静态文件。

XAMPP 本身不支持直接运行 Django(它是为 PHP/MySQL/Apache 设计的),硬要在 XAMPP 里“部署” Django,本质是绕过 Apache 的 PHP 模块体系,把 Django 当作独立 WSGI 应用接入 Apache —— 这需要手动配置 mod_wsgi,且极易因 Python 版本、Apache 架构(32/64 位)、VC 运行库不匹配而失败。
为什么不能直接把 Django 放进 htdocs 目录
Apache 的 htdocs 目录默认只处理静态文件和通过 mod_php 解析的 .php 文件。Django 是 Python Web 框架,需由 Python 解释器加载并响应 HTTP 请求,mod_php 完全无法识别 views.py 或 wsgi.py。
- 把
manage.py或settings.py放进htdocs不会触发任何 Django 行为,反而可能因路径暴露导致敏感信息泄露 - 访问
http://localhost/myproject/时,Apache 返回 403 或 404,不是因为路径错,而是根本没启用 Python 执行环境 - XAMPP 自带的 Apache 缺少
mod_wsgi.so,且预编译版本极难与你本地 Python 匹配(比如 XAMPP 32 位 + Python 64 位 = 必报Cannot load mod_wsgi.so)
正确做法:用 XAMPP 的 Apache 代理到 Django 开发服务器
跳过 mod_wsgi 编译这个高危环节,改用 Apache 的 mod_proxy 和 mod_proxy_http 反向代理。让 Django 用 python manage.py runserver 127.0.0.1:8000 启动,再让 Apache 把 / 或 /myapp/ 的请求转发过去 —— 这既复用 XAMPP 的 Apache 端口(80)、证书管理能力,又避开二进制兼容问题。
- 确认 XAMPP 控制面板中已启用
mod_proxy和mod_proxy_http(在httpd.conf中取消这两行的注释:LoadModule proxy_module modules/mod_proxy.so和LoadModule proxy_http_module modules/mod_proxy_http.so) - 在
httpd-vhosts.conf中添加虚拟主机配置,例如:<VirtualHost *:80> ServerName django.local ProxyPreserveHost On ProxyPass / http://127.0.0.1:8000/ ProxyPassReverse / http://127.0.0.1:8000/ </VirtualHost> - 修改系统
hosts文件(C:\Windows\System32\drivers\etc\hosts),加入127.0.0.1 django.local - Django 项目中必须将
ALLOWED_HOSTS = ['django.local', '127.0.0.1'],否则返回 500
静态文件必须显式交由 Apache 处理
Django 开发服务器能自动服务 static/,但生产代理模式下,Apache 默认不会把 /static/xxx.css 转发给 Django —— 它应该直接读取文件。否则页面无样式、JS 加载失败。
立即学习“Python免费学习笔记(深入)”;
- 先在 Django 中运行
python manage.py collectstatic --noinput,把所有静态文件合并到STATIC_ROOT指定目录(如./staticfiles/) - 在虚拟主机配置中添加别名映射:
Alias /static/ "C:/xampp/htdocs/myproject/staticfiles/" <Directory "C:/xampp/htdocs/myproject/staticfiles"> Require all granted </Directory> - 注意路径使用正斜杠
/,且结尾带斜杠;Windows 路径中的反斜杠要转义或改用正斜杠 - 如果 Django 设置了
STATIC_URL = '/assets/',则Alias必须对应改成/assets/,否则 404
真正卡住人的从来不是“怎么配”,而是 Python 解释器、Apache 模块、VC++ 运行时三者架构(x86/x64)和版本的隐式绑定 —— 一个不匹配,mod_wsgi 就加载失败且错误日志只写 Invalid argument。用代理方案虽多启一个进程,但省掉三天编译调试,对非运维人员更实际。

















