uv
.https://docs.astral.sh/uv/#installation
Attention à toujours se positionner au même niveau que le
pyproject.toml
avant de lancer une commande uv
:
$ uv sync # pour installer les dépendances
$ uv run archilog # lancement de l'application
Plus d’info sur https://docs.astral.sh/uv/.
Click is a Python package for creating beautiful command line interfaces in a composable way with as little code as necessary.
import click
@click.command()
@click.option("--count", default=1)
@click.option("--name", prompt="Your name")
def hello(count, name):
print(name, count)
$ uv run archilog hello --count=3
Your name: John
John 3
SQLite is a C library that provides a lightweight disk-based database that doesn’t require a separate server process.
import sqlite3
= sqlite3.connect("tutorial.db")
db "CREATE TABLE movie(title, year, score)")
db.execute(
= db.execute("SELECT title FROM movie").fetchone() result
SQLAlchemy est un toolkit open source SQL et un mapping objet-relationnel (ORM) écrit en Python et publié sous licence MIT.
= create_engine("sqlite:///data.db", echo=True)
engine = MetaData()
metadata
= Table(
users_table "users",
metadata,"id", Uuid, primary_key=True, default=uuid.uuid4),
Column("login", String, nullable=False)
Column( )
= users_table.insert().values(login="john.doe")
stmt
with engine.begin() as conn:
= conn.execute(stmt) result
$ uv add sqlalchemy
Flask is a lightweight WSGI web application framework. It is designed to make getting started quick and easy, with the ability to scale up to complex applications.
# inside archilog/views.py
from flask import Flask
= Flask(__name__)
app
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
$ uv run flask --app archilog.views --debug run
* Serving Flask app 'archilog.views'
* Debug mode: on
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
from flask import render_template
@app.route("/hello/")
@app.route("/hello/<name>")
def hello(name=None):
return render_template("hello.html", name=name)
<!doctype html>
<title>Hello from Flask</title>
{% if name %}<h1>Hello {{ name }}!</h1>
{% else %}<h1>Hello, World!</h1>
{% endif %}
.
├── pyproject.toml
├── README.md
└── src
└── archilog
├── __init__.py
├── models.py
├── services.py
├── templates
│ └── home.html
└── views.py
$ uv add flask
from flask import Blueprint, render_template
= Blueprint("web_ui", __name__)
web_ui
@web_ui.route("/<page>")
def show(page):
return render_template(f"pages/{page}.html")
def create_app():
= Flask(__name__)
app
from archilog.views import api, web_ui
="/")
app.register_blueprint(web_ui, url_prefix="/api")
app.register_blueprint(api, url_prefix
return app
Rien ne change, Flask cherche une fonction create_app
:
$ uv run flask --app archilog.views --debug run
= create_engine("sqlite:///data.db", echo=True)
engine = MetaData() metadata
from archilog import config
= create_engine(config.DATABASE_URL, echo=config.DEBUG)
engine = MetaData() metadata
from dataclasses import dataclass
@dataclass
class Config:
str
DATABASE_URL: bool
DEBUG:
= Config(
config ="sqlite:///data.db",
DATABASE_URL=True
DEBUG )
Collection de fichiers contenant la configuration pour chaque environnement :
dev.env
testing.env
demo.env
prod.env
Dans le fichier dev.env
:
ARCHILOG_DATABASE_URL=sqlite:///data.db
ARCHILOG_DEBUG=True
ARCHILOG_FLASK_SECRET_KEY=secret!
$ env $(cat dev.env | xargs) uv run flask --app ...
Dans le fichier pyproject.toml
:
[tool.pyproject-runner.tasks]
start = {
cmd = "flask --app archilog.views --debug run",
env-file = "!/dev.env"
}
import os
[...]
= Config(
config =os.getenv(
DATABASE_URL"ARCHILOG_DATABASE_URL", "sqlite:///data.db"
),=os.getenv("ARCHILOG_DEBUG", "False") == "True"
DEBUG )
="ARCHILOG_FLASK") app.config.from_prefixed_env(prefix
$ uv add --dev pyproject-runner