Skip to content

Python FastAPI backend

A FastAPI server. main.py serves a health check and an example route that lists a table’s rows. vaif_client.py creates two clients from the environment: one with the publishable key, under which row rules apply, and one with the secret key, which bypasses them.

Terminal window
vaif init --template python-fastapi-backend

Run it in a new, empty folder. It writes vaif.config.json and the template's files there. It stops if the folder already has a vaif.config.json, and leaves any other file that already exists alone; --force overwrites both.

It asks which features to include. This template has files for Database, Authentication, Storage and Functions; Database and Authentication are selected to start with. To skip the question, name them: vaif init --template python-fastapi-backend --features database,auth,storage,functions. Add one later with vaif init --template python-fastapi-backend --add-features <feature>.

FileWritten
main.pyAlways
vaif_client.pyAlways
requirements.txtAlways
.env.exampleAlways
.gitignoreAlways
README.mdAlways
migrations/0001_initial.sqlWith Database
models.pyWith Database
middleware/auth.pyWith Authentication or Storage
middleware/__init__.pyWith Authentication or Storage
routes/storage.pyWith Storage
routes/__init__.pyWith Storage
routes/functions.pyWith Functions
functions/hello.pyWith Functions

Authentication adds a middleware that checks the caller’s access token. Storage and Functions add routes that upload files and invoke your project’s functions.

The code this template writes uses the client for its language:

Terminal window
pip install "vaifstudio==1.0.0"

requirements.txt lists the Python client with FastAPI and its server, so pip install -r requirements.txt installs everything once the client is on PyPI; the notice above says whether it is. Until then, call the REST API from Python with any HTTP client.

Copy .env.example to .env and fill it in. The project ID and the keys are on Security > Credentials in the console.

VariableValue
VAIF_PROJECT_IDYour project ID.
VAIF_PUBLISHABLE_KEYThe project's publishable key (vk_pub_). Row rules apply to it, so it is safe in an app.
VAIF_SECRET_KEYThe project's secret key (vk_srv_), for server code only. It bypasses row rules; never ship it in a browser or mobile app.
CORS_ORIGINSThe addresses whose browser code may call this server, separated by commas. Without it, only http://localhost:3000.

The template writes one SQL file for your database. The comment line above each CREATE TABLE sets that table's row rules.

migrations/0001_initial.sql, written with the Database feature, is an example: edit it to describe your own tables before you apply it.

migrations/0001_initial.sql
-- Initial migration. Customize this schema for your project; vaif db push
-- applies it. The comment directly above each CREATE TABLE sets that table's
-- row rules: here each signed-in user reads and changes only their own rows,
-- and the owner column is filled in from their sign-in on insert. Keep a rule
-- comment on every table you add: a table with no row rules is closed to
-- signed-out visitors but open to every signed-in user.
-- vaif:owner id
CREATE TABLE IF NOT EXISTS "users" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
"email" text NOT NULL UNIQUE,
"name" text,
"created_at" timestamp with time zone NOT NULL DEFAULT now()
);
-- vaif:owner user_id
CREATE TABLE IF NOT EXISTS "posts" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
"user_id" uuid NOT NULL REFERENCES "users"("id"),
"title" text NOT NULL,
"content" text,
"published" boolean NOT NULL DEFAULT false,
"created_at" timestamp with time zone NOT NULL DEFAULT now()
);
  • users (-- vaif:owner id): each signed-in user reads and changes only their own rows, and id is filled in from their sign-in.
  • posts (-- vaif:owner user_id): each signed-in user reads and changes only their own rows, and user_id is filled in from their sign-in.

Put your project ID in vaif.config.json ("projectId"), sign in, and apply it. With no --dir, vaif db push finds the template's SQL folder, or a ./migrations folder, and applies its .sql files in name order.

Terminal window
vaif login
vaif db push --dry-run # what each file would change
vaif db push
Terminal window
uvicorn main:app --reload
  • Python SDK for the client’s tables, sign-in, storage and functions.
  • REST API for calling the API from Python with any HTTP client.