Skip to content

Add Python Workers FastAPI, Django, Flask starter kits - #15636

Open
ryanking13 wants to merge 2 commits into
mainfrom
python-workers-frameworks-examples
Open

Add Python Workers FastAPI, Django, Flask starter kits#15636
ryanking13 wants to merge 2 commits into
mainfrom
python-workers-frameworks-examples

Conversation

@ryanking13

@ryanking13 ryanking13 commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Add Python web frameworks starter kits for Django, FastAPI, Flask. Python workers team recently added support for these frameworks, so it would be good to have these templates.



Screen.Recording.2026-09-14.at.8.38.00.PM.mov

Devin Review

@changeset-bot

changeset-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 334e392

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
create-cloudflare Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-project-automation github-project-automation Bot moved this to Untriaged in workers-sdk Sep 14, 2026
@workers-devprod
workers-devprod requested review from a team and cjol and removed request for a team September 14, 2026 11:45
@workers-devprod

Copy link
Copy Markdown
Contributor

Codeowners approval required for this PR:

  • @cloudflare/wrangler
Show detailed file reviewers
  • .changeset/ten-geese-roll.md: [@cloudflare/wrangler]
  • packages/create-cloudflare/e2e/tests/cli/cli.test.ts: [@cloudflare/wrangler]
  • packages/create-cloudflare/e2e/tests/frameworks/test-config.ts: [@cloudflare/wrangler]
  • packages/create-cloudflare/src/tests/templates.test.ts: [@cloudflare/wrangler]
  • packages/create-cloudflare/src/templates.ts: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/c3.ts: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/py/.python-version: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/py/README.md: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/py/package.json: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/py/pyproject.toml: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/py/src/django_app/init.py: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/py/src/django_app/settings.py: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/py/src/django_app/urls.py: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/py/src/django_app/wsgi.py: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/py/src/entry.py: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/django/py/wrangler.jsonc: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/fastapi/c3.ts: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/fastapi/py/.python-version: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/fastapi/py/README.md: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/fastapi/py/package.json: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/fastapi/py/pyproject.toml: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/fastapi/py/src/entry.py: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/fastapi/py/wrangler.jsonc: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/flask/c3.ts: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/flask/py/.python-version: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/flask/py/README.md: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/flask/py/package.json: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/flask/py/pyproject.toml: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/flask/py/src/entry.py: [@cloudflare/wrangler]
  • packages/create-cloudflare/templates/flask/py/wrangler.jsonc: [@cloudflare/wrangler]

@pkg-pr-new

pkg-pr-new Bot commented Sep 14, 2026

Copy link
Copy Markdown
@cloudflare/autoconfig

npm i https://pkg.pr.new/@cloudflare/autoconfig@15636

@cloudflare/build-output-utils

npm i https://pkg.pr.new/@cloudflare/build-output-utils@15636

@cloudflare/codemods

npm i https://pkg.pr.new/@cloudflare/codemods@15636

@cloudflare/config

npm i https://pkg.pr.new/@cloudflare/config@15636

@cloudflare/containers-shared

npm i https://pkg.pr.new/@cloudflare/containers-shared@15636

create-cloudflare

npm i https://pkg.pr.new/create-cloudflare@15636

@cloudflare/deploy-helpers

npm i https://pkg.pr.new/@cloudflare/deploy-helpers@15636

@cloudflare/kv-asset-handler

npm i https://pkg.pr.new/@cloudflare/kv-asset-handler@15636

miniflare

npm i https://pkg.pr.new/miniflare@15636

@cloudflare/pages-functions

npm i https://pkg.pr.new/@cloudflare/pages-functions@15636

@cloudflare/pages-shared

npm i https://pkg.pr.new/@cloudflare/pages-shared@15636

@cloudflare/unenv-preset

npm i https://pkg.pr.new/@cloudflare/unenv-preset@15636

@cloudflare/vite-plugin

npm i https://pkg.pr.new/@cloudflare/vite-plugin@15636

@cloudflare/vitest-plugin

npm i https://pkg.pr.new/@cloudflare/vitest-plugin@15636

@cloudflare/workers-auth

npm i https://pkg.pr.new/@cloudflare/workers-auth@15636

@cloudflare/workers-editor-shared

npm i https://pkg.pr.new/@cloudflare/workers-editor-shared@15636

@cloudflare/workers-utils

npm i https://pkg.pr.new/@cloudflare/workers-utils@15636

wrangler

npm i https://pkg.pr.new/wrangler@15636

commit: a0765c2

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 3 potential issues.

Devin Review

Comment on lines +250 to +253
django: djangoTemplate,
docusaurus: docusaurusTemplate,
fastapi: fastapiTemplate,
flask: flaskTemplate,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Experimental Python starters always fail

With --experimental, each new framework reaches create without generated files. The experimental path skips copyTemplateFiles, so project setup fails on the missing package.

Learn more

Experimental C3 normally runs a framework generator, skips static template copying, and delegates configuration to wrangler setup. These three configs define only copyFiles, so selecting one in experimental mode creates no directory before package-name processing runs.

Example: create-cloudflare app --experimental --framework django --lang python selects Django from this map. create skips copyTemplateFiles, then updatePackageName tries to read app/package.json instead of producing a Django project.

Recommended fix: Either omit these static frameworks from getFrameworkMap({ experimental: true }), or make the experimental creation path copy static templates before running autoconfiguration.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +273 to +276
django: djangoTemplate,
docusaurus: docusaurusTemplate,
fastapi: fastapiTemplate,
flask: flaskTemplate,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Defaults reject Python framework selection

With --accept-defaults, --framework django inherits lang=ts. Language filtering removes every new Python framework, so non-interactive creation reports it unsupported.

Learn more

The --accept-defaults option populates unspecified arguments from C3_DEFAULTS, whose language is ts. createContext filters the framework map by that language before resolving the explicitly requested framework. Since each new config exposes only a python variant, all three disappear from the map.

Example: create-cloudflare app --framework django --accept-defaults --no-deploy fails with Unsupported framework: django. The same command with --lang python succeeds.

Recommended fix: Derive lang="python" when one of these Python-only frameworks is explicitly selected and no language was explicitly supplied. Preserve rejection for an explicitly incompatible --lang value.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@@ -0,0 +1,9 @@
SECRET_KEY = ""
DEBUG = False
ALLOWED_HOSTS = []

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟨 Django starter lacks allowed hosts

The starter uses ALLOWED_HOSTS=[] with DEBUG=False. Django rejects normal Worker hostnames, encouraging unsafe wildcard configuration as a workaround.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@dom96 dom96 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! Looks good from my side.

@@ -0,0 +1,13 @@
{
"name": "<PACKAGE_NAME>",
"version": "0.0.0",

@dom96 dom96 Sep 14, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit for consistency:

Suggested change
"version": "0.0.0",
"version": "0.1.0",

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Untriaged

Development

Successfully merging this pull request may close these issues.

3 participants