En bref
Cette skill documente le déploiement de code Python (Flask, Django, FastAPI, ou générique) vers Azure App Service Linux. Elle permet de créer au besoin le groupe de ressources, un plan `P0v3` Linux et une Web App au runtime `PYTHON:3.14`, régler la commande de démarrage (pour FastAPI : toujours `python -m uvicorn main:app --host 0.0.0.0`), poser `SCM_DO_BUILD_DURING_DEPLOYMENT=true`, puis déployer par `azd deploy` ou `az webapp deploy`. Ce n’est pas pour Container Apps, Functions, un langage autre que Python, ni pour Terraform, Bicep ou une infrastructure complète : on passe par `azure-prepare`. Avant de créer un plan, on invoque `azure-quotas`. On n’utilise jamais `az webapp up` (déprécié), ni le runtime avec une barre verticale à la place du deux-points. Après le déploiement, on n’enchaîne ni `curl`, ni `az webapp log tail`, ni une sonde de santé : l’application a besoin de deux à trois minutes pour chauffer. Pour Django, `STATIC_ROOT` et `collectstatic` doivent être en ordre avant d’empaqueter.
Ce que ça fait
- Créer au besoin le groupe de ressources, un plan `P0v3` Linux et une Web App au runtime `PYTHON:3.14`, régler la commande de démarrage (pour FastAPI : toujours `python -m uvicorn main:app --host 0.0.0.0`), poser `SCM_DO_BUILD_DURING_DEPLOYMENT=true`, puis déployer par `azd deploy` ou `az webapp deploy`.
- Ce n’est pas pour Container Apps, Functions, un langage autre que Python, ni pour Terraform, Bicep ou une infrastructure complète : on passe par `azure-prepare`.
- Avant de créer un plan, on invoque `azure-quotas`.
- On n’utilise jamais `az webapp up` (déprécié), ni le runtime avec une barre verticale à la place du deux-points.
- Après le déploiement, on n’enchaîne ni `curl`, ni `az webapp log tail`, ni une sonde de santé : l’application a besoin de deux à trois minutes pour chauffer.
- Des skills voisines citées sont `azure-prepare`, `azure-quotas`.
Pour qui, et un exemple
Les développeurs Python qui veulent déployer une appli Flask, Django ou FastAPI sur App Service Linux, sans IaC complète et sans Container Apps ni Functions.
Exemple de demande : « Déploie cette appli FastAPI sur App Service Linux, runtime PYTHON:3.14, avec uvicorn en démarrage, et arrête-toi après le déploiement, sans curl ni lecture de logs. »
On l’ouvre pour déployer du Python sur App Service Linux (Flask, Django, FastAPI), pas pour Container Apps, Functions, un autre langage, ou une infrastructure en Bicep ou Terraform. Exemple rédigé par iadujour.fr à partir du SKILL.md, non testé.
Installer
npx skills add microsoft/skills (sélection de la skill dans l’assistant, README).
npx skills add microsoft/skillsFonctionne avec
- GitHub Copilot
- Copilot CLI
Source : README : exemples de « Copilot CLI » et « GitHub Copilot in VS Code » ; l’installation `npx skills add` envoie les fichiers vers le répertoire de l’agent choisi, sans liste exhaustive.
Niveau : Intermédiaire
Suppose un projet déjà en place chez l’éditeur et les outils décrits dans le SKILL.md.
À savoir
Extrait du SKILL.md
La description d’origine, celle que l’agent lit pour décider de charger la skill (en anglais) :
Deploy Python (Flask/Django/FastAPI) code to Azure App Service Linux. WHEN: "Flask App Service", "Django App Service", "FastAPI App Service", "deploy Python to App Service". DO NOT USE FOR: Container Apps, Functions, non-Python, Terraform/Bicep/IaC, full infra — use azure-prepare.
Citée depuis le SKILL.md au commit 5211c2d . Le dossier contient aussi 12 fichiers annexes (references/, scripts/).
Le SKILL.md compte 31 lignes et 3 sections principales :
- Workflow
- Hard rules
- Error Handling
Licence : MIT
Vérifiée le 10 novembre 2026 sur : fichier de licence d’un dossier parent (.github/plugins/azure-skills/LICENSE) . Licence déclarée dans le frontmatter : « MIT ». Titulaire : Copyright 2025 (c) Microsoft Corporation..
La licence autorise la reprise : le texte intégral du SKILL.md est reproduit ci-dessous, sans modification, avec sa mention de licence.
Texte intégral du SKILL.md
Reproduit sans modification depuis microsoft/skills (commit 5211c2d) , © Microsoft, sous licence MIT (fichier de licence d’origine ).
Afficher le SKILL.md original (31 lignes, en anglais)
---
name: python-appservice-deploy
description: "Deploy Python (Flask/Django/FastAPI) code to Azure App Service Linux. WHEN: \"Flask App Service\", \"Django App Service\", \"FastAPI App Service\", \"deploy Python to App Service\". DO NOT USE FOR: Container Apps, Functions, non-Python, Terraform/Bicep/IaC, full infra — use azure-prepare."
license: MIT
metadata:
author: Microsoft
version: "1.1.2"
---
# Python on Azure App Service — Code Deploy
Deploys Python (Flask, Django, FastAPI, generic) code to Azure App Service Linux (P0v3, Python 3.14). Creates RG + Plan + Web App if missing. Hand off to `azure-prepare` for VNet, Key Vault, databases, or IaC.
**MCP tools used**: `mcp_azure_mcp_subscription_list`, `mcp_azure_mcp_group_list`, `mcp_azure_mcp_appservice`, `mcp_azure_mcp_azd` (when `azure.yaml` is present).
## Workflow
**Prerequisite:** Verify the latest stable Azure CLI; update with approval and recheck if needed.
1. **Resolve context — smart defaults, minimal prompts.** Only the app name is interactive; RG (`<app>-rg`), Plan (`<app>-plan`), region (current `az` default or `eastus2`), subscription are derived. [create-app.md](references/create-app.md) §1.
2. **Detect framework** (advisory, never blocks). [detect.md](references/detect.md).
3. **Choose path** — `azure.yaml` host: appservice → [deploy-azd.md](references/deploy-azd.md); else [deploy-azcli.md](references/deploy-azcli.md).
4. **Ensure RG → Plan (`P0v3 --is-linux`) → Web App (`--runtime "PYTHON:3.14"`)** exist. Before creating a plan, invoke `azure-quotas` to check quota availability. On transient ARM errors, follow [transient-retry.md](references/transient-retry.md). [create-app.md](references/create-app.md).
5. **Set startup** — Flask/Django: none (Oryx auto-detects). FastAPI: always `python -m uvicorn main:app --host 0.0.0.0`. Other: warn. [startup-commands.md](references/startup-commands.md).
6. **Set `SCM_DO_BUILD_DURING_DEPLOYMENT=true`**.
7. **Deploy** — `azd deploy` or `az webapp deploy --type zip --track-status false --enriched-errors true`.
8. **STOP. Print the post-deploy message** ([post-deploy-message.md](references/post-deploy-message.md)) and end the turn.
### Hard rules
- **LINUX SCRIPTS** — normalize selected shell/startup files to LF, then verify no CR bytes remain. Stop on normalization, validation or packaging failure; deploy only a fresh package.
- **DJANGO REMOTE BUILDS** — require `STATIC_ROOT` and successful system/`collectstatic` checks before packaging.
- ⛔ **NO POST-DEPLOY VERIFICATION** — after deploy returns, do not run `az webapp log tail`, `curl`, `Invoke-WebRequest`, or any health probe. App Service needs 2–3 min to warm; a quiet log or early 5xx is not failure.
- ⛔ **SHELL SAFETY** — for `--runtime` always use `"PYTHON:3.14"` (colon). Never `"PYTHON|3.14"` (pipe is a shell operator).
- ⛔ **NEVER `az webapp up`** — deprecated. Use Step 7 commands.
- ✅ **URL FORMAT** — present endpoints as `https://...` URLs.
## Error Handling
See [errors.md](references/errors.md) for the full symptom → cause → fix matrix. Quick triage: missing plan/app → re-run Step 4; container ping timeout on 8000 → fix startup (Step 5); `ModuleNotFoundError` after deploy → ensure Step 6 ran, redeploy.
Commentaires.
Un retour d’expérience, une question, une précision sur cette skill ? Les commentaires sont relus avant publication.
Commentaires publiés
Chargement des commentaires…
Laisser un commentaire
Charte de modération. Chaque commentaire est relu avant publication. Sont refusés : l’incitation à la haine, les propos injurieux ou discriminatoires, la publicité, le spam et les liens promotionnels, le hors-sujet et les données personnelles d’autrui.