Compare commits
2 commits
0f45b7f73c
...
2db844c4b4
| Author | SHA1 | Date | |
|---|---|---|---|
| 2db844c4b4 | |||
| 454b5849a9 |
3 changed files with 53 additions and 22 deletions
43
app.py
43
app.py
|
|
@ -5,6 +5,7 @@ Modularized version with Blueprints
|
|||
|
||||
import logging
|
||||
import os
|
||||
import socket
|
||||
from flask import Flask
|
||||
from flask_wtf.csrf import CSRFProtect
|
||||
from models import db
|
||||
|
|
@ -99,12 +100,38 @@ def create_app(config: dict | None = None) -> Flask:
|
|||
app = create_app()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
logger.info("=" * 50)
|
||||
logger.info("Tipptrainer gestartet")
|
||||
logger.info(f"Version: {app.config['APP_VERSION']}")
|
||||
logger.info(f"Lektionen geladen: {len(app.config['LESSONS'])}")
|
||||
logger.info("Debug-Info verfügbar unter: http://127.0.0.1:5000/debug")
|
||||
logger.info("=" * 50)
|
||||
def get_lan_ip() -> str:
|
||||
"""Ermittelt die LAN-IP-Adresse dieses Rechners (Best-Effort).
|
||||
|
||||
app.run(debug=True, host='0.0.0.0', port=5000)
|
||||
Öffnet einen UDP-Socket zu einer externen Adresse, um das ausgehende
|
||||
Interface zu bestimmen – es werden dabei keine Daten gesendet.
|
||||
Fällt bei Fehlern auf 127.0.0.1 zurück.
|
||||
"""
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
try:
|
||||
s.connect(('8.8.8.8', 80))
|
||||
return s.getsockname()[0]
|
||||
except OSError:
|
||||
return '127.0.0.1'
|
||||
finally:
|
||||
s.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
DEBUG = True
|
||||
PORT = 5000
|
||||
|
||||
# Banner genau einmal ausgeben: ohne Reloader sofort, mit Reloader nur
|
||||
# im Worker-Prozess (WERKZEUG_RUN_MAIN), nicht im Supervisor.
|
||||
if not DEBUG or os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
|
||||
lan_ip = get_lan_ip()
|
||||
logger.info("=" * 50)
|
||||
logger.info("Tipptrainer gestartet")
|
||||
logger.info(f"Version: {app.config['APP_VERSION']}")
|
||||
logger.info(f"Lektionen geladen: {len(app.config['LESSONS'])}")
|
||||
logger.info(f"Tipp-Training lokal: http://127.0.0.1:{PORT}")
|
||||
logger.info(f"Tipp-Training im LAN: http://{lan_ip}:{PORT}")
|
||||
logger.info(f"Debug-Info: http://127.0.0.1:{PORT}/debug")
|
||||
logger.info("=" * 50)
|
||||
|
||||
app.run(debug=DEBUG, host='0.0.0.0', port=PORT)
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import unittest
|
|||
import os
|
||||
os.environ['FLASK_TESTING'] = 'true' # Set before importing app
|
||||
|
||||
from app import app, db
|
||||
from app import create_app, db
|
||||
from models import Progress, LessonProgress
|
||||
from services.progress_service import ProgressService
|
||||
|
||||
|
|
@ -15,10 +15,11 @@ class TestProgressServiceIntegration(unittest.TestCase):
|
|||
|
||||
def setUp(self):
|
||||
"""Setup: Test-App und In-Memory-Datenbank"""
|
||||
app.config['TESTING'] = True
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
|
||||
app.config['WTF_CSRF_ENABLED'] = False
|
||||
self.app = app
|
||||
self.app = create_app({
|
||||
'TESTING': True,
|
||||
'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:',
|
||||
'WTF_CSRF_ENABLED': False,
|
||||
})
|
||||
self.app_context = self.app.app_context()
|
||||
self.app_context.push()
|
||||
db.create_all()
|
||||
|
|
@ -259,10 +260,12 @@ class TestResolveCurrentLessonIndex(unittest.TestCase):
|
|||
"""Tests für die zentrale Lektions-Auflösung (Resume + Validierung)."""
|
||||
|
||||
def setUp(self):
|
||||
app.config['TESTING'] = True
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
|
||||
app.config['WTF_CSRF_ENABLED'] = False
|
||||
self.app_context = app.app_context()
|
||||
self.app = create_app({
|
||||
'TESTING': True,
|
||||
'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:',
|
||||
'WTF_CSRF_ENABLED': False,
|
||||
})
|
||||
self.app_context = self.app.app_context()
|
||||
self.app_context.push()
|
||||
db.create_all()
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import os
|
|||
os.environ['FLASK_TESTING'] = 'true' # Set before importing app
|
||||
|
||||
from datetime import timedelta, date
|
||||
from app import app, db
|
||||
from app import create_app, db
|
||||
from models import LessonStatistic, DailyPractice
|
||||
from services.statistics_service import StatisticsService
|
||||
|
||||
|
|
@ -16,10 +16,11 @@ class TestStatisticsServiceIntegration(unittest.TestCase):
|
|||
|
||||
def setUp(self):
|
||||
"""Setup: Test-App und In-Memory-Datenbank"""
|
||||
app.config['TESTING'] = True
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
|
||||
app.config['WTF_CSRF_ENABLED'] = False
|
||||
self.app = app
|
||||
self.app = create_app({
|
||||
'TESTING': True,
|
||||
'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:',
|
||||
'WTF_CSRF_ENABLED': False,
|
||||
})
|
||||
self.app_context = self.app.app_context()
|
||||
self.app_context.push()
|
||||
db.create_all()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue