Generator szkieletu Flask
Generuj strukturę projektu Flask: REST API lub web app. Wybierz SQLAlchemy, auth, Blueprint, testy. Pobierz ZIP z gotowym projektem Python. Bezpłatnie.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Plików w szkielecie
lista poniżej w ściądze — dokładnie te pliki generuje silnik
Rozmiar paczki ZIP
szkielet spakowany do folder .zip (w wyniku tekstowym są te same pliki)
Szablon
Wersja Python
GENERATOR SZKIELETU FLASK
Folder projektu: acme-flask-api
Pakiet Python: acme_flask_api
Szablon: api
Python: 3.12
Opcje: SQLAlchemy, Hooki JWT auth, Bez Celery, Docker, pytest, ruff
DRZEWO PROJEKTU
----------------
acme-flask-api/
.env.example
.gitignore
Dockerfile
README.md
acme_flask_api/
__init__.py
blueprints/
__init__.py
api_v1/
__init__.py
routes.py
health/
__init__.py
routes.py
config.py
extensions.py
models.py
docker-compose.yml
pyproject.toml
requirements-dev.txt
requirements.txt
run.py
tests/
__init__.py
test_api_v1.py
test_health.py
wsgi.py
PLIKI
-----
=== .env.example ===
FLASK_ENV=development
SECRET_KEY=dev-secret-change-me
PORT=5000
DATABASE_URL=sqlite:///app.db
JWT_SECRET_KEY=dev-jwt-secret-change-me
=== .gitignore ===
.venv/
__pycache__/
*.pyc
*.pyo
*.pyd
*.sqlite3
*.db
.env
.pytest_cache/
.coverage
htmlcov/
dist/
build/
*.egg-info/
.DS_Store
=== Dockerfile ===
FROM python:3.12-slim
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app
EXPOSE 5000
CMD ["gunicorn", "-b", "0.0.0.0:5000", "wsgi:app"]
=== README.md ===
# acme-flask-api
Ten projekt został wygenerowany za pomocą generatora szkieletu Flask.
## Co otrzymujesz
Szablon API zawiera wersjonowany blueprint API z endpointami JSON.
- Baza danych: włączona (Flask-SQLAlchemy + Flask-Migrate)
- Szkielet JWT: włączony (Flask-JWT-Extended)
- Szkielet Celery: wyłączony
- Pliki Docker: dołączone
- Testy: dołączony szkielet pytest
- Linter: dołączona konfiguracja ruff
## Szybki start (lokalnie)
1. Utwórz wirtualne środowisko i zainstaluj zależności:
- Utwórz venv: `python -m venv .venv`
- Aktywuj je, a następnie zainstaluj: `pip install -e .`
2. Skopiuj plik środowiskowy i ustaw sekrety:
- `cp .env.example .env`
3. Uruchom aplikację:
- `python run.py`
Otwórz http://127.0.0.1:5000/health, aby zweryfikować, że działa.
## Punkt wejścia WSGI
Na produkcji możesz uruchomić Gunicorn:
- `gunicorn wsgi:app`
## Struktura pakietu
- Główny pakiet: `acme_flask_api/`
- Blueprinty: `acme_flask_api/blueprints/`
- Konfiguracja: `acme_flask_api/config.py`
- Rozszerzenia: `acme_flask_api/extensions.py`
=== acme_flask_api/__init__.py ===
from flask import Flask
from .config import Config
from .extensions import db
from .extensions import jwt
from .blueprints.health.routes import bp as health_bp
from .blueprints.api_v1.routes import bp as api_v1_bp
def create_app(config_object=Config) -> Flask:
app = Flask(__name__)
app.config.from_object(config_object)
# Inicjalizacja rozszerzeń
db.init_app(app)
jwt.init_app(app)
# Rejestracja blueprintów
register_blueprints(app)
return app
def register_blueprints(app: Flask) -> None:
app.register_blueprint(health_bp)
app.register_blueprint(api_v1_bp, url_prefix="/api/v1")
=== acme_flask_api/blueprints/__init__.py ===
=== acme_flask_api/blueprints/api_v1/__init__.py ===
=== acme_flask_api/blueprints/api_v1/routes.py ===
from flask_jwt_extended import jwt_required
from flask import Blueprint, jsonify, request
bp = Blueprint("api_v1", __name__)
@bp.get("/ping")
@jwt_required(optional=True)
def ping():
return jsonify({"ok": True, "message": "pong", "ip": request.remote_addr})
=== acme_flask_api/blueprints/health/__init__.py ===
=== acme_flask_api/blueprints/health/routes.py ===
from flask import Blueprint, jsonify
bp = Blueprint("health", __name__)
@bp.get("/health")
def health():
return jsonify({"status": "ok"})
=== acme_flask_api/config.py ===
import os
class Config:
SECRET_KEY = os.getenv("SECRET_KEY", "dev-secret-change-me")
JSON_SORT_KEYS = False
SQLALCHEMY_DATABASE_URI = os.getenv("DATABASE_URL", "sqlite:///app.db")
SQLALCHEMY_TRACK_MODIFICATIONS = False
JWT_SECRET_KEY = os.getenv("JWT_SECRET_KEY", SECRET_KEY)
=== acme_flask_api/extensions.py ===
from __future__ import annotations
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
from flask_jwt_extended import JWTManager
jwt = JWTManager()
def init_extensions(app: Flask) -> None:
db.init_app(app)
jwt.init_app(app)
=== acme_flask_api/models.py ===
from __future__ import annotations
from .extensions import db
class Example(db.Model):
__tablename__ = "examples"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(120), nullable=False)
def __repr__(self) -> str:
return f"<Example {self.id} {self.name}>"
=== docker-compose.yml ===
services:
app:
build: .
ports:
- "5000:5000"
env_file:
- .env
=== pyproject.toml ===
[project]
name = "acme-flask-api"
version = "0.1.0"
description = "Generated Flask starter project"
requires-python = ">=3.12"
dependencies = [
"Flask>=3.0",
"Flask-SQLAlchemy>=3.1",
"Flask-Migrate>=4.0",
"Flask-JWT-Extended>=4.6",
"python-dotenv>=1.0"
]
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[project.optional-dependencies]
dev = [
"pytest>=8.0",
"pytest-cov>=5.0",
"ruff>=0.4"
]
[tool.ruff]
line-length = 100
select = ["E", "F", "I"]
=== requirements-dev.txt ===
pytest>=8.0
pytest-cov>=5.0
ruff>=0.4
=== requirements.txt ===
Flask>=3.0
Flask-SQLAlchemy>=3.1
Flask-Migrate>=4.0
Flask-JWT-Extended>=4.6
python-dotenv>=1.0
=== run.py ===
import os
from dotenv import load_dotenv
from acme_flask_api import create_app
load_dotenv()
app = create_app()
if __name__ == "__main__":
port = int(os.getenv("PORT", "5000"))
app.run(host="0.0.0.0", port=port, debug=True)
=== tests/__init__.py ===
=== tests/test_api_v1.py ===
from acme_flask_api import create_app
def test_api_ping():
app = create_app()
client = app.test_client()
resp = client.get("/api/v1/ping")
assert resp.status_code == 200
payload = resp.get_json()
assert payload.get("ok") is True
=== tests/test_health.py ===
from acme_flask_api import create_app
def test_health_ok():
app = create_app()
client = app.test_client()
resp = client.get("/health")
assert resp.status_code == 200
assert resp.get_json()["status"] == "ok"
=== wsgi.py ===
from acme_flask_api import create_app
app = create_app()
| Plik | Co zawiera (z kodu generatora) |
|---|---|
.env.example |
wzór zmiennych środowiskowych: SECRET_KEY, PORT + DATABASE_URL / JWT_SECRET_KEY / CELERY_* wg opcji |
.gitignore |
ignoruje .venv/, __pycache__/, .env, bazy sqlite i artefakty budowania |
Dockerfile |
obraz python:3.12-slim, instalacja requirements, EXPOSE 5000, start gunicorn wsgi:app |
README.md |
instrukcja szybkiego startu: venv, pip install -e ., python run.py, punkty końcowe i struktura pakietu |
acme_flask_api/__init__.py |
fabryka create_app(): konfiguracja, inicjalizacja rozszerzeń i rejestracja blueprintów |
acme_flask_api/blueprints/__init__.py |
znacznik pakietu blueprintów |
acme_flask_api/blueprints/api_v1/__init__.py |
znacznik pakietu blueprintu API |
acme_flask_api/blueprints/api_v1/routes.py |
endpoint GET /api/v1/ping (JSON) — przy JWT z dekoratorem jwt_required(optional=True) |
acme_flask_api/blueprints/health/__init__.py |
znacznik pakietu blueprintu health |
acme_flask_api/blueprints/health/routes.py |
endpoint GET /health zwracający JSON {"status": "ok"} — do monitoringu i testów |
acme_flask_api/config.py |
klasa Config: SECRET_KEY, JSON_SORT_KEYS + SQLALCHEMY_DATABASE_URI / JWT_SECRET_KEY z env |
acme_flask_api/extensions.py |
instancje rozszerzeń poza fabryką (db, jwt) + init_extensions(app) |
acme_flask_api/models.py |
przykładowy model SQLAlchemy (tabela examples: id, name) na bazie db z extensions |
docker-compose.yml |
usługa app (build ., port 5000, env_file .env) + redis przy Celery |
pyproject.toml |
metadane projektu i lista zależności (requires-python wg wybranej wersji) — instalacja przez pip install -e . |
requirements-dev.txt |
zależności deweloperskie: pytest, pytest-cov, ruff — tylko gdy wybrałeś testy lub linter |
requirements.txt |
zależności produkcyjne: Flask>=3.0, python-dotenv + ewentualnie SQLAlchemy/Migrate, JWT, Celery |
run.py |
uruchomienie deweloperskie: load_dotenv() i app.run(host="0.0.0.0", port z PORT, debug=True) |
tests/__init__.py |
znacznik pakietu testów |
tests/test_api_v1.py |
test pytest: GET /api/v1/ping zwraca 200 i ok=true |
tests/test_health.py |
test pytest: GET /health zwraca 200 i status ok na test_client() |
wsgi.py |
punkt wejścia WSGI dla produkcji: gunicorn wsgi:app |
Wirtualne środowisko (venv): wynik nie zawiera zainstalowanych pakietów — po rozpakowaniu utwórz środowisko poleceniem python -m venv .venv, aktywuj je (Linux/macOS: source .venv/bin/activate, Windows: .venv\Scripts\activate) i zainstaluj projekt przez pip install -e . albo pip install -r requirements.txt. Dzięki temu zależności nie mieszają się z systemowym Pythonem, a .gitignore już wyklucza .venv/ z repozytorium. Sekrety (SECRET_KEY, hasła baz) trzymaj w .env — wzór jest w .env.example, a sam plik .env nigdy nie trafia do gita.
Szkielet Flask: od wygenerowania do produkcji
Fabryka i blueprinty
Szkielet używa wzorca application factory (create_app() w __init__.py) i blueprintów — health zawsze, api_v1 w szablonach API i fullweb, web w fullweb. Taki układ skaluje się bez przekształcania jednoplikowej apki: nowe domeny dodajesz jako kolejne blueprinty, a testy startują na create_app().
Co włączyć, a co dołożyć samemu
SQLAlchemy daje model przykładowy i migracje (Flask-Migrate), JWT — szkielet konfiguracji i dekorator na /ping, Celery — fabrykę workera i przykładowe zadanie. To punkty startowe: modele, uprawnienia i kolejki dopisujesz w swoim temacie. Szablon minimalny zostawia czystą apkę z /health.
Uruchomienie i weryfikacja
Lokalnie: python run.py (port z PORT, domyślnie 5000) i sprawdź /health — powinno zwrócić status ok. Testy: pytest (gdy włączone). Produkcja: gunicorn wsgi:app — plik wsgi i Dockerfile są już ustawione pod ten start, compose dorzuca redis przy Celery.
Bezpieczeństwo startu
Sekrety trafiają do .env (wzór w .env.example), a domyślne wartości typu dev-secret-change-me służą wyłącznie do lokalnego startu — przed wdrożeniem ustaw własne. .gitignore blokuje .env i bazy sqlite, debug=True zostaje tylko w run.py, bo gunicorn go nie używa.
Wskazówka: kafelki nad wynikiem pokazują liczbę plików szkieletu, rozmiar paczki ZIP, szablon i wersję Pythona — a ściągę pod wynikiem zawsze możesz porównać z tym, co faktycznie wygenerował silnik dla Twoich opcji.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator szkieletu Flask – Python boilerplate bez konfiguracji od zera
Flask to minimalistyczny web framework Pythona – elastyczny i bez narzuconej struktury, co oznacza że każdy projekt zaczyna się inaczej. Narzędzie generuje spójną, profesjonalną strukturę projektu Flask na podstawie wybranych komponentów: bazy danych, autoryzacji, testów i deployment.
Dostępne konfiguracje projektu
Tryb aplikacji: REST API (JSON endpoints) lub Web App (Jinja2 templates + forms). Baza danych: SQLAlchemy + SQLite (dev), PostgreSQL lub MySQL. Migracje: Flask-Migrate (Alembic). Auth: Flask-Login (session) lub JWT (flask-jwt-extended). Walidacja: Marshmallow lub WTForms. Cache: Flask-Caching (Redis/Memcached).
Struktura katalogów projektu
app/__init__.py (Application Factory). app/models.py – modele SQLAlchemy. app/routes/ – Blueprints (moduły routerów). app/schemas.py – Marshmallow schemas (walidacja + serializacja). app/config.py – konfiguracja per-environment. tests/ – pytest fixtures + testclient. requirements.txt + .env.example + Dockerfile.
Application Factory pattern
Zamiast globalnego app = Flask(__name__): def create_app(config): app = Flask(__name__); app.config.from_object(config); db.init_app(app); return app. Korzyści: wiele instancji aplikacji (testy), swobodne importowanie modeli bez circular imports, łatwe przełączanie konfiguracji (dev/test/prod).
Testing z pytest i Flask-Testing
Flask testclient: app.test_client(). Fixture: @pytest.fixture def client(): app = create_app("testing"); yield app.test_client(). Request: client.get("/api/users"). Assert: response.status_code == 200. Factory Boy: generowanie obiektów testowych. Coverage: pytest --cov=app --cov-report=html.
Jak działa generator szkieletu Flask
Generator działa jak konfigurator szablonów: każda opcja zaznaczona w formularzu — tryb aplikacji, baza danych, migracje, uwierzytelnianie, walidacja, cache — odpowiada zestawowi plików i fragmentów kodu zapisanych jako osobne szablony. Po zatwierdzeniu wyborów narzędzie najpierw rozwiązuje zależności między komponentami (wybór PostgreSQL pociąga za sobą sterownik bazy i zmienną połączenia w konfiguracji, wybór JWT wyklucza sesyjne widoki logowania), a dopiero potem renderuje drzewo katalogów projektu.
Mechanizm jest warunkowy. Trzon szkieletu — katalog aplikacji z fabryką, katalog na routery, katalog testów, pliki konfiguracyjne — pozostaje taki sam w każdej kombinacji, a różnice powstają na poziomie wstawianych bloków. Szablony korzystają z instrukcji warunkowych, dlatego plik z zależnościami zawiera wyłącznie biblioteki wynikające z wybranych opcji, a plik ze zmiennymi środowiskowymi i Dockerfile dostają właściwe wpisy dopiero po wyborze konkretnej bazy lub mechanizmu autoryzacji. Niezależnie od kombinacji struktura katalogów wygląda podobnie — zmienia się głównie zawartość plików.
Trzeci element to rozdzielenie konfiguracji od kodu. Generator przygotowuje osobne klasy konfiguracyjne dla środowiska deweloperskiego, testowego i produkcyjnego, a wartości wrażliwe przenosi do zmiennych środowiskowych. Cały proces to zwykłe renderowanie tekstu do plików: narzędzie nie uruchamia kodu, nie łączy się z bazą i nie instaluje zależności, więc wynik można najpierw przejrzeć, poprawić i dopiero wtedy wgrać do repozytorium.
Przykład: projekt REST API z PostgreSQL, JWT i Redisem
- Wybierasz tryb REST API. Zamiast szablonów Jinja i formularzy generator przygotuje moduły routerów zwracające JSON oraz spójną obsługę błędów w tym samym formacie.
- Ustawiasz bazę i migracje. Wybierasz PostgreSQL oraz Flask-Migrate. Do listy zależności trafiają wtedy Flask-SQLAlchemy, sterownik PostgreSQL i Flask-Migrate, a do konfiguracji — adres połączenia czytany ze zmiennej środowiskowej.
- Dodajesz uwierzytelnianie i walidację. Zaznaczasz JWT (flask-jwt-extended) oraz Marshmallow. Powstaje moduł schematów odpowiedzialny za walidację danych wejściowych i serializację odpowiedzi, a endpointy wymagające zalogowania dostają dekoratory sprawdzające token.
- Włączasz cache. Przy Flask-Caching wskazujesz backend Redis. W konfiguracji pojawia się typ backendu i adres serwera, a rozszerzenie jest inicjalizowane razem z pozostałymi.
- Pobierasz archiwum. W środku znajduje się katalog aplikacji z fabryką, modelami, routerami i schematami, katalog testów z konfiguracją środowiska testowego, plik ze zmiennymi środowiskowymi, Dockerfile oraz lista zależności.
- Uruchamiasz projekt. Rozpakowujesz archiwum, tworzysz środowisko wirtualne, instalujesz zależności, kopiujesz plik ze zmiennymi środowiskowymi i uzupełniasz dane połączenia, następnie wykonujesz kolejno inicjalizację migracji, wygenerowanie migracji i jej zastosowanie, a na końcu startujesz serwer deweloperski. Testy sprawdzasz jednym poleceniem pytest.
Wybór w generatorze a zawartość projektu
| Opcja w generatorze | Biblioteka | Co pojawia się w projekcie |
|---|---|---|
| Tryb REST API | brak dodatkowej biblioteki | router zwracający JSON, obsługa błędów w JSON, brak katalogu szablonów |
| Tryb Web App | Jinja2 i formularze | katalog szablonów, widoki renderujące HTML, obsługa formularzy |
| Baza danych (dev) | Flask-SQLAlchemy | modele, lokalny plik bazy, konfiguracja deweloperska |
| Baza PostgreSQL lub MySQL | Flask-SQLAlchemy i sterownik | adres połączenia oraz wpisy w pliku zmiennych środowiskowych |
| Migracje | Flask-Migrate (Alembic) | katalog migracji i polecenia zarządzania schematem bazy |
| Auth sesyjny | Flask-Login | model użytkownika, widoki logowania, ochrona tras |
| Auth tokenowy | flask-jwt-extended | endpointy wydające token i dekoratory wymagające JWT |
| Walidacja i cache | Marshmallow, WTForms, Flask-Caching | schematy albo formularze, konfiguracja backendu cache |
Praktyczne wskazówki
- Wybieraj tryb świadomie. REST API i Web App różnią się nie tylko warstwą widoków, ale też sposobem walidacji wejścia i formatem odpowiedzi błędów. Zmiana trybu po wygenerowaniu projektu oznacza ręczne przepisanie routerów.
- Nie mieszaj dwóch mechanizmów logowania. Flask-Login sprawdza się w aplikacji serwerowej z sesją w ciasteczku, JWT — w API dla klientów zewnętrznych. Wybór obu naraz daje dwa równoległe systemy do utrzymania i dwa źródła błędów.
- Traktuj plik ze zmiennymi środowiskowymi jak dokumentację. Pokazuje, jakich ustawień oczekuje konfiguracja. Uzupełnij go przed pierwszym uruchomieniem, ale prawdziwych sekretów nie wrzucaj do repozytorium.
- Migracje włącz od początku. Dodanie Flask-Migrate do istniejącego projektu wymaga ręcznego przygotowania katalogu migracji i porównania modeli ze stanem bazy. Prościej zacząć od inicjalizacji na pustej bazie i generować migrację po każdej zmianie modeli.
- Dockerfile to punkt wyjścia, nie gotowy deployment. Do uruchomienia lokalnego wystarcza, ale w produkcji zwykle potrzebujesz serwera WSGI, użytkownika innego niż root, reverse proxy oraz osobnych usług bazy i Redisa.
Ograniczenia generatora
- Brak logiki biznesowej. Narzędzie tworzy strukturę i połączenia między bibliotekami, ale nie wymyśli modeli domenowych, relacji w bazie ani reguł uprawnień. To trzeba dopisać samodzielnie.
- Nie weryfikuje zgodności wersji. Lista zależności zawiera nazwy bibliotek wynikające z wybranych opcji, ale nie sprawdza, czy wszystkie wersje pasują do siebie i do używanej wersji Pythona — to test po instalacji.
- Pomija konfigurację produkcyjną. Nie generuje ustawień serwera WWW, reverse proxy, certyfikatów, kolejki zadań ani monitoringu. Warstwa wdrożeniowa zostaje po stronie użytkownika.
- Nie tworzy migracji ani danych startowych. Pierwszą migrację trzeba wygenerować samemu po napisaniu modeli, a dane początkowe, konta administracyjne czy skrypty zasilające bazę nie są częścią szkieletu.
Najczęstsze pytania
Flask czy FastAPI – co wybrać w 2024?
Flask: większy ekosystem, dojrzałe rozszerzenia (Flask-Admin, Flask-SQLAlchemy), świetny dla web app + API, łatwiejszy dla początkujących. FastAPI: automatyczna dokumentacja OpenAPI, walidacja Pydantic, async/await natywnie, szybszy (ASGI). Wybór: Flask dla aplikacji CRUD i web, FastAPI dla pure API z dużym ruchem.
Jak zarządzać środowiskami (dev/prod) w Flask?
python-dotenv + .env plik. Config klasy: class DevelopmentConfig: DEBUG=True; class ProductionConfig: DEBUG=False. create_app(os.getenv("FLASK_ENV","development")). Zmienne wrażliwe (SECRET_KEY, DATABASE_URL): zawsze z env, nigdy w kodzie.
Jak wdrożyć Flask na produkcję?
Gunicorn: gunicorn -w 4 -b 0.0.0.0:8000 "app:create_app()". Nginx jako reverse proxy (upstream do Gunicorn). Supervisor lub systemd: auto-restart przy awarii. Docker: FROM python:3.12-slim + pip install + CMD gunicorn. Heroku/Railway: Procfile: web: gunicorn app:create_app().
Co to są Blueprints i kiedy ich używać?
Blueprint to moduł grupujący powiązane routes, templates, static files. Przykład: auth_bp = Blueprint("auth", __name__, url_prefix="/auth"). Kiedy używać: aplikacja > 5-10 routerów, różne obszary funkcjonalne (auth, admin, api, blog). Blueprints nie są modułami – mogą importować modele z app/.
Jak dodać CORS do Flask API?
pip install flask-cors. from flask_cors import CORS. CORS(app, origins=["https://frontend.com"]). Dla all origins (dev): CORS(app). Per-route: @cross_origin(). Preflight OPTIONS: obsługiwane automatycznie. Credentials: CORS(app, supports_credentials=True).
Czy generator szkieletu Flask jest darmowy?
Tak, narzędzie działa w przeglądarce bez rejestracji, a wygenerowany kod możesz wykorzystać w dowolnym projekcie. Nie ma limitu liczby wygenerowanych szkieletów.
Czym różni się tryb REST API od Web App?
Tryb REST API przygotowuje routery zwracające JSON i obsługę błędów w tym formacie, bez katalogu szablonów. Tryb Web App dodaje szablony Jinja2, widoki HTML i obsługę formularzy.
Czy mogę wybrać jednocześnie Flask-Login i JWT?
Technicznie da się połączyć oba mechanizmy, ale generator traktuje je jako alternatywne rozwiązania tego samego problemu. Wybór jednego z nich daje spójniejszy i łatwiejszy w utrzymaniu kod.
Jakie polecenia uruchomić po wygenerowaniu projektu?
Po rozpakowaniu archiwum zainstaluj zależności, skopiuj plik ze zmiennymi środowiskowymi i uzupełnij dane, następnie wykonaj inicjalizację migracji, wygenerowanie migracji oraz jej zastosowanie, a na końcu uruchom serwer deweloperski.
Czy wygenerowany szkielet nadaje się od razu na produkcję?
Struktura projektu i Dockerfile są dobrym punktem wyjścia, ale przed wdrożeniem trzeba dodać serwer WSGI, zabezpieczyć sekrety, skonfigurować bazę i cache jako osobne usługi oraz włączyć monitoring i logowanie błędów.
Powiązane narzędzia: generator szkieletu Express.js, generator GitLab CI/CD i walidator JSON.