beerds/server/main.py

155 lines
4.5 KiB
Python

from pathlib import Path
import os
import markdown
from litestar import (
Controller,
get,
post,
MediaType,
Litestar,
)
from litestar.enums import RequestEncodingType
from litestar.datastructures import UploadFile
from litestar.params import Body
from litestar.exceptions import HTTPException
from litestar.contrib.jinja import JinjaTemplateEngine
from litestar.template.config import TemplateConfig
from litestar.response import Template
from litestar.static_files import create_static_files_router
from server.services.descriptions import CharactersService, Breed, CharactersRepository
from server.services.recognizer import RecognizerService, RecognizerRepository
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
recognizer_service = RecognizerService(RecognizerRepository())
characters_service = CharactersService(CharactersRepository())
class BreedsController(Controller):
path = "/beerds"
@post("/dogs")
async def beerds_dogs(
self, data: UploadFile = Body(media_type=RequestEncodingType.MULTI_PART)
) -> dict:
body = await data.read()
return await recognizer_service.predict_dog_image(body)
@post("/cats")
async def beerds_cats(
self, data: UploadFile = Body(media_type=RequestEncodingType.MULTI_PART)
) -> dict:
body = await data.read()
return await recognizer_service.predict_cat_image(body)
class DescriptionController(Controller):
path = "/"
@get("/")
async def dogs(self) -> Template:
return Template(template_name="dogs.html")
@get("/cats")
async def cats(self) -> Template:
return Template(template_name="cats.html")
@get("/contacts")
async def contacts(self) -> Template:
return Template(template_name="contacts.html")
@get("/donate")
async def donate(self) -> Template:
return Template(template_name="donate.html")
@get("/dogs-characteristics")
async def dogs_characteristics(self) -> Template:
breeds = await characters_service.get_characters()
return Template(
template_name="dogs-characteristics.html", context={"breeds": breeds}
)
@get("/dogs-characteristics/{name:str}")
async def beer_description(self, name: str) -> Template:
breed = await characters_service.get_character(name)
if breed is None:
raise HTTPException(status_code=404, detail="Порода не найдена")
images = await recognizer_service.images_dogs()
return Template(
template_name="beers-description.html",
context={
"text": markdown.markdown(breed.description),
"title": breed.name,
"images": [f"/static/assets/dog/{name}/{i}" for i in images[name]],
},
)
@get("/sitemap.xml", media_type=MediaType.XML)
async def sitemaps(self) -> bytes:
breeds: list[Breed] = await characters_service.get_characters()
lastmod = "2025-10-04T19:01:03+00:00"
beers_url = ""
for b in breeds:
beers_url += f"""
<url>
<loc>https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/dogs-characteristics/{b.alias}</loc>
<lastmod>{lastmod}</lastmod>
</url>
"""
return f"""<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<!-- created with Free Online Sitemap Generator www.xml-sitemaps.com -->
<url>
<loc>https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/</loc>
<lastmod>{lastmod}</lastmod>
</url>
<url>
<loc>https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/cats</loc>
<lastmod>{lastmod}</lastmod>
</url>
<url>
<loc>https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/donate</loc>
<lastmod>{lastmod}</lastmod>
</url>
<url>
<loc>https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/dogs-characteristics</loc>
<lastmod>{lastmod}</lastmod>
</url>
{beers_url}
</urlset>
""".encode()
@get("/robots.txt", media_type=MediaType.TEXT)
async def robots(self) -> str:
return """
User-agent: *
Allow: /
Sitemap: https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/sitemap.xml
"""
app = Litestar(
debug=True,
route_handlers=[
BreedsController,
DescriptionController,
create_static_files_router(path="/static", directories=["server/static"]),
],
template_config=TemplateConfig(
directory=Path("server/templates"),
engine=JinjaTemplateEngine,
),
)