155 lines
4.5 KiB
Python
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,
|
|
),
|
|
)
|