将Django应用部署至Azure App Service的问题求助
我完全懂你现在的挫败感——明明把Django示例应用传到了Azure App Service的wwwroot,却还是只能看到默认的hostingstart.html页面,试了好几篇教程都没解决,确实挺闹心的。我之前帮不少开发者搞定过这类部署问题,给你一套详细的分步操作,跟着来应该就能解决:
第一步:先确认你的Django项目结构符合Azure要求
Azure对Python项目的结构有明确要求,这是很多人踩坑的地方:
- 项目根目录必须有
requirements.txt,里面要列全所有依赖,尤其要加上gunicorn——Azure就是靠它来运行Django应用的,比如你的文件里至少要有:django>=4.0 gunicorn>=20.1.0 - 确保你的Django项目的wsgi文件路径正确,比如项目名为
my_django_app,那路径就是my_django_app/wsgi.py,后面要用到这个路径。
第二步:配置Azure App Service的核心设置
登录Azure门户,找到你的App Service,按下面的步骤配置:
设置启动命令:
进入「配置」>「通用设置」,在「启动命令」里填入:gunicorn --bind=0.0.0.0 --workers=4 --timeout=600 <你的项目名>.wsgi:application举个例子,如果你的项目叫
django_sample,那就是gunicorn --bind=0.0.0.0 --workers=4 --timeout=600 django_sample.wsgi:application
同时确认「Python版本」和你本地开发用的版本一致(比如3.9或3.10),版本不匹配会直接导致依赖安装失败。添加关键环境变量:
进入「配置」>「应用程序设置」,点击「新建应用程序设置」,添加以下变量:- 名称:
DJANGO_SETTINGS_MODULE,值:<你的项目名>.settings(比如django_sample.settings) - 名称:
PYTHONPATH,值:D:\home\site\wwwroot(这是Azure上代码的根目录,确保Python能找到你的项目) - 生产环境下一定要加:
DEBUG=False,以及自定义的SECRET_KEY(别用本地测试的密钥)
- 名称:
第三步:正确上传你的Django项目到wwwroot
你之前直接复制项目到wwwroot可能结构不对,正确的做法是:
- 把Django项目的所有核心文件(包括
manage.py、项目文件夹、requirements.txt、静态文件目录等)直接放到wwwroot根目录下,不要在wwwroot里再套一个子文件夹。最终结构应该是这样:wwwroot/ ├── manage.py ├── django_sample/ # 你的Django项目文件夹 │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── requirements.txt └── staticfiles/ # 收集静态文件用的目录(后面会说) - 直接删除wwwroot里的
hostingstart.html,避免Azure默认加载这个页面。
第四步:触发Azure重新加载应用并排查日志
- 上传完代码后,回到App Service的「概述」页面,点击「重启」,强制Azure重新读取配置并安装依赖。
- 打开「监控」>「日志流」,这里能实时看到应用启动的日志,是排查问题的关键:
- 如果看到
ModuleNotFoundError: No module named 'gunicorn',说明requirements.txt漏加了gunicorn,补上重新上传即可。 - 如果看到
Invalid HTTP_HOST header,那是因为settings.py里的ALLOWED_HOSTS没加你的Azure域名,比如要加上['your-app-name.azurewebsites.net']。
- 如果看到
第五步:处理静态文件(必做!)
Django的静态文件在生产环境不会自动加载,得手动配置:
- 在你的
settings.py里添加:import os STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATIC_URL = '/static/' - 本地运行
python manage.py collectstatic --noinput,把所有静态文件收集到staticfiles文件夹,然后把这个文件夹也上传到wwwroot。 - 或者把收集静态文件的步骤加到启动命令里,比如:
这样每次重启应用时,Azure会自动帮你收集静态文件。python manage.py collectstatic --noinput && gunicorn --bind=0.0.0.0 --workers=4 --timeout=600 django_sample.wsgi:application
最后再检查几个常见坑
- 确认
ALLOWED_HOSTS包含你的Azure应用域名,不然会返回400错误。 - 不要把本地的
db.sqlite3上传到Azure,生产环境建议用Azure Database for PostgreSQL或者MySQL,当然如果只是测试的话也可以用,但要确保权限正确。 - 如果还是显示默认页面,清空浏览器缓存或者用无痕模式访问,有时候是缓存的问题。
内容的提问来源于stack exchange,提问作者Nidhi
相关产品推荐
相关产品推荐

