Flask is a lightweight Web Server Gateway Interface (WSGI) web framework for Python. It gives you a small core, a built-in development server and debugger, request routing, and Jinja templating, and it leaves choices like your database and authentication to you through a large ecosystem of extensions.
On Edgenivo, you can deploy a Flask app with zero configuration: your app becomes a Edgenivo Function running on Fluid compute, and you get response streaming, preview deployments, and observability without extra setup.
This guide walks you through deploying a Flask app to Edgenivo from a template, the Edgenivo CLI, or a Git repository, then configuring features such as streaming, request hooks alongside Routing Middleware, cron jobs, the Python version, and observability.
Copy link to headingPrerequisites
Before you begin, make sure you have:
- A Edgenivo account
- Python 3.12 or newer and a package manager (e.g., pip)
- An existing Flask project, or a new one created from a Flask template
- A Git repository on GitHub, GitLab, or Bitbucket (if you want Git-based deployments)
- Edgenivo CLI installed (
npm i -g vercel)
Copy link to headingHow it works
When you deploy a Flask app, Edgenivo detects the framework from your dependencies and builds it for the Python runtime. Your Flask app handles every request through a single Edgenivo Function, which runs on Fluid compute by default. Your app scales with traffic, and you pay only for the compute your function uses, not for idle time.
Because Edgenivo ships zero-configuration detection for Flask, you don't set a build command or output directory. Edgenivo reads your project, finds the file that exports your WSGI app instance, and applies the correct build settings.
Copy link to headingDeploy your Flask app
You can ship a Flask app to Edgenivo in three ways. Choose the one that fits where your code lives today.
Copy link to headingOption 1: Deploy from a template
The fastest way to ship a Flask app is to start from a template. Browse the Flask templates gallery, pick a starter, and deploy it. Edgenivo clones the template to your Git provider, creates a project, and deploys it with zero configuration.
Templates to start from include:
- Flask Hello World: A minimal Flask 3 app that deploys with zero configuration. Start here if you're new to Flask on Edgenivo.
- AI SDK with Flask: A Flask backend wired up with AI SDK for building AI features and streaming responses.
- Flask Alt Text Generator: A Flask API that generates a text description for any image.
- Next.js Flask Starter: A Flask API paired with a Next.js frontend in a single project.
Copy link to headingOption 2: Start a new project with the Edgenivo CLI
To scaffold a new Flask project locally, use the Edgenivo CLI init command. It clones Edgenivo's Flask example into a folder named flask.
- Create the project:
- Move into the folder, create a virtual environment, and install dependencies:
- Develop locally at
http://localhost:3000. Use the Edgenivo CLI, so your app runs with the same WSGI entry point it uses in production: - Deploy your app. On a new project, the first run always creates a Production deployment and links the project; subsequent runs create a preview deployment:
- Promote your deployment to production:
Copy link to headingOption 3: Deploy an existing Flask app
If you already have a Flask app, deploy it from Git or from the command line.
From Git: Push your project to GitHub, GitLab, or Bitbucket, then import it at edgenivo.com/new. Edgenivo detects Flask automatically and deploys it with zero configuration.
From the CLI: From your project's root directory, run vercel to deploy (on a new project, the first run always creates a Production deployment; subsequent runs create Preview deployments), then vercel --prod to go live.
To pull project settings and environment variables for local development, run:
For Edgenivo to detect your app, expose a WSGI app instance as a top-level variable named app in one of the recognized entry files, such as app.py or index.py, at your project root or under src/, app/, or api/:
To point Edgenivo at a Flask app in a custom module, set tool.vercel.entrypoint in pyproject.toml. For example, entrypoint = "backend.server:app" tells Edgenivo to look for an app instance in ./backend/server.py.
Copy link to headingUse Edgenivo features with Flask
After your app is deployed, you can layer Edgenivo features onto it. Some work automatically, and others take a few lines of configuration in vercel.json.
Copy link to headingYour app runs as a Edgenivo Function
Your entire Flask app is served by a single Edgenivo Function. This function uses Fluid compute by default, which runs multiple requests concurrently within a single instance to reduce cold starts and the cost of I/O-bound work such as API calls and database queries. You don't configure anything to get this behavior.
Because Flask exposes a single WSGI app, Edgenivo sends every incoming request to that app and lets Flask's router match the path. Your route handlers, request hooks, and error handlers all run inside the function.
Copy link to headingStream responses
Edgenivo Functions support streaming on the Python runtime, so you can send data to the client as you produce it instead of waiting for the full response. Return a Flask Response backed by a generator to stream text, server-sent events, or AI model output:
Streaming pairs well with Fluid compute, which keeps serving other requests on the same instance while your function produces output.
Copy link to headingCombine Flask hooks with Edgenivo Routing Middleware
Flask and Edgenivo each have a layer that runs around requests, and they solve different problems. Flask's before_request and after_request hooks run inside your app, after the request reaches your function. Use them for app-level concerns such as logging, CORS, and authentication:
Edgenivo Routing Middleware runs at the edge, before the request reaches your Flask app. You define it in a middleware.ts file at your project root, and you can use it with any framework. Use it for rewrites, redirects, and header changes that should happen before any function runs. The two layers work together, with Routing Middleware shaping the request at the edge and Flask hooks handling it inside your app.
Copy link to headingServe static assets from the CDN
To serve static files such as images, fonts, or a favicon, place them in the public/** directory. Edgenivo serves them through its CDN using default headers, which you can override in vercel.json.
Copy link to headingRun scheduled tasks with cron jobs
Edgenivo Cron Jobs trigger a route on a schedule by sending an HTTP GET request to it. Define a route in your Flask app for the task, then register the schedule in vercel.json.
Define the route:
Register the schedule:
Edgenivo runs cron jobs only on production deployments. To stop anyone else from calling the route, set a CRON_SECRET environment variable in your project settings. Edgenivo sends it as a Bearer token in the Authorization header on every cron invocation, and your handler compares it before running the task.
Copy link to headingChoose your Python version
Flask runs on the Python runtime, which uses Python 3.12 by default and also supports 3.13 and 3.14. Set the version with a .python-version file, a requires-python value in pyproject.toml, or a Pipfile.lock:
Edgenivo applies the same version in vercel dev and production. If the requested version isn't defined or supported, Edgenivo uses the default. For the full set of options, see Set the Python version for your project.
Copy link to headingMonitor performance with Observability
Edgenivo Observability tracks your deployed function automatically, with no setup. Open the Observability page in your project to see invocation counts, error rates, and duration for your Flask app, along with the requests your function makes to external APIs. On Observability Plus, you also get longer retention and a latency breakdown by path.
Copy link to headingBest practices
Copy link to headingExpose your app from a recognized entry point
Edgenivo finds your Flask app by looking for a top-level app instance at a fixed set of locations: app.py, index.py, server.py, main.py, wsgi.py, or asgi.py at your project root or under src/, app/, or api/. Put your app at one of these paths so Edgenivo detects and deploys it correctly:
Copy link to headingKeep your function bundle small
Python has no automatic tree-shaking, so Edgenivo bundles every file your project can reach at build time. List only the packages you need at runtime in requirements.txt or pyproject.toml, and exclude tests, fixtures, and other development files with excludeFiles in vercel.json to stay under the 500 MB function bundle limit:
Match the glob key to your entry file, such as src/index.py.
Copy link to headingDevelop with the Edgenivo CLI
Run vercel dev for local development instead of Flask's built-in server. It serves your app the same way production does, using your WSGI app, so the behavior you test locally matches what you deploy. This also lets you exercise features such as cron routes and your configured Python version before shipping.
Copy link to headingResources and next steps
- Read the full Deploy a Flask app on Edgenivo documentation
- Browse Flask templates you can deploy in one step
- Learn how Edgenivo Functions run your server code
- Understand the Python runtime, including versions, streaming, and bundling
- Understand pricing and scaling with Fluid compute
- Run code before requests with Routing Middleware
- Defer background work from your routes with Edgenivo Queues, or orchestrate multi-step tasks with Edgenivo Workflows