/
zhikovkoly
/
Lab1_api
Обзор
Документация
Войти
/
zhikovkoly
/
Lab1_api
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/app.py
123 строки
4 KB
Zhikov-Nikolay
first_commit
19 янв 2026, 18:15
19 янв 2026, 18:15
b7dd5a5
Код
Авторство
О чём код?
from flask import Flask, jsonify, request from flask_restx import Api from .database import db from .routes import api_v1, api_v2 import os def create_app(): app = Flask(__name__) # Конфигурация app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'sqlite:///library.db') app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['RESTX_MASK_SWAGGER'] = False app.config['ERROR_INCLUDE_MESSAGE'] = False # Инициализация БД db.init_app(app) # Создаем API с правильной конфигурацией api = Api( app, version='1.0', title='Library API', description='A simple Library Management System API', doc='/swagger/', authorizations={ 'api_key': { 'type': 'apiKey', 'in': 'header', 'name': 'X-API-Key' } }, security='api_key' ) # Важно: сначала добавить namespaces в API api.add_namespace(api_v1, path='/api/v1') api.add_namespace(api_v2, path='/api/v2') # Инициализация БД with app.app_context(): db.create_all() # Добавим тестовые данные from .models import Book if Book.query.count() == 0: books = [ Book(title='The Great Gatsby', author='F. Scott Fitzgerald', isbn='9780743273565', year=1925, available=True), Book(title='To Kill a Mockingbird', author='Harper Lee', isbn='9780061120084', year=1960, available=True), Book(title='1984', author='George Orwell', isbn='9780451524935', year=1949, available=False), ] for book in books: db.session.add(book) db.session.commit() print(f"Added {len(books)} test books to database") # Корневой маршрут @app.route('/') def home(): return jsonify({ "message": "Library Management API", "versions": { "v1": { "books": "/api/v1/books", "readers": "/api/v1/readers" }, "v2": { "books": "/api/v2/books" } }, "documentation": "/swagger/", "health": "/health" }) # Health check @app.route('/health') def health(): try: # Проверяем подключение к БД from .models import Book book_count = Book.query.count() return jsonify({ "status": "healthy", "service": "library-api", "database": "connected", "books_count": book_count }) except Exception as e: return jsonify({ "status": "unhealthy", "error": str(e) }), 500 # Простой маршрут для проверки аутентификации @app.route('/test-auth') def test_auth(): from .auth import verify_api_key api_key = request.headers.get('X-API-Key') if verify_api_key(api_key): return jsonify({"message": "Authentication successful"}) return jsonify({"error": "Invalid API key"}), 401 # Глобальный обработчик 404 @app.errorhandler(404) def not_found(error): return jsonify({ "error": "Not Found", "message": "The requested URL was not found on the server", "available_routes": [ {"path": "/", "methods": ["GET"], "description": "API information"}, {"path": "/health", "methods": ["GET"], "description": "Health check"}, {"path": "/api/v1/books", "methods": ["GET", "POST"], "description": "List/create books"}, {"path": "/api/v1/books/<id>", "methods": ["GET", "PUT", "DELETE"], "description": "Get/update/delete book"}, {"path": "/api/v1/readers", "methods": ["GET", "POST"], "description": "List/create readers"}, {"path": "/api/v2/books", "methods": ["GET", "POST"], "description": "Books API v2"}, {"path": "/swagger/", "methods": ["GET"], "description": "API documentation"} ] }), 404 return app