/
ViliaIbatullina
/
HTML
Обзор
Документация
Войти
/
ViliaIbatullina
/
HTML
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
pr7
148 строк
5 KB
ViliaIbatullina
practice_7
19 апр 2025, 07:13
19 апр 2025, 07:13
ab04ff0
Код
Авторство
О чём код?
import random import datetime from fastapi import FastAPI, HTTPException, Depends, Header from pydantic import BaseModel, Field from sqlalchemy import create_engine, Column, Integer, String, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, Session from passlib.context import CryptContext import jwt from typing import List # Настройки DATABASE_URL = "sqlite:///./test.db" SECRET_KEY = "your_secret_key" # Измените на более безопасный ключ ALGORITHM = "HS256" # Создание базы данных Base = declarative_base() engine = create_engine(DATABASE_URL) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # Модели базы данных class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) login = Column(String, unique=True, index=True) hashed_password = Column(String) class Token(Base): __tablename__ = "tokens" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) token = Column(String, unique=True) Base.metadata.create_all(bind=engine) # Настройка хэширования паролей pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") # FastAPI приложение app = FastAPI() # Модели данных class LoginRequest(BaseModel): login: str password: str class ChartResponse(BaseModel): id: int name: str class ChartDataResponse(BaseModel): timestamp: datetime.datetime value: float # Генерация данных для графиков def generate_chart_data(duration_days=2, interval_minutes=1): data = [] end_time = datetime.datetime.now() start_time = end_time - datetime.timedelta(days=duration_days) current_time = start_time value = random.uniform(50, 60) while current_time <= end_time: step = random.uniform(-1, 1) value += step value = max(0, min(100, value)) data.append({ 'timestamp': current_time, 'value': value }) current_time += datetime.timedelta(minutes=interval_minutes) return data # Авторизация пользователя @app.post("/login") def login(request: LoginRequest, db: Session = Depends(SessionLocal)): user = db.query(User).filter(User.login == request.login).first() if not user or not pwd_context.verify(request.password, user.hashed_password): raise HTTPException(status_code=401, detail="Invalid credentials") # Генерация токена token = jwt.encode({"user_id": user.id}, SECRET_KEY, algorithm=ALGORITHM) # Сохранение токена в БД db_token = Token(user_id=user.id, token=token) db.add(db_token) db.commit() db.refresh(db_token) return {"token": token} # Получение списка доступных графиков @app.get("/charts", response_model=List[ChartResponse]) def get_charts(authorization: str = Header(...)): try: payload = jwt.decode(authorization, SECRET_KEY, algorithms=[ALGORITHM]) except jwt.PyJWTError: raise HTTPException(status_code=401, detail="Invalid token") return [ {"id": 1, "name": "Chart 1"}, {"id": 2, "name": "Chart 2"}, ] # Получение данных дашборда @app.get("/chart/{chart_id}", response_model=List[ChartDataResponse]) def get_chart_data(chart_id: int, time_range: str, authorization: str = Header(...)): if time_range not in ["5m", "10m", "30m", "1h", "1d", "2d"]: raise HTTPException(status_code=400, detail="Invalid time range") try: payload = jwt.decode(authorization, SECRET_KEY, algorithms=[ALGORITHM]) except jwt.PyJWTError: raise HTTPException(status_code=401, detail="Invalid token") duration_days = 2 # По умолчанию, если не указано иное if time_range == "5m": duration_days = 0 # 5 минут elif time_range == "10m": duration_days = 0 # 10 минут elif time_range == "30m": duration_days = 0 # 30 минут elif time_range == "1h": duration_days = 0 # 1 час elif time_range == "1d": duration_days = 1 # 1 день elif time_range == "2d": duration_days = 2 # 2 дня # Генерация данных для графика if chart_id == 1: data = generate_chart_data(duration_days=duration_days, interval_minutes=1) elif chart_id == 2: data = generate_chart_data(duration_days=duration_days, interval_minutes=1) else: raise HTTPException(status_code=404, detail="Chart not found") return data # Запуск приложения if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)