Sprytne Okazje — promocje, kody rabatowe i wyprzedaże

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.

Bezpieczne (SSL)
Przetwarzanie Lokalne
100% Darmowe
Instrukcja
  • 1
    Wprowadź dane
    Wpisz treść, wklej tekst lub załaduj plik z dysku.
  • 2
    Kliknij przycisk
    Narzędzie natychmiast przetworzy Twoje dane w przeglądarce.
  • 3
    Pobierz wynik
    Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
function runTool() {
  return "Wynik gotowy w 0.1s";
}
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()
zip base64: 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AQI/AxQAAgAIANpWJV1U3w6EnwAAAAwBAAArAAAAAAAAAAAAAAC2geUJAABhY21lLWZsYXNrLWFwaS9hY21lX2ZsYXNrX2FwaS9leHRlbnNpb25zLnB5UEsBAj8DFAAAAAAA2lYlXQAAAAAAAAAAAAAAADQAAAAAAAAAAAAAALaBzQoAAGFjbWUtZmxhc2stYXBpL2FjbWVfZmxhc2tfYXBpL2JsdWVwcmludHMvX19pbml0X18ucHlQSwECPwMUAAAAAADaViVdAAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAtoEfCwAAYWNtZS1mbGFzay1hcGkvYWNtZV9mbGFza19hcGkvYmx1ZXByaW50cy9oZWFsdGgvX19pbml0X18ucHlQSwECPwMUAAIACADaViVdhZ3+e3MAAACQAAAAOQAAAAAAAAAAAAAAtoF4CwAAYWNtZS1mbGFzay1hcGkvYWNtZV9mbGFza19hcGkvYmx1ZXByaW50cy9oZWFsdGgvcm91dGVzLnB5UEsBAj8DFAAAAAAA2lYlXQAAAAAAAAAAAAAAADsAAAAAAAAAAAAAALaBQgwAAGFjbWUtZmxhc2stYXBpL2FjbWVfZmxhc2tfYXBpL2JsdWVwcmludHMvYXBpX3YxL19faW5pdF9fLnB5UEsBAj8DFAACAAgA2lYlXQrmvoS0AAAACQEAADkAAAAAAAAAAAAAALaBmwwAAGFjbWUtZmxhc2stYXBpL2FjbWVfZmxhc2tfYXBpL2JsdWVwcmludHMvYXBpX3YxL3JvdXRlcy5weVBLAQI/AxQAAgAIANpWJV3nKho10gAAADIBAAAnAAAAAAAAAAAAAAC2gaYNAABhY21lLWZsYXNrLWFwaS9hY21lX2ZsYXNrX2FwaS9tb2RlbHMucHlQSwECPwMUAAAAAADaViVdAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAtoG9DgAAYWNtZS1mbGFzay1hcGkvdGVzdHMvX19pbml0X18ucHlQSwECPwMUAAIACADaViVdIM9ydJEAAADlAAAAIwAAAAAAAAAAAAAAtoH7DgAAYWNtZS1mbGFzay1hcGkvdGVzdHMvdGVzdF9oZWFsdGgucHlQSwECPwMUAAIACADaViVd7nm4C58AAAD/AAAAIwAAAAAAAAAAAAAAtoHNDwAAYWNtZS1mbGFzay1hcGkvdGVzdHMvdGVzdF9hcGlfdjEucHlQSwECPwMUAAIACADaViVdETkVIcAAAAAIAQAAGQAAAAAAAAAAAAAAtoGtEAAAYWNtZS1mbGFzay1hcGkvRG9ja2VyZmlsZVBLAQI/AxQAAgAIANpWJV10z47NQQAAAFgAAAAhAAAAAAAAAAAAAAC2gaQRAABhY21lLWZsYXNrLWFwaS9kb2NrZXItY29tcG9zZS55bWxQSwUGAAAAABYAFgAoBwAAJBIAAAAA zip name: acme-flask-api.zip

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.

generator Flask boilerplate szkielet Flask Python Flask REST API starter Flask project structure

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.

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).

Powiązane narzędzia: generator szkieletu Express.js, generator GitLab CI/CD i walidator JSON.

Zainstaluj Webp.pl Miej narzędzia we własnej kieszeni!