Skip to content
This repository has been archived by the owner on Aug 16, 2023. It is now read-only.

Empty boilerplate project for Starlette with docker, auth, css and more.

Notifications You must be signed in to change notification settings

accent-starlette/boilerplate

Repository files navigation

Starlette Boilerplate Project

Sourcery

Getting Started

Build the container:

docker-compose build

Up the container:

docker-compose up

Setup your database by creating your first revision, you may need to add some missing imports:

docker-compose exec app sh
alembic revision --autogenerate -m "first revision"

Then apply it:

docker-compose exec app sh
alembic upgrade head

Ready!!

The container is ready at http://localhost

Environment Variables

base

  • ALLOWED_HOSTS
  • DATABASE_URL
  • DEBUG
  • SECRET_KEY

email

  • EMAIL_HOST
  • EMAIL_PORT
  • EMAIL_DEFAULT_FROM_ADDRESS
  • EMAIL_DEFAULT_FROM_NAME
  • EMAIL_USERNAME
  • EMAIL_PASSWORD

aws

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_BUCKET
  • AWS_REGION

other

  • SENTRY_DSN

Formatting and Linting

Sorts imports, removes unused variables, max line length etc

docker-compose exec app ./scripts/lint

Testing

Run tests and coverage

docker-compose exec app ./scripts/test

New User & Example Scope

docker-compose exec app python

The following will just paste into the python shell to save you copying each line.

from app.db import db
from starlette_auth.tables import Scope, User
scope = Scope(code="admin", description="Full administrators access")
user = User(email='admin@example.com', first_name='Admin', last_name='User')
user.set_password('password')
user.scopes.append(scope)
user.save()

Styles

npm install:

npm install

build css:

npm run watch-css

Postgres Query Stats

The following line must be added the the postgresql.conf file:

shared_preload_libraries = 'pg_stat_statements'

Enable the extension in postgres:

CREATE EXTENSION pg_stat_statements;

Reset stats:

SELECT pg_stat_statements_reset();

View all logged stats:

SELECT
query,
calls,
total_time,
min_time,
max_time,
mean_time,
rows,
100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements
INNER JOIN pg_catalog.pg_database db
ON pg_stat_statements.dbid = db.oid
WHERE db.datname = 'appdb'
ORDER BY total_time
DESC LIMIT 25;

More info: https://www.postgresql.org/docs/current/pgstatstatements.html