lerafoxqueen/main_package/app.py

120 lines
3.0 KiB
Python

import uvicorn
# import pathlib
import datetime
import uuid
from contextlib import asynccontextmanager
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import HTMLResponse, JSONResponse, PlainTextResponse, FileResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi_sitemap import SiteMap, URLInfo
from .database import create_tables, delete_tables
from .router import router as datings_router
from .validity import is_valid_uuid
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
OPENAPI_URL: str = "/openapi.json"
model_config = SettingsConfigDict(
env_file=(".env", ".env.local", ".env.prod"),
env_file_encoding="utf-8",
case_sensitive=True
)
settings = Settings()
@asynccontextmanager
async def lifespan(app: FastAPI):
await create_tables()
print("База готова")
yield
# await delete_tables()
# print("База очищена")
pass
app = FastAPI(
lifespan=lifespan, docs_url=None, redoc_url=None, openapi_url=settings.OPENAPI_URL
)
favicon_path = "static/assets/img/favicons/favicon.ico"
templates = Jinja2Templates(directory="templates")
app.include_router(datings_router)
app.mount("/static", StaticFiles(directory="static"), name="static")
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
response = templates.TemplateResponse("index.html", {"request": request})
sessionKey = request.cookies.get("sessionkey")
if isinstance(sessionKey, str) and is_valid_uuid(sessionKey):
pass
else:
days = 365
expires_t_obj = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(
days=days
)
expires_t_str = expires_t_obj.strftime("%a, %d %b %Y %H:%M:%S GMT")
response.set_cookie(
key="sessionkey", value=str(uuid.uuid4()), expires=expires_t_str
)
return response
@app.get("/favicon.ico", include_in_schema=False)
async def favicon():
return FileResponse(favicon_path)
@app.get("/robots.txt", response_class=PlainTextResponse)
def robots():
data = """User-agent: *\nAllow: /\nSitemap: /sitemap.xml"""
return data
@app.exception_handler(HTTPException)
async def http_exception_handler(request, exc):
return JSONResponse(status_code=exc.status_code, content={"detail": exc.detail})
sitemap = SiteMap(
app=app,
base_url="https://lerafoxqueen.ru",
static_dirs=["static", "docs"],
exclude_patterns=[
"^/api/",
"^/docs/",
"^/datings",
"^/api/",
"^/admin/",
], # optional: exclude patterns
include_dynamic=True,
changefreq="daily",
priority_map={
"/": 1.0,
},
gzip=True, # optional: make a gz version too
)
sitemap.attach() # now GET /sitemap.xml is live
# @sitemap.source
# def extra_urls():
# yield URLInfo("https://lerafoxqueen.ru/sitemap.xml")
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8001)