From eee3fd6e6501246964e661a97f214ce57f554f4d Mon Sep 17 00:00:00 2001 From: Ricardo Gonzalez Date: Thu, 2 Apr 2026 15:20:14 -0700 Subject: [PATCH] starlette example --- python/starlette/.gitignore | 8 ++ python/starlette/README.md | 50 +++++++++++++ python/starlette/api/__init__.py | 3 + python/starlette/api/routes.py | 36 +++++++++ python/starlette/main.py | 110 ++++++++++++++++++++++++++++ python/starlette/public/favicon.ico | Bin 0 -> 6764 bytes python/starlette/pyproject.toml | 7 ++ 7 files changed, 214 insertions(+) create mode 100644 python/starlette/.gitignore create mode 100644 python/starlette/README.md create mode 100644 python/starlette/api/__init__.py create mode 100644 python/starlette/api/routes.py create mode 100644 python/starlette/main.py create mode 100644 python/starlette/public/favicon.ico create mode 100644 python/starlette/pyproject.toml diff --git a/python/starlette/.gitignore b/python/starlette/.gitignore new file mode 100644 index 0000000000..fb86138ef5 --- /dev/null +++ b/python/starlette/.gitignore @@ -0,0 +1,8 @@ +.vercel/ +.venv/ +venv/ +__pycache__/ +.Python +.DS_Store +.env* +.vercel diff --git a/python/starlette/README.md b/python/starlette/README.md new file mode 100644 index 0000000000..a1c02db634 --- /dev/null +++ b/python/starlette/README.md @@ -0,0 +1,50 @@ +# Starlette Starter + +Deploy your [Starlette](https://www.starlette.io/) project to Vercel with zero configuration. + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?demo-description=Deploy%20Python%20Starlette%20applications%20with%20zero%20configuration.&demo-title=Starlette%20Boilerplate&demo-url=https%3A%2F%2Fvercel-plus-starlette.vercel.app%2F&from=templates&project-name=Starlette%20Boilerplate&repository-name=starlette-python-boilerplate&repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fexamples%2Ftree%2Fmain%2Fpython%2Fstarlette&skippable-integrations=1) + +_Live Example: https://vercel-plus-starlette.vercel.app/_ + +Visit the [Starlette documentation](https://www.starlette.io/) to learn more. + +## Getting Started + +Install the required dependencies: + +```bash +python -m venv .venv +source .venv/bin/activate +pip install . +``` + +Or, if using [uv](https://docs.astral.sh/uv/): + +```bash +uv sync +``` + +## Running Locally + +Start the development server on http://0.0.0.0:5001 + +```bash +python main.py +# using uv: +uv run main.py +``` + +When you make changes to your project, the server will automatically reload. + +## Deploying to Vercel + +Deploy your project to Vercel with the following command: + +```bash +npm install -g vercel +vercel --prod +``` + +Or `git push` to your repository with our [git integration](https://vercel.com/docs/deployments/git). + +To view the source code for this template, [visit the example repository](https://github.com/vercel/vercel/tree/main/examples/starlette). diff --git a/python/starlette/api/__init__.py b/python/starlette/api/__init__.py new file mode 100644 index 0000000000..25f28f9a11 --- /dev/null +++ b/python/starlette/api/__init__.py @@ -0,0 +1,3 @@ +from .routes import api_routes + +__all__ = ["api_routes"] diff --git a/python/starlette/api/routes.py b/python/starlette/api/routes.py new file mode 100644 index 0000000000..277d75a598 --- /dev/null +++ b/python/starlette/api/routes.py @@ -0,0 +1,36 @@ +from starlette.responses import JSONResponse +from starlette.routing import Route + + +async def get_sample_data(request): + return JSONResponse( + { + "data": [ + {"id": 1, "name": "Sample Item 1", "value": 100}, + {"id": 2, "name": "Sample Item 2", "value": 200}, + {"id": 3, "name": "Sample Item 3", "value": 300}, + ], + "total": 3, + "timestamp": "2024-01-01T00:00:00Z", + } + ) + + +async def get_item(request): + item_id = int(request.path_params["item_id"]) + return JSONResponse( + { + "item": { + "id": item_id, + "name": f"Sample Item {item_id}", + "value": item_id * 100, + }, + "timestamp": "2024-01-01T00:00:00Z", + } + ) + + +api_routes = [ + Route("/data", get_sample_data), + Route("/items/{item_id:int}", get_item), +] diff --git a/python/starlette/main.py b/python/starlette/main.py new file mode 100644 index 0000000000..b941be4c09 --- /dev/null +++ b/python/starlette/main.py @@ -0,0 +1,110 @@ +from starlette.applications import Starlette +from starlette.responses import HTMLResponse +from starlette.routing import Mount, Route +from api import api_routes + + +async def read_root(request): + return HTMLResponse(""" + + + + + + Vercel + Starlette + + + + +
+ +
+
+
+

Vercel + Starlette

+
+
from starlette.applications import Starlette
+from starlette.responses import JSONResponse
+from starlette.routing import Route
+
+async def homepage(request):
+    return JSONResponse({"Python": "on Vercel"})
+
+app = Starlette(routes=[Route("/", homepage)])
+
+
+ +
+
+

Sample Data

+

Access sample JSON data through our REST API. Perfect for testing and development purposes.

+ Get Data → +
+
+
+ + + """) + + +app = Starlette( + routes=[ + Route("/", read_root), + Mount("/api", routes=api_routes), + ] +) + + +if __name__ == "__main__": + import uvicorn + uvicorn.run(app, host="0.0.0.0", port=5001) diff --git a/python/starlette/public/favicon.ico b/python/starlette/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b40a8cd5388ca029dfb7d905daea97b77f25b992 GIT binary patch literal 6764 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 Jb^6GJ{{l{GNWB06 literal 0 HcmV?d00001 diff --git a/python/starlette/pyproject.toml b/python/starlette/pyproject.toml new file mode 100644 index 0000000000..59d218fde6 --- /dev/null +++ b/python/starlette/pyproject.toml @@ -0,0 +1,7 @@ +[project] +name = "vercel-starlette-starter" +version = "0.1.0" +requires-python = ">=3.12" +dependencies = [ + "starlette>=0.40" +]