120 lines
3.0 KiB
Python
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)
|