diff --git a/.containerignore b/.containerignore index cb19d53..1f26113 100644 --- a/.containerignore +++ b/.containerignore @@ -29,4 +29,7 @@ dist-ssr uploads/ .env +poems.txt +poem_pic/ + __pycache__ \ No newline at end of file diff --git a/.gitignore b/.gitignore index 4722370..e84596a 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,6 @@ uploads/ .env poem_pic/ +poem_pic/ + __pycache__ \ No newline at end of file diff --git a/README.md b/README.md index b546806..db0fda9 100644 --- a/README.md +++ b/README.md @@ -35,5 +35,5 @@ Only docker/podman are required ```sh docker build . -t porridger:build -docker run --name porridger -p 8000:8000 -v ./sql_app.db:/srv/sql_app.db -v uploads:/srv/uploads -v poem_pic:/srv/poem_pic porridger:build +docker run --name porridger -p 8000:8000 -v ./sql_app.db:/srv/sql_app.db -v ./poems.txt:/srv/poems.txt -v ./poem_pic:/srv/poem_pic -v uploads:/srv/uploads porridger:build ``` diff --git a/alembic.ini b/alembic.ini index e041d95..3bbc0cf 100644 --- a/alembic.ini +++ b/alembic.ini @@ -4,8 +4,9 @@ # path to migration scripts script_location = migrations -# template used to generate migration files -# file_template = %%(rev)s_%%(slug)s +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s # sys.path path, will be prepended to sys.path if present. # defaults to the current working directory. @@ -48,11 +49,16 @@ prepend_sys_path = . # version_path_separator = space version_path_separator = os # Use os.pathsep. Default configuration used for new projects. +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + # the output encoding used when revision files # are written from script.py.mako # output_encoding = utf-8 -# sqlalchemy.url = driver://user:pass@localhost/dbname +; sqlalchemy.url = driver://user:pass@localhost/dbname [post_write_hooks] @@ -66,6 +72,12 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne # black.entrypoint = black # black.options = -l 79 REVISION_SCRIPT_FILENAME +# lint with attempts to fix using "ruff" - use the exec runner, execute a binary +# hooks = ruff +# ruff.type = exec +# ruff.executable = %(here)s/.venv/bin/ruff +# ruff.options = --fix REVISION_SCRIPT_FILENAME + # Logging configuration [loggers] keys = root,sqlalchemy,alembic diff --git a/back/add_poems_and_filters.py b/back/add_poems_and_filters.py index 6c6116f..6098811 100644 --- a/back/add_poems_and_filters.py +++ b/back/add_poems_and_filters.py @@ -1,18 +1,17 @@ from sqlalchemy.orm import Session +from sqlalchemy.sql import text, literal_column +from sqlalchemy.ext.asyncio import AsyncSession from typing import Annotated from fastapi import Depends -from . import auth_utils, orm_models, pydantic_schemas +from sqlalchemy import select, or_, and_ import datetime -# Переменные для получения данных о мусорках с внешнего API -# url API -BASE_URL='https://geointelect2.gate.petersburg.ru'#адрес сайта и мой токин -# токен для получения данных -my_token='eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODM3ODk4NjgsImlhdCI6MTY4OTA5NTQ2OCwianRpIjoiNDUzNjQzZTgtYTkyMi00NTI4LWIzYmMtYWJiYTNmYjkyNTkxIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6ImM2ZDJiOTZhLWMxNjMtNDAxZS05ZjMzLTI0MmE0NDcxMDY5OCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJjNmQyYjk2YS1jMTYzLTQwMWUtOWYzMy0yNDJhNDQ3MTA2OTgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.E2bW0B-c6W5Lj63eP_G8eI453NlDMnW05l11TZT0GSsAtGayXGaolHtWrmI90D5Yxz7v9FGkkCmcUZYy1ywAdO9dDt_XrtFEJWFpG-3csavuMjXmqfQQ9SmPwDw-3toO64NuZVv6qVqoUlPPj57sLx4bLtVbB4pdqgyJYcrDHg7sgwz4d1Z3tAeUfSpum9s5ZfELequfpLoZMXn6CaYZhePaoK-CxeU3KPBPTPOVPKZZ19s7QY10VdkxLULknqf9opdvLs4j8NMimtwoIiHNBFlgQz10Cr7bhDKWugfvSRsICouniIiBJo76wrj5T92s-ztf1FShJuqnQcKE_QLd2A' +from . import auth_utils, orm_models, pydantic_schemas + # Загружаем стихи -def add_poems_to_db(db: Session): - f1 = open('text121.txt', encoding='utf-8', mode='r')#открыть фаил для чтения на русском +async def add_poems_to_db(async_db: AsyncSession): + f1 = open('poems.txt', encoding='utf-8', mode='r')#открыть фаил для чтения на русском for a in range(1, 110): f1.seek(0)#перейти к началу i=0 @@ -36,40 +35,78 @@ def add_poems_to_db(db: Session): author += str1 poem = orm_models.Poems(title=name, text=stixi, author=author) # В конце каждой итерации добавляем в базу данных - db.add(poem) - db.commit() - # db.refresh(poem) + async_db.add(poem) + async_db.commit() + # close the file f1.close() - -def filter_ann(schema: pydantic_schemas.SortAnnouncements, db: Annotated[Session, Depends(auth_utils.get_db)]): +async def filter_ann(schema: pydantic_schemas.SortAnnouncements, db: AsyncSession): """Функция для последовательного применения различных фильтров (через схему SortAnnouncements)""" - res = db.query(orm_models.Announcement) fields = schema.__dict__ # параметры передоваемой схемы SortAnnouncements (ключи и значения) # проходим по названиям фильтров и их значениям - for name, filt in fields.items(): + # выбираем все строки + query = await db.execute(select(orm_models.Announcement)) + res = set(query.scalars().all()) + for name, filt_val in fields.items(): + # res = await db.execute(statement) # если фильтр задан - if filt is not None: - d = {name: filt} - # фильтруем - res = res.filter_by(**d) + if filt_val is not None: + if name == "obsolete": + filt_val = bool(filt_val) + filter_query = await db.execute(select(orm_models.Announcement).where(literal_column(f"announcements.{name}") == filt_val)) + filtered = set(filter_query.scalars().all()) + res = res.intersection(filtered) + # # отфильтровываем подходящие объявления + # res = await db.execute( + # select(orm_models.Announcement).where( + # ((schema.obsolete == None) | ((schema.obsolete != None) & (orm_models.Announcement.obsolete == schema.obsolete))) + # & ((schema.user_id == None) | ((schema.user_id != None) & (orm_models.Announcement.user_id == schema.user_id))) + # & ((schema.metro == None) | ((schema.metro != None) & (orm_models.Announcement.metro == schema.metro))) + # & ((schema.category == None) | ((schema.category != None) & (orm_models.Announcement.category == schema.category))) + # ) + # ) + + + # .where(schema.user_id != None and orm_models.Announcement.user_id == schema.user_id) + # .where(schema.metro != None and orm_models.Announcement.metro == schema.metro) + # .where(schema.category != None and orm_models.Announcement.category == schema.category) + # statement = text("SELECT * FROM announcements " + # "WHERE announcements.obsolete = :obsolete " + # "INTERSECT" + # "SELECT * FROM announcements " + # "WHERE announcements.user_id == :user_id " + # "INTERSECT" + # "SELECT * FROM announcements " + # "WHERE announcements.metro == :metro " + # "INTERSECT" + # "SELECT * FROM announcements " + # "WHERE announcements.category == :category") + + # res = await db.execute(statement, + # {"obsolete": schema.obsolete, + # "user_id": schema.user_id, + # "metro": schema.metro, + # "category": schema.category} + # ) + # возвращаем все подходящие объявления - return res.all() + return res -def check_obsolete(db: Annotated[Session, Depends(auth_utils.get_db)], current_date: datetime.date): +async def check_obsolete(db: AsyncSession, current_date: datetime.date): """ Функция участвует в процессе обновления поля obsolete у всех объявлений раз в сутки """ # обращаемся ко всем объявлениям бд - announcements = db.query(orm_models.Announcement).all() + query_announcements = await db.execute(select(orm_models.Announcement)) + announcements = query_announcements.scalars().all() # для каждого объявления for ann in announcements: # если просрочено if ann.best_by < current_date: ann.obsolete = True - db.commit() - db.refresh(ann) # обновляем состояние объекта + await db.commit() + await db.refresh(ann) # обновляем состояние объекта diff --git a/back/api.py b/back/api.py index 177373d..3bb1904 100644 --- a/back/api.py +++ b/back/api.py @@ -10,6 +10,7 @@ from fastapi.requests import Request from typing import Any, Annotated, List, Union from starlette.staticfiles import StaticFiles from sqlalchemy.orm import Session +from sqlalchemy import select import requests from uuid import uuid4 @@ -22,15 +23,18 @@ import pathlib import shutil import os -from .db import database from . import add_poems_and_filters, auth_utils, orm_models, pydantic_schemas +from .config import TRASHBOXES_BASE_URL, TRASHBOXES_TOKEN + # создаем приложение Fastapi app = FastAPI() # Jinja2 - шаблоны templates = Jinja2Templates(directory="./front/dist") +# хранение картинок для стихов +app.mount("/poem_pic", StaticFiles(directory = "./poem_pic")) # создаем эндпоинт для хранения статических файлов app.mount("/static", StaticFiles(directory = "./front/dist")) # проверяем, что папка uploads еще не создана @@ -39,85 +43,98 @@ if not os.path.exists("./uploads"): # создаем эндпоинт для хранения файлов пользователя app.mount("/uploads", StaticFiles(directory = "./uploads")) +# эндпоинт для возвращения согласия в pdf +@app.get("/privacy_policy.pdf") +async def privacy_policy(): + return FileResponse("./privacy_policy.pdf") # получение списка объявлений @app.get("/api/announcements", response_model=List[pydantic_schemas.Announcement])#адрес объявлений -def announcements_list(db: Annotated[Session, Depends(auth_utils.get_db)], obsolete: Union[bool, None] = False, user_id: Union[int, None] = None, +async def announcements_list(db: Annotated[Session, Depends(auth_utils.get_session)], obsolete: Union[bool, None] = False, user_id: Union[int, None] = None, metro: Union[str, None] = None,category: Union[str, None] = None): # параметры для сортировки (схема pydantic schemas.SortAnnouncements) params_to_sort = pydantic_schemas.SortAnnouncements(obsolete=obsolete, user_id=user_id, metro=metro, category=category) # получаем результат - result = add_poems_and_filters.filter_ann(db=db, schema=params_to_sort) + result = await add_poems_and_filters.filter_ann(db=db, schema=params_to_sort) return result # получаем данные одного объявления @app.get("/api/announcement", response_model=pydantic_schemas.AnnResponce) -def single_announcement(ann_id:int, db: Annotated[Session, Depends(auth_utils.get_db)]): # передаем индекс обявления +async def single_announcement(ann_id:int, db: Annotated[Session, Depends(auth_utils.get_session)]): # передаем индекс обявления # Считываем данные из Body и отображаем их на странице. # В последствии будем вставлять данные в html-форму - try: - announcement = db.get(orm_models.Announcement, ann_id) - return announcement - except: - return {"Answer" : False} #если неуданый доступ, то сообщаем об этом + announcement = await db.get(orm_models.Announcement, ann_id) + #announcement = await db.execute(select(orm_models.Announcement)).scalars().all() + if not announcement: + raise HTTPException(status_code=404, detail="Item not found") + return announcement # Занести объявление в базу данных @app.put("/api/announcement") -def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form()], bestBy: Annotated[datetime.date, Form()], +async def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form()], bestBy: Annotated[datetime.date, Form()], address: Annotated[str, Form()], longtitude: Annotated[float, Form()], latitude: Annotated[float, Form()], description: Annotated[str, Form()], metro: Annotated[str, Form()], current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_active_user)], - db: Annotated[Session, Depends(auth_utils.get_db)], src: Union[UploadFile, None] = None, trashId: Annotated[int, Form()] = None): + db: Annotated[Session, Depends(auth_utils.get_session)], src: Union[UploadFile, None] = None, trashId: Annotated[int, Form()] = None): + + # имя загруженного файла по умолчанию - пустая строка + uploaded_name = "" + # если пользователь загрузил картинку + if src: + # процесс сохранения картинки + f = src.file + f.seek(0, os.SEEK_END) + if f.tell() > 0: + f.seek(0) + destination = pathlib.Path("./uploads/" + str(hash(f)) + pathlib.Path(src.filename).suffix.lower()) + with destination.open('wb') as buffer: + shutil.copyfileobj(f, buffer) + + # изменяем название директории загруженного файла + uploaded_name = "/uploads/" + destination.name + + # создаем объект Announcement + temp_ancmt = orm_models.Announcement(user_id=current_user.id, name=name, category=category, best_by=bestBy, + address=address, longtitude=longtitude, latitude=latitude, description=description, metro=metro, + trashId=trashId, src=uploaded_name, booked_by=0) try: - # имя загруженного файла по умолчанию - пустая строка - uploaded_name = "" - # если пользователь загрузил картинку - if src: - # процесс сохранения картинки - f = src.file - f.seek(0, os.SEEK_END) - if f.tell() > 0: - f.seek(0) - destination = pathlib.Path("./uploads/" + str(hash(f)) + pathlib.Path(src.filename).suffix.lower()) - with destination.open('wb') as buffer: - shutil.copyfileobj(f, buffer) - - # изменяем название директории загруженного файла - uploaded_name = "/uploads/" + destination.name - - # создаем объект Announcement - temp_ancmt = orm_models.Announcement(user_id=current_user.id, name=name, category=category, best_by=bestBy, - address=address, longtitude=longtitude, latitude=latitude, description=description, metro=metro, - trashId=trashId, src=uploaded_name, booked_by=0) db.add(temp_ancmt) # добавляем в бд - db.commit() # сохраняем изменения - db.refresh(temp_ancmt) # обновляем состояние объекта - return {"Answer" : True} + await db.commit() # сохраняем изменения + await db.refresh(temp_ancmt) # обновляем состояние объекта + + return {"Success": True} except: - return {"Answer" : False} + raise HTTPException(status_code=500, detail="problem with adding object to db") # Удалить объявления из базы @app.delete("/api/announcement") #адрес объявления -def delete_from_db(announcement: pydantic_schemas.DelAnnouncement, db: Annotated[Session, Depends(auth_utils.get_db)]): # функция удаления объекта из БД +async def delete_from_db(announcement: pydantic_schemas.DelAnnouncement, db: Annotated[Session, Depends(auth_utils.get_session)]): # функция удаления объекта из БД + # находим объект с заданным id в бд + #to_delete = db.query(orm_models.Announcement).filter(orm_models.Announcement.id==announcement.id).first() + query = await db.execute(select(orm_models.Announcement).where(orm_models.Announcement.id==announcement.id)) + to_delete = query.scalars().first() + if not to_delete: + raise HTTPException(status_code=404, detail="Item not found. Can't delete") try: - # находим объект с заданным id в бд - to_delete = db.query(orm_models.Announcement).filter(orm_models.Announcement.id==announcement.id).first() - db.delete(to_delete) # удаление из БД - db.commit() # сохраняем изменения - return {"Answer" : True} + await db.delete(to_delete) # удаление из БД + await db.commit() # сохраняем изменения + + return {"Success": True} except: - return {"Answer" : False} + raise HTTPException(status_code=500, detail="Problem with adding to database") # Забронировать объявление @app.post("/api/book") -def change_book_status(data: pydantic_schemas.Book, current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_user)], - db: Annotated[Session, Depends(auth_utils.get_db)]): +async def change_book_status(data: pydantic_schemas.Book, current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_user)], + db: Annotated[Session, Depends(auth_utils.get_session)]): # Находим объявление по данному id - announcement_to_change = db.query(orm_models.Announcement).filter(orm_models.Announcement.id == data.id).first() + #announcement_to_change = db.query(orm_models.Announcement).filter(orm_models.Announcement.id == data.id).first() + query = await db.execute(select(orm_models.Announcement).where(orm_models.Announcement.id == data.id)) + announcement_to_change = query.scalars().first() # Проверяем, что объявление с данным id существует if not announcement_to_change: raise HTTPException(status_code=404, detail="Item not found") @@ -128,25 +145,28 @@ def change_book_status(data: pydantic_schemas.Book, current_user: Annotated[pyda # Инкрементируем поле booked_by на 1 announcement_to_change.booked_by += 1 # фиксируем изменения в бд - db.commit() - db.refresh(announcement_to_change) + await db.commit() + await db.refresh(announcement_to_change) return {"Success": True} # reginstration @app.post("/api/signup") -def create_user(nickname: Annotated[str, Form()], password: Annotated[str, Form()], db: Annotated[Session, Depends(auth_utils.get_db)], +async def create_user(nickname: Annotated[str, Form()], password: Annotated[str, Form()], db: Annotated[Session, Depends(auth_utils.get_session)], name: Annotated[str, Form()]=None, surname: Annotated[str, Form()]=None, avatar: Annotated[UploadFile, Form()]=None): # проверяем, что юзера с введенным никнеймом не существует в бд - if db.query(orm_models.User).filter(orm_models.User.nickname == nickname).first() == None: + #if db.query(orm_models.User).filter(orm_models.User.nickname == nickname).first() == None: + query_user = await db.execute(select(orm_models.User).where(orm_models.User.nickname == nickname)) + user_with_entered_nick = query_user.scalars().first() + if user_with_entered_nick == None: # создаем нового юзера new_user = orm_models.User(nickname=nickname, hashed_password=auth_utils.get_password_hash(password), name=name, surname=surname, reg_date=datetime.date.today()) # добавляем в бд db.add(new_user) - db.commit() - db.refresh(new_user) # обновляем состояние объекта + await db.commit() + await db.refresh(new_user) # обновляем состояние объекта return {"Success": True} return {"Success": False, "Message": "Пользователь с таким email уже зарегестрирован"} @@ -154,10 +174,10 @@ def create_user(nickname: Annotated[str, Form()], password: Annotated[str, Form( # функция для генерации токена после успешного входа пользователя @app.post("/api/token", response_model=pydantic_schemas.Token) async def login_for_access_token( - form_data: Annotated[OAuth2PasswordRequestForm, Depends()], db: Annotated[Session, Depends(auth_utils.get_db)] + form_data: Annotated[OAuth2PasswordRequestForm, Depends()], db: Annotated[Session, Depends(auth_utils.get_session)] ): # пробуем найти юзера в бд по введенным паролю и никнейму - user = auth_utils.authenticate_user(db, form_data.username, form_data.password) + user = await auth_utils.authenticate_user(db, form_data.username, form_data.password) # если не нашли - кидаем ошибку if not user: raise HTTPException( @@ -176,53 +196,70 @@ async def login_for_access_token( # получаем данные успешно вошедшего пользователя @app.get("/api/users/me", response_model=pydantic_schemas.User) # -async def read_users_me(current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_active_user)]): +def read_users_me(current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_active_user)]): return current_user # изменяем рейтинг пользователя @app.post("/api/user/rating") -def add_points(data: pydantic_schemas.AddRating, current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_user)], db: Annotated[Session, Depends(auth_utils.get_db)]): +async def add_points(data: pydantic_schemas.AddRating, current_user: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_user)], db: Annotated[Session, Depends(auth_utils.get_session)]): # проверяем, if current_user.id != data.user_id: - user = auth_utils.get_user_by_id(db, data.user_id) + user = await auth_utils.get_user_by_id(db, data.user_id) if not user: raise HTTPException(status_code=404, detail="Item not found") user.rating = (user.rating*user.num_of_ratings + data.rate)/(user.num_of_ratings + 1) user.num_of_ratings += 1 - db.commit() - db.refresh(user) # обновляем состояние объекта + await db.commit() + await db.refresh(user) # обновляем состояние объекта return {"Success": True} # получаем рейтинг пользователя @app.get("/api/user/rating") -def add_points(user_id: int, db: Annotated[Session, Depends(auth_utils.get_db)]): - user = auth_utils.get_user_by_id(db, user_id=user_id) +async def add_points(user_id: int, db: Annotated[Session, Depends(auth_utils.get_session)]): + user = await auth_utils.get_user_by_id(db, user_id=user_id) if not user: raise HTTPException(status_code=404, detail="Item not found") return {"rating": user.rating} # Отправляем стихи -@app.get("/api/user/poem", response_model=pydantic_schemas.Poem) # пока не работает -def poems_to_front(db: Annotated[Session, Depends(auth_utils.get_db)]): # db: Annotated[Session, Depends(utils.get_db)] - num_of_poems = db.query(orm_models.Poems).count() # определяем кол-во стихов в бд +@app.get("/api/user/poem", response_model=pydantic_schemas.Poem) +async def poems_to_front(db: Annotated[Session, Depends(auth_utils.get_session)]): + #num_of_poems = db.query(orm_models.Poems).count() # определяем кол-во стихов в бд + query = await db.execute(select(orm_models.Poems)) # определяем кол-во стихов в бд + num_of_poems = len(query.scalars().all()) + # если стихов в бд нет if num_of_poems < 1: - add_poems_and_filters.add_poems_to_db(database) # добавляем поэмы в базу данных + await add_poems_and_filters.add_poems_to_db(db) # добавляем поэмы в базу данных + # после добавления стихов снова определяем кол-во стихов в бд + query = await db.execute(select(orm_models.Poems)) + num_of_poems = len(query.scalars().all()) rand_id = random.randint(1, num_of_poems) # генерируем номер стихотворения - poem = db.query(orm_models.Poems).filter(orm_models.Poems.id == rand_id).first() # находим стих в бд + #poem = db.query(orm_models.Poems).filter(orm_models.Poems.id == rand_id).first() # находим стих в бд + query_poem = await db.execute(select(orm_models.Poems).where(orm_models.Poems.id == rand_id)) # находим стих в бд + poem = query_poem.scalars().first() if not poem: raise HTTPException(status_code=404, detail="Poem not found") return poem +trashboxes_category = { + "PORRIDGE": ["Опасные отходы", "Иное"], + "conspects": ["Бумага"], + "milk": ["Стекло", "Тетра Пак", "Иное"], + "bred": ["Пластик", "Иное"], + "wathing": ["Пластик", "Опасные отходы", "Иное"], + "cloth": ["Одежда"], + "fruits_vegatables": ["Иное"], + "other_things": ["Металл", "Бумага", "Стекло", "Иное", "Тетра Пак", "Батарейки", "Крышечки", "Шины", + "Опасные отходы", "Лампочки", "Пластик"] +} @app.get("/api/trashbox", response_model=List[pydantic_schemas.TrashboxResponse]) -def get_trashboxes(data: pydantic_schemas.TrashboxRequest = Depends()):#крутая функция для работы с api +async def get_trashboxes(data: pydantic_schemas.TrashboxRequest = Depends()): #крутая функция для работы с api # json, передаваемый стороннему API - BASE_URL= "https://geointelect2.gate.petersburg.ru" - my_token="eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODYyMjUzMzMsImlhdCI6MTY5MTUzMDkzMywianRpIjoiYjU0MmU3MTQtYzJkMS00NTY2LWJkY2MtYmQ5NzA0ODY1ZjgzIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6IjJhOTgwMzUyLTY1M2QtNGZlZC1iMDI1LWQ1N2U0NDRjZmM3NiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiIyYTk4MDM1Mi02NTNkLTRmZWQtYjAyNS1kNTdlNDQ0Y2ZjNzYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.FTKiC1hpWcOkmSW9QZpC-RY7Ko50jw1mDMfXIWYxlQ-zehLm2CLmOnHvYoOoI39k2OzeCIAB9ZdRrrGZc6G9Z1eFELUjNGEqKxSC1Phj9ATemKgbOKEttk-OGc-rFr9VPA8_SnfvLts6wTI2YK33YBIxCF5nCbnr4Qj3LeEQ0d6Hy8PO4ATrBF5EOeuAZRprvIEjXe_f8N9ONKckCPB-xFB4P2pZlVXGoCNoewGEcY3zXH4khezN6zcVr6tpc6G8dBv9EqT_v92IDSg-aXQk6ysA0cO0-6x5w1-_qU0iHGIAPsLNV9IKBoFbjc0JH6cWabldPRH12NP1trvYfqKDGQ" - head = {'Authorization': 'Bearer {}'.format(my_token)} + head = {'Authorization': 'Bearer ' + TRASHBOXES_TOKEN} # Данные пользователя (местоположение, количество мусорок, которое пользователь хочет видеть) my_data={ 'x' : f"{data.Lng}", @@ -230,27 +267,12 @@ def get_trashboxes(data: pydantic_schemas.TrashboxRequest = Depends()):#крут 'limit' : '1' } # Перевод категории с фронта на категорию с сайта - match data.Category: - case "PORRIDGE": - list_of_category = ["Опасные отходы", "Иное"] - case "conspects": - list_of_category = ["Бумага"] - case "milk": - list_of_category = ["Стекло", "Тетра Пак", "Иное"] - case "bred": - list_of_category = ["Пластик", "Иное"] - case "wathing": - list_of_category = ["Пластик", "Опасные отходы", "Иное"] - case "cloth": - list_of_category = ["Одежда"] - case "fruits_vegatables": - list_of_category = ["Иное"] - case "other_things": - list_of_category = ["Металл", "Бумага", "Стекло", "Иное", "Тетра Пак", "Батарейки", "Крышечки", "Шины", - "Опасные отходы", "Лампочки", "Пластик"] + list_of_category = trashboxes_category[data.Category] + # Получение ответа от стороннего апи - response = requests.post(f"{BASE_URL}/nearest_recycling/get", headers=head, data=my_data, timeout=10) + response = requests.post(TRASHBOXES_BASE_URL + "/nearest_recycling/get", headers=head, data=my_data, timeout=10) infos = response.json() + # Чтение ответа trashboxes = [] for trashbox in infos["results"]: @@ -277,10 +299,10 @@ async def react_app(req: Request, rest_of_path: str): @app.post("/api/announcement/dispose") -def dispose(data: pydantic_schemas.DisposeRequest, current_user_schema: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_user)], - db: Annotated[Session, Depends(auth_utils.get_db)]): +async def dispose(data: pydantic_schemas.DisposeRequest, current_user_schema: Annotated[pydantic_schemas.User, Depends(auth_utils.get_current_user)], + db: Annotated[Session, Depends(auth_utils.get_session)]): # Находим в бд текущего юзера - current_user = auth_utils.get_user_by_id(db, current_user_schema.id) + current_user = await auth_utils.get_user_by_id(db, current_user_schema.id) # Начисляем баллы пользователю за утилизацию current_user.points += 60 # В полученном json переходим к данным мусорки @@ -292,12 +314,14 @@ def dispose(data: pydantic_schemas.DisposeRequest, current_user_schema: Annotate db.add(new_trashox) # в соответствии с логикой api, после утилизации объявление пользователя удаляется # находим объявление с айди data.ann_id - ann_to_del = db.query(orm_models.Announcement).filter(orm_models.Announcement.id == data.ann_id).first() # находим стих в бд + #ann_to_del = db.query(orm_models.Announcement).filter(orm_models.Announcement.id == data.ann_id).first() # + query_ann = await db.execute(select(orm_models.Announcement).where(orm_models.Announcement.id == data.ann_id)) # находим объявление в бд + ann_to_del = query_ann.scalars().first() if not ann_to_del: raise HTTPException(status_code=404, detail="Announcement not found") # удаляем объявление из бд - db.delete(ann_to_del) - db.commit() - db.refresh(new_trashox) # обновляем состояние объекта + await db.delete(ann_to_del) + await db.commit() + await db.refresh(new_trashox) # обновляем состояние объекта return {"Success": True} diff --git a/back/auth_utils.py b/back/auth_utils.py index 594627c..942bc4a 100644 --- a/back/auth_utils.py +++ b/back/auth_utils.py @@ -5,25 +5,22 @@ from fastapi import Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer from jose import JWTError, jwt from passlib.context import CryptContext +from sqlalchemy import select from sqlalchemy.orm import Session +from sqlalchemy.ext.asyncio import AsyncSession -from .db import database +from .db import SessionLocal from . import orm_models, pydantic_schemas +from .config import SECRET_KEY, ALGORITHM, ACCESS_TOKEN_EXPIRE_MINUTES -SECRET_KEY = "651a52941cf5de14d48ef5d7af115709" -ALGORITHM = "HS256" -ACCESS_TOKEN_EXPIRE_MINUTES = 1440 pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/token") -def get_db(): - db = database - try: - yield db - finally: - db.close() +async def get_session() -> AsyncSession: + async with SessionLocal() as session: + yield session def verify_password(plain_password, hashed_password): @@ -34,22 +31,24 @@ def get_password_hash(password): return pwd_context.hash(password) -def get_user_by_nickname(db: Annotated[Session, Depends(get_db)], nickname: str): - user_with_required_id = db.query(orm_models.User).filter(orm_models.User.nickname == nickname).first() - if user_with_required_id: - return user_with_required_id +async def get_user_by_nickname(db: Annotated[AsyncSession, Depends(get_session)], nickname: str): + query = await db.execute(select(orm_models.User).where(orm_models.User.nickname == nickname)) + user_with_required_nickname = query.scalars().first() + if user_with_required_nickname: + return user_with_required_nickname return None -def get_user_by_id(db: Annotated[Session, Depends(get_db)], user_id: int): - user_with_required_id = db.query(orm_models.User).filter(orm_models.User.id == user_id).first() +async def get_user_by_id(db: Annotated[AsyncSession, Depends(get_session)], user_id: int): + query = await db.execute(select(orm_models.User).where(orm_models.User.id == user_id)) + user_with_required_id = query.scalars().first() if user_with_required_id: return user_with_required_id return None -def authenticate_user(db: Annotated[Session, Depends(get_db)], nickname: str, password: str): - user = get_user_by_nickname(db=db, nickname=nickname) +async def authenticate_user(db: Annotated[AsyncSession, Depends(get_session)], nickname: str, password: str): + user = await get_user_by_nickname(db=db, nickname=nickname) if not user: return False if not verify_password(password, user.hashed_password): @@ -68,7 +67,7 @@ def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None return encoded_jwt -async def get_current_user(db: Annotated[Session, Depends(get_db)], token: Annotated[str, Depends(oauth2_scheme)]): +async def get_current_user(db: Annotated[AsyncSession, Depends(get_session)], token: Annotated[str, Depends(oauth2_scheme)]): credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", @@ -82,14 +81,14 @@ async def get_current_user(db: Annotated[Session, Depends(get_db)], token: Annot token_data = pydantic_schemas.TokenData(user_id=user_id) except JWTError: raise credentials_exception - user = get_user_by_id(db, user_id=token_data.user_id) + user = await get_user_by_id(db, user_id=token_data.user_id) if user is None: raise credentials_exception return pydantic_schemas.User(id=user.id, nickname=user.nickname, name=user.name, surname=user.surname, disabled=user.disabled, items=user.announcements, reg_date=user.reg_date, points=user.points) -async def get_current_active_user( +def get_current_active_user( current_user: Annotated[pydantic_schemas.User, Depends(get_current_user)] ): if current_user.disabled: diff --git a/back/config.py b/back/config.py new file mode 100644 index 0000000..3c90b68 --- /dev/null +++ b/back/config.py @@ -0,0 +1,13 @@ +import os +from dotenv import load_dotenv + +load_dotenv('.env') + +TRASHBOXES_TOKEN = os.environ.get("TRASHBOXES_TOKEN") +TRASHBOXES_BASE_URL = os.environ.get("TRASHBOXES_BASE_URL") + +SECRET_KEY = os.environ.get("SECRET_KEY") +ALGORITHM = os.environ.get("ALGORITHM") +ACCESS_TOKEN_EXPIRE_MINUTES = int(os.environ.get("ACCESS_TOKEN_EXPIRE_MINUTES")) + +SQLALCHEMY_DATABASE_URL = os.environ.get("SQLALCHEMY_DATABASE_URL") \ No newline at end of file diff --git a/back/db.py b/back/db.py index 12d83a7..a0dcf4b 100644 --- a/back/db.py +++ b/back/db.py @@ -1,32 +1,20 @@ -from typing import AsyncGenerator - -from sqlalchemy import create_engine, MetaData -# from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine -from sqlalchemy.orm import sessionmaker, DeclarativeBase +from asyncio import current_task +from sqlalchemy.ext.asyncio import AsyncSession, async_scoped_session, create_async_engine +from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base +from .config import SQLALCHEMY_DATABASE_URL -SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db" +engine = create_async_engine(SQLALCHEMY_DATABASE_URL) -engine = create_engine( - SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} -) +SessionLocal = sessionmaker(bind=engine, class_=AsyncSession, expire_on_commit=False) -SessionLocal = sessionmaker(bind=engine, autoflush=True, autocommit=False) - -database = SessionLocal() +async_session = SessionLocal() +# async_session = async_scoped_session(SessionLocal, scopefunc=current_task) Base = declarative_base() -# # add your model's MetaData object here -# # for 'autogenerate' support -# # in your application's model: - -# class Base(DeclarativeBase): -# metadata = MetaData(naming_convention={ -# "ix": "ix_%(column_0_label)s", -# "uq": "uq_%(table_name)s_%(column_0_name)s", -# "ck": "ck_%(table_name)s_`%(constraint_name)s`", -# "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", -# "pk": "pk_%(table_name)s" -# }) \ No newline at end of file +# Создаем таблицы +async def init_models(): + async with engine.begin() as conn: + await conn.run_sync(Base.metadata.create_all) diff --git a/back/delete_db.py b/back/delete_db.py new file mode 100644 index 0000000..5b22d85 --- /dev/null +++ b/back/delete_db.py @@ -0,0 +1,6 @@ +from sqlalchemy import Table, MetaData, text +from .db import engine, Base + +tbl = Table('Poems', MetaData(), autoload_with=engine) +tbl.drop(engine, checkfirst=False) +a = input() diff --git a/back/main.py b/back/main.py index 564539b..23d2504 100644 --- a/back/main.py +++ b/back/main.py @@ -3,6 +3,8 @@ import uvicorn from .api import app as app_fastapi from .scheduler import app as app_rocketry +from .db import init_models + class Server(uvicorn.Server): """Customized uvicorn.Server @@ -16,6 +18,9 @@ class Server(uvicorn.Server): async def main(): "Run scheduler and the API" + + await init_models() + server = Server(config=uvicorn.Config(app_fastapi, workers=1, loop="asyncio", host="0.0.0.0")) api = asyncio.create_task(server.serve()) diff --git a/back/orm_models.py b/back/orm_models.py index 1e807f9..1c7a7b3 100644 --- a/back/orm_models.py +++ b/back/orm_models.py @@ -1,7 +1,8 @@ from sqlalchemy import Column, Integer, String, Boolean, Float, Date, ForeignKey -from .db import Base, engine from sqlalchemy.orm import relationship +from .db import Base, engine + class User(Base):#класс пользователя __tablename__ = "users" @@ -17,8 +18,8 @@ class User(Base):#класс пользователя num_of_ratings = Column(Integer, default=0) # количество оценок (т.е. то, сколько раз другие пользователи оценили текущего) reg_date = Column(Date) # дата регистрации - announcements = relationship("Announcement", back_populates="user") - trashboxes_chosen = relationship("Trashbox", back_populates="user") + announcements = relationship("Announcement", back_populates="user", lazy='selectin') + trashboxes_chosen = relationship("Trashbox", back_populates="user", lazy='selectin') class Announcement(Base): #класс объявления __tablename__ = "announcements" @@ -66,24 +67,3 @@ class Poems(Base):#класс поэзии author = Column(String) # автор стихотворения -# Создаем описанные выше таблицы -Base.metadata.create_all(bind=engine) - - - -# from typing import AsyncGenerator -# from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine -# from fastapi_users.db import SQLAlchemyBaseUserTableUUID, SQLAlchemyUserDatabase -# # This function can be called during the initialization of the FastAPI app. -# async def create_db_and_tables(): -# async with engine.begin() as conn: -# await conn.run_sync(Base.metadata.create_all) - - -# async def get_async_session() -> AsyncGenerator[AsyncSession, None]: -# async with async_session_maker() as session: -# yield session - - -# async def get_user_db(session: AsyncSession = Depends(get_async_session)): -# yield SQLAlchemyUserDatabase(session, User) \ No newline at end of file diff --git a/back/scheduler.py b/back/scheduler.py index deb1b92..9842d9f 100644 --- a/back/scheduler.py +++ b/back/scheduler.py @@ -2,7 +2,7 @@ from . import add_poems_and_filters from rocketry import Rocketry from rocketry.conds import daily import datetime -from .db import database +from .db import async_session app = Rocketry(execution="async") @@ -10,5 +10,5 @@ app = Rocketry(execution="async") @app.task('daily') async def daily_check(): # Фильтруем по сроку годности - add_poems_and_filters.check_obsolete(database, current_date=datetime.date.today()) + await add_poems_and_filters.check_obsolete(async_session, current_date=datetime.date.today()) diff --git a/back/text121.txt b/back/text121.txt deleted file mode 100644 index 228dbff..0000000 --- a/back/text121.txt +++ /dev/null @@ -1,2706 +0,0 @@ - -стих 1 -К Чаадаеву - -Любви, надежды, тихой славы -Недолго нежил нас обман, -Исчезли юные забавы, -Как сон, как утренний туман; -Но в нас горит еще желанье, -Под гнетом власти роковой -Нетерпеливою душой -Отчизны внемлем призыванье. -Мы ждем с томленьем упованья -Минуты вольности святой, -Как ждет любовник молодой -Минуты верного свиданья. -Пока свободою горим, -Пока сердца для чести живы, -Мой друг, отчизне посвятим -Души прекрасные порывы! -Товарищ, верь: взойдет она, -Звезда пленительного счастья, -Россия вспрянет ото сна, -И на обломках самовластья -Напишут наши имена! - -Александр Сергеевич Пушкин -(1799-1837) - -стих 2 -Отрывок из «Разговора с фининспектором о поэзии» - -— Поэзия - — вся! — - езда в незнаемое. -Поэзия — - та же добыча радия. -В грамм добыча, - в год труды. -Изводишь - единого слова ради -тысячи тонн - словесной руды. -Но как - испепеляюще - слов этих жжение -рядом - с тлением - слова-сырца. -Эти слова - приводят в движение -тысячи лет - миллионов сердца. - -Владимир Владимирович Маяковский -(1893-1930) - -стих 3 -Фабрика - -В соседнем доме окна жолты. -По вечерам — по вечерам -Скрипят задумчивые болты, -Подходят люди к воротам. -И глухо заперты ворота, -А на стене — а на стене -Недвижный кто-то, черный кто-то -Людей считает в тишине. -Я слышу всё с моей вершины: -Он медным голосом зовет -Согнуть измученные спины -Внизу собравшийся народ. -Они войдут и разбредутся, -Навалят на спины кули. -И в желтых окнах засмеются, -Что этих нищих провели. - -Александр Александрович Блок -(1880-1921) - -стих 4 -Надпись к статуе Петра Великого - -Се образ изваян премудрого героя, -Что, ради подданных лишив себя покоя, -Последний принял чин и царствуя служил, -Свои законы сам примером утвердил, -Рожденны к скипетру, простер в работу руки, -Монаршу власть скрывал, чтоб нам открыть науки. -Когда он строил град, сносил труды в войнах, -В землях далеких был и странствовал в морях, -Художников сбирал и обучал солдатов, -Домашних побеждал и внешних сопостатов; -И словом, се есть Петр, отечества Отец; -Земное божество Россия почитает, -И столько олтарей пред зраком сим пылает, -Коль много есть ему обязанных сердец. - -Михаил Васильевич Ломоносов -(1711-1765) - -стих 5 -Пчелка - -Пчелка златая! -Что ты жужжишь? -Всё вкруг летая, -Прочь не летишь? -Или ты любишь -Лизу мою? -Соты ль душисты -В желтых власах, -Розы ль огнисты -В алых устах, -Сахар ли белый -Грудь у нее? -Пчелка златая! -Что ты жужжишь? -Слышу, вздыхая, -Мне говоришь: -«К меду прилипнув, -С ним и умру». - -Гавриил Романович Державин -(1711-1765) - -стих 6 -Не позволяй душе лениться - -Не позволяй душе лениться! -Чтоб в ступе воду не толочь, -Душа обязана трудиться -И день и ночь, и день и ночь! - -Гони ее от дома к дому, -Тащи с этапа на этап, -По пустырю, по бурелому -Через сугроб, через ухаб! - -Не разрешай ей спать в постели -При свете утренней звезды, -Держи лентяйку в черном теле -И не снимай с нее узды! - -Коль дать ей вздумаешь поблажку, -Освобождая от работ, -Она последнюю рубашку -С тебя без жалости сорвет. - -А ты хватай ее за плечи, -Учи и мучай дотемна, -Чтоб жить с тобой по-человечьи -Училась заново она. - -Она рабыня и царица, -Она работница и дочь, -Она обязана трудиться -И день и ночь, и день и ночь! - -Николай Алексеевич Заболоцкий -(1903-1958) - -стих 7 -Апреля первое число - -Апреля в первый день обман, -Забава общая в народе, -На выдумки лукавить дан, -Нагая правда в нем не в моде, -И всё обманом заросло -Апреля в первое число.Одни шлют радостную весть, -Друзей к досаде утешают, -Другие лгут и чем ни есть -Друзей к досаде устрашают. -Лукавство враки принесло -Апреля в первое число.На что сей только день один -Обмана праздником уставлен? -Без самых малых он причин -Излишне столько препрославлен, -Весь год такое ремесло, -Так целый год сие число. - -Александр Петрович Сумароков -(1717-1777) - -стих 8 -Малютка-жизнь - -Я жизнь люблю и умереть боюсь. -Взглянули бы, как я под током бьюсь -И гнусь, как язь в руках у рыболова, -Когда я перевоплощаюсь в слово. -Но я не рыба и не рыболов. -И я из обитателей углов, -Похожий на Раскольникова с виду. -Как скрипку я держу свою обиду. -Терзай меня — не изменюсь в лице. -Жизнь хороша, особенно в конце, -Хоть под дождем и без гроша в кармане, -Хоть в Судный день — с иголкою в гортани. -А! Этот сон! Малютка-жизнь, дыши, -Возьми мои последние гроши, -Не отпускай меня вниз головою -В пространство мировое, шаровое! - -Арсений Александрович Тарковский -(1907–1989) - -стих 9 -Лес осенью - -Меж редеющих верхушек -Показалась синева. -Зашумела у опушек -Ярко-желтая листва. -Птиц не слышно. Треснет мелкий -Обломившийся сучок, -И, хвостом мелькая, белка -Легкий делает прыжок. -Стала ель в лесу заметней – -Бережет густую тень. -Подосиновик последний -Сдвинул шапку набекрень. - -Александр Трифонович Твардовский -(1910-1971) - -стих 10 -Дружба - -Скатившись с горной высоты, -Лежал на прахе дуб, перунами разбитый; -А с ним и гибкий плющ, кругом его обвитый. -О Дружба, это ты! - -Василий Андреевич Жуковский -(1783-1852) - -стих 11 -Я пришел к тебе с приветом… - -Я пришёл к тебе с приветом, -Рассказать, что солнце встало, -Что оно горячим светом -По листам затрепетало; -Рассказать, что лес проснулся, -Весь проснулся, веткой каждой, -Каждой птицей встрепенулся -И весенней полон жаждой; -Рассказать, что с той же страстью, -Как вчера, пришёл я снова, -Что душа всё так же счастью -И тебе служить готова; -Рассказать, что отовсюду -На меня весельем веет, -Что не знаю сам, что́ буду -Петь — но только песня зреет. - -Афанасий Афанасьевич Шеншин -(1820-1892) - -стих 12 -Неохотно и несмело… - -Неохотно и несмело -Солнце смотрит на поля — -Чу! за тучей прогремело, -Принахмурилась земля. -Ветра теплого порывы — -Дальний гром и дождь порой… -Зеленеющие нивы -Зеленее под грозой. -Вот пробилась из-за тучи -Синей молнии струя — -Пламень белый и летучий -Окаймил ее края. -Чаще капли дождевые, -Вихрем пыль летит с полей, -И раскаты громовые -Все сердитей и смелей… -Солнце раз еще взглянуло -Исподлобья на поля, -И в сиянье потонула -Вся смятенная земля. - -Фёдор Иванович Тютчев -(1803-1873) - -стих 13 -Ананасы в шампанском!.. - -Ананасы в шампанском! Ананасы в шампанском! -Удивительно вкусно, искристо и остро! -Весь я в чем-то норвежском! Весь я в чем-то испанском! -Вдохновляюсь порывно! И берусь за перо! - - -Стрекот аэропланов! Беги автомобилей! -Ветропросвист экспрессов! Крылолёт буеров! -Кто-то здесь зацелован! Там кого-то побили! -Ананасы в шампанском — это пульс вечеров! - - -В группе девушек нервных, в остром обществе дамском -Я трагедию жизни претворю в грезофарс… -Ананасы в шампанском! Ананасы в шампанском! -Из Москвы — в Нагасаки! Из Нью-Йорка — на Марс! - -Игорь-Северянин -(1887-1941) - -стих 14 -В палате наркоманов - -Не писать мне повестей, романов, -Не читать фантастику в углу, - -Я лежу в палате наркоманов, -Чувствую — сам сяду на иглу. - -Кто-то раны лечил боевые, -Кто-то так, обеспечил тылы… -Эх вы парни мои шировые, -Поскорее слезайте с иглы! - -В душу мне сомнения запали, -Голову вопросами сверлят, - -Я лежу в палате, где глотали, -Нюхали, кололи все подряд. - -Кто-то там проколол свою душу, -Кто-то просто остался один… -Эй вы парни, бросайте "морфушу" - -Перейдите на апоморфин! - -Рядом незнакомый шизофреник - -В него тайно няня влюблена - -Говорит: "Когда не будет денег - -Перейду на капли Зимина". - -Кто-то там проколол свою совесть, -Кто-то в сердце вкурил анашу… -Эх вы парни, про вас нужно повесть, -Жалко, повестей я не пишу. - -Владимир Семёнович Высоцкий -(1938-1980) - -стих 15 -Отрывок из «Рассказа о неизвестном герое» - -Ищут пожарные, -Ищет милиция, -Ищут фотографы -В нашей столице, -Ищут давно, -Но не могут найти -Парня какого-то -Лет двадцати. -Среднего роста, -Плечистый и крепкий, -Ходит он в белой -Футболке и кепке. -Знак «ГТО» -На груди у него. -Больше не знают -О нем ничего. -Многие парни -Плечисты и крепки. -Многие носят -Футболки и кепки. -Много в столице -Таких же значков. -Каждый -К труду-обороне -Готов. - -Самуил Яковлевич Маршак -(1887-1964) - -стих 16 -Изволь ведать, что скорбь есть смертельная всяко - -Изволь ведать, что скорбь есть смертельная всяко, -Когда кто любит верно, -Но жестоку безмерно, -И котора смеется над ним всюду тако. -Можно ль жить любовнику, чтоб милу не видеть? -Могу ль я в надежде быть, -Чтоб вас ныне умолить? -Но ежели я како возмог вас обидеть, -За то я чрез мою скорбь довольно наказан. -Извольте умилиться, -Со мною помириться: -Ибо я к тебе вечно чрез любовь привязан. - -Василий Кириллович Тредиаковский -(1703-1768) - -стих 17 -Гамлет - -Гул затих. Я вышел на подмостки. -Прислонясь к дверному косяку, -Я ловлю в далеком отголоске, -Что случится на моем веку. -На меня наставлен сумрак ночи -Тысячью биноклей на оси. -Если только можно, Авва Отче, -Чашу эту мимо пронеси. -Я люблю твой замысел упрямый -И играть согласен эту роль. -Но сейчас идет другая драма, -И на этот раз меня уволь. -Но продуман распорядок действий, -И неотвратим конец пути. -Я один, все тонет в фарисействе. -Жизнь прожить — не поле перейти. -Борис Леонидович Пастернак -(1890-1960) - -стих 18 -Обращение писателя к читателям и Кремлёвские звёзды -Я к вам обращаюсь, товарищи, дети: -Полезнее книги нет вещи на свете! -Пусть книги друзьями заходят в дома, -Читайте всю жизнь, набирайтесь ума! -___________________________________ -Кремлёвские звёзды -Над нами горят, -Повсюду доходит их свет! -Хорошая Родина есть у ребят, -И лучше той Родины -Нет! - -Сергей Владимирович Михалков -(1913-2009) - -стих 19 -Гроза идет - -Движется нахмуренная туча, -Обложив полнеба вдалеке, -Движется, огромна и тягуча, -С фонарем в приподнятой руке. - -Сколько раз она меня ловила, -Сколько раз, сверкая серебром, -Сломанными молниями била, -Каменный выкатывала гром! - -Сколько раз, ее увидев в поле, -Замедлял я робкие шаги -И стоял, сливаясь поневоле -С белым блеском вольтовой дуги! - -Вот он — кедр у нашего балкона. -Надвое громами расщеплен, -Он стоит, и мертвая корона -Подпирает темный небосклон. - -Сквозь живое сердце древесины -Пролегает рана от огня, -Иглы почерневшие с вершины -Осыпают звездами меня. - -Пой мне песню, дерево печали! -Я, как ты, ворвался в высоту, -Но меня лишь молнии встречали -И огнем сжигали на лету. - -Почему же, надвое расколот, -Я, как ты, не умер у крыльца, -И в душе все тот же лютый голод, -И любовь, и песни до конца! - -Николай Алексеевич Заболоцкий -(1903-1958) - -стих 20 -Зимняя дорога -Сквозь волнистые туманы -Пробирается луна, -На печальные поляны -Льет печально свет она. - -По дороге зимней, скучной -Тройка борзая бежит, -Колокольчик однозвучный -Утомительно гремит. - -Что-то слышится родное -В долгих песнях ямщика: -То разгулье удалое, -То сердечная тоска… - -Ни огня, ни черной хаты, -Глушь и снег… Навстречу мне -Только версты полосаты -Попадаются одне… - -Скучно, грустно… Завтра, Нина, -Завтра к милой возвратясь, -Я забудусь у камина, -Загляжусь не наглядясь. - -Звучно стрелка часовая -Мерный круг свой совершит, -И, докучных удаляя, -Полночь нас не разлучит. - -Грустно, Нина: путь мой скучен, -Дремля смолкнул мой ямщик, -Колокольчик однозвучен, -Отуманен лунный лик. - -Александр Сергеевич Пушкин -(1799-1837) - -стих 21 -На день города - -Город хмурых улыбок -Сойджаков и чадов. -Жизнь глыбы гранита -Петрова начала. - -Жёлтая краска -На мокром холсте. -Этот вызов природе -Стоит на Ниве. - -Велик Петербург! -Он — культуры завод, -Где Цой кочегарил, -Где актёрствовал Блок. - -Ведь с Рубинштейна -Идут культуры мосты. -Туда Ленин спрятал -Бункер русской души. - -Вито Царе -(1411-1478) - -стих 22 -На тленность - -Река времён в своём стремленьи -Уносит все дела людей -И топит в пропасти забвенья -Народы, царства и царей. -А если что и остаётся -Чрез звуки лиры и трубы, -То вечности жерлом пожрётся -И общей не уйдёт судьбы. - -Гавриил Романович Державин -(1743-1816) - -стих 23 -Петербургским цензорам - -Перед вами нуль Тимковский! -В вашей славе он погас; -Вы по совести поповской, -Цензируя, жмете нас. -Славьтесь, Бируков, Красовский! -Вам дивится даже князь! -Член тюремный и Библейский -Цензор, мистик и срамец, -Он с душонкою еврейской, -Наш гонитель, князя льстец. -Славься, славься, дух лакейский, -Славься, доблестный подлец! -Вас и дух святый робеет; -Он, как мы у вас в когтях; -Появиться он не смеет -Даже в Глинкиных стихах. -Вот как семя злое зреет! -Вот как всё у нас в тисках! -Ни угрозою, ни лаской, -Видно, вас не уломать; -Олин и Григорий Спасский -Подозренья в вас родят. -Славьтесь цензорской указкой! -Таски вам не миновать. - -Антон Антонович Дельвиг -(1798-1831) - -стих 24 -Мой Ленинград - -Над Россиею -Небо синее, -Небо синее над Невой, -В целом мире нет, -Нет красивее -Ленинграда моего. - -Нам всё помнится: в ночи зимние -Над Россией, над родимою страной, -Весь израненный, в снежном инее -Гордо высился печальный город мой. - -Славы города, где сражались мы, -Никому ты, как винтовки, не отдашь. -Вместе с солнышком пробуждается -Наша песня, наша слава, город наш! - -Алексей Иванович Фатьянов -(1919-1959) - -стих 25 -Лето ленинградское в неволе - -Лето ленинградское в неволе. -Всё брожу по новым пустырям, -И сухой репейник на подоле -Приношу я в сумерках к дверям. - -Белой ночью всё зудит комарик, -На обиды жалуется мне. -За окном шаги на тротуаре — -Кто-то возвращается к жене. - -И всю ночь далекий запах гари -Не дает забыть мне о войне. - -Наталья Крандиевская-Толстая -(1888-1963) - -стих 26 -Ленинград - -Есть в Ленинграде, кроме неба и Невы, -Простора площадей, разросшейся листвы, -И кроме статуй, и мостов, и снов державы, -И кроме незакрывшейся, как рана, славы, -Которая проходит ночью по проспектам, -Почти незримая, из серебра и пепла, — -Есть в Ленинграде жесткие глаза и та, -Для прошлого загадочная, немота, -Тот горько сжатый рот, те обручи на сердце, -Что, может быть, одни спасли его от смерти. -И если ты — гранит, учись у глаз горячих: -Они сухи, сухи, когда и камни плачут. - -Илья Григорьевич Эренбург -(1891-1967) - -стих 27 -В небе тают облака - -В небе тают облака, -И, лучистая на зное, -В искрах катится река, -Словно зеркало стальное… - -Час от часу жар сильней, -Тень ушла к немым дубровам, -И с белеющих полей -Веет запахом медовым. - -Чудный день! Пройдут века — -Так же будут, в вечном строе, -Течь и искриться река -И поля дышать на зное. - -Фёдор Иванович Тютчев -(1803-1873) - -стих 28 -Майская ночь - -Отсталых туч над нами пролетает -Последняя толпа. -Прозрачный их отрезок мягко тает -У лунного серпа. - -Царит весны таинственная сила -С звездами на челе.- -Ты, нежная! Ты счастье мне сулила -На суетной земле. - -А счастье где? Не здесь, в среде убогой, -А вон оно — как дым. -За ним! за ним! воздушною дорогой — -И в вечность улетим! - -Афанасий Афанасьевич Шеншин -(1820-1892) - -стих 29 -Кинжал - -Люблю тебя, булатный мой кинжал, -Товарищ светлый и холодный. -Задумчивый грузин на месть тебя ковал, -На грозный бой точил черкес свободный. - -Лилейная рука тебя мне поднесла -В знак памяти, в минуту расставанья, -И в первый раз не кровь вдоль по тебе текла, -Но светлая слеза — жемчужина страданья. - -И черные глаза, остановясь на мне, -Исполнены таинственной печали, -Как сталь твоя при трепетном огне, -То вдруг тускнели, то сверкали. - -Ты дан мне в спутники, любви залог немой, -И страннику в тебе пример не бесполезный: -Да, я не изменюсь и буду тверд душой, -Как ты, как ты, мой друг железный. - -Михаил Юрьевич Лермонтов -(1814-1841) - -стих 30 -Туманы - -Туманы таяли и вновь росли над лугом, -Ползли, холодные, над мертвою травой, -И бледные цветы шепталися друг с другом, -Скорбя застывшею листвой. - -Они хотели жить, блистая лепестками, -Вздыхать, дышать, гореть, лелеять аромат, -Любиться с пчелами, дрожать под мотыльками, -Из мира сделать пышный сад. - -Они изнемогли под сыростью тумана, -И жаждали зари, и жаждали огня, -И плакали, что смерть приходит слишком рано, -Что поздно вспыхнут краски дня. - -И день забрезжился. Туманы задрожали, -Воздушным кораблем повисли над землей. -И ветры буйные, смеясь, его качали, -И свет боролся с тусклой мглой. - -Все жарче день пылал сверкающим приветом, -Холодный круг земли дыханьем горяча,- -И облако зажглось, пронизанное светом -Непобедимого луча! - -Константин Дмитриевич Бальмонт -(1867-1942) - -стих 31 -Голос - -Такая жизненная полоса, -а, может быть, предначертанье свыше. -Других я различаю голоса, -а собственного голоса не слышу. -И все же он, как близкая родня, -единственный, -кто согревает в стужу. -До смерти будет он внутри меня. -Да и потом -не вырвется наружу. - -Роберт Иванович Рождественский -(1938-1994) - -стих 32 -Горький - -Талант смеялся… Бирюзовый штиль, -Сияющий прозрачностью зеркальной, -Сменялся в нём вспенённостью сверкальной, -Морской травой и солью пахнул стиль. - -Сласть слёз солёных знала Изергиль, -И сладость волн солёных впита Мальвой. -Под каждой кофточкой, под каждой тальмой — -Цветов сердец зиждительная пыль. - -Всю жизнь ничьих сокровищ не наследник, -Живописал высокий исповедник -Души, смотря на мир не свысока. - -Прислушайтесь: в Сорренто, как на Капри, -Ещё хрустальные сочатся капли -Ключистого таланта босяка. - -Игорь-Северянин -(1887-1941) - -стих 33 -Бюрократ и смерть - -За Бюрократом Смерть пришла, -Полдня в приемной прождала, -Полдня в приемной просидела, -Полдня на очередь глядела, - -Что всё росла, - -А не редела… -И, не дождавшись… померла! - -«Что-о? Бюрократ сильнее Смерти?» -Нет! -Но живучи всё же, черти! - -Сергей Владимирович Михалков -(1913-2009) - -стих 34 -Ласточки пропали - -Ласточки пропали, -А вчера зарёй -Всё грачи летали -Да, как сеть, мелькали -Вон над той горой. - -С вечера все спится, -На дворе темно. -Лист сухой валится, -Ночью ветер злится -Да стучит в окно. - -Лучше б снег да вьюгу -Встретить грудью рад! -Словно как с испугу -Раскричавшись, к югу -Журавли летят. - -Выйдешь — поневоле -Тяжело — хоть плачь! -Смотришь — через поле -Перекати-поле -Прыгает, как мяч. - -Афанасий Афанасьевич Шеншин -(1820-1892) - -стих 35 -Вечернее размышления... - -Лице свое скрывает день, -Поля покрыла мрачна ночь; -Взошла на горы черна тень, -Лучи от нас склонились прочь. -Открылась бездна звезд полна; -Звездам числа нет, бездне дна. - -Песчинка как в морских волнах, -Как мала искра в вечном льде, -Как в сильном вихре тонкий прах, -В свирепом как перо огне, -Так я, в сей бездне углублен, -Теряюсь, мысльми утомлен! - -Уста премудрых нам гласят: -«Там разных множество светов, -Несчетны солнца там горят, -Народы там и круг веков; -Для общей славы божества -Там равна сила естества». - -Но где ж, натура, твой закон? -С полночных стран встает заря! -Не солнце ль ставит там свой трон? -Не льдисты ль мещут огнь моря? -Се хладный пламень нас покрыл! -Се в ночь на землю день вступил! - -О вы, которых быстрый зрак -Пронзает в книгу вечных прав, -Которым малый вещи знак -Являет естества устав, -Вам путь известен всех планет; -Скажите, что нас так мятет? - -Что зыблет ясный ночью луч? -Что тонкий пламень в твердь разит? -Как молния без грозных туч -Стремится от земли в зенит? -Как может быть, чтоб мерзлый пар -Среди зимы рождал пожар? - -Там спорит жирна мгла с водой; -Иль солнечны лучи блестят, -Склонясь сквозь воздух к нам густой; -Иль тучных гор верьхи горят; -Иль в море дуть престал зефир, -И гладки волны бьют в ефир. - -Сомнений полон ваш ответ -О том, что окрест ближних мест. -Скажите ж, коль пространен свет? -И что малейших дале звезд? -Несведом тварей вам конец? -Скажите ж, коль велик Творец? - -Михаил Васильевич Ломоносов -(1711-1765) - -стих 36 -Фонтан - -Смотри, как облаком живым -Фонтан сияющий клубится; -Как пламенеет, как дробится -Его на солнце влажный дым. -Лучом поднявшись к небу, он -Коснулся высоты заветной — -И снова пылью огнецветной -Ниспасть на землю осужден. -О смертной мысли водомет, -О водомет неистощимый! -Какой закон непостижимый -Тебя стремит, тебя мятет? -Как жадно к небу рвешься ты!.. -Но длань незримо-роковая, -Твой луч упорный преломляя, -Свергает в брызгах с высоты… - -Фёдор Иванович Тютчев -(1803-1873) - -стих 37 -Стань самим собой - -Когда тебе придется туго, -Найдешь и сто рублей и друга. -Себя найти куда трудней, -Чем друга или сто рублей. - -Ты вывернешься наизнанку, -Себя обшаришь спозаранку, -В одно смешаешь явь и сны, -Увидишь мир со стороны. - -И все и всех найдешь в порядке. -А ты — как ряженый на святки — -Играешь в прятки сам с собой, -С твоим искусством и судьбой. - -В чужом костюме ходит Гамлет -И кое-что про что-то мямлит,- -Он хочет Моиси играть, -А не врагов отца карать. - -Из миллиона вероятий -Тебе одно придется кстати, -Но не дается, как назло -Твое заветное число. - -Загородил полнеба гений, -Не по тебе его ступени, -Но даже под его стопой -Ты должен стать самим собой. - -Найдешь и у пророка слово, -Но слово лучше у немого, -И ярче краска у слепца, -Когда отыскан угол зренья -И ты при вспышки озаренья -Собой угадан до конца. - -Арсений Александрович Тарковский -(1907-1989) - -стих 38 -Бабочка - -Ты прав. Одним воздушным очертаньем -Я так мила. -Весь бархат мой с его живым миганьем — -Лишь два крыла. - -Не спрашивай: откуда появилась? -Куда спешу? -Здесь на цветок я легкий опустилась -И вот — дышу. - -Надолго ли, без цели, без усилья, -Дышать хочу? -Вот-вот сейчас, сверкнув, раскину крылья -И улечу. - -Афанасий Афанасьевич Шеншин -(1820-1892) - -стих 39 -Зачем, не только в то лишь время… - -Зачем, не только в то лишь время, -Когда его тягчило бремя -Фемидиных несносных уз, -Отрекся он от милых муз -И с ними разорвал любезный, -Для всех питомцев их полезный, -Скрепленный славою союз? - -Но даже, посреди свободы, -Сестер парнасских хороводы -Его уж боле не манят? -Но пусть неблагодарный знает, -Что хоть он их и забывает, -Они взаимно не хотят -Платить любимцу их забвеньем -И с нежным дружеским терпеньем -Бессмертный лавр ему хранят. - -Василий Васильевич Капнист -(1758-1823) - -стих 40 -На смерть Блока - -Мгновенья высокой красы! — -Совсем незнакомый, чужой, -В одиннадцатом году, -Прислал мне «Ночные часы». -Я надпись его приведу: -«Поэту с открытой душой». - -Десятый кончается год -С тех пор. Мы не сблизились с ним. -Встречаясь, друг к другу не шли: -Не стужа ль безгранных высот -Смущала поэта земли?.. -Но дух его свято храним -Раздвоенным духом моим. - -Теперь пережить мне дано -Кончину еще одного -Собрата-гиганта. О, Русь -Согбенная! горбь, еще горбь -Болящую спину. Кого -Теряешь ты ныне? Боюсь, -Не слишком ли многое? Но -Удел твой — победная скорбь. - -Пусть варваром Запад зовет -Ему непосильный Восток! -Пусть смотрит с презреньем в лорнет -На русскую душу: глубок -Страданьем очищенный взлет, -Какого у Запада нет. -Вселенную, знайте, спасет -Наш варварский русский Восток! - -Игорь-Северянин -(1887-1941) - -стих 41 -Жарбог - -Жарбог! Жарбог! -Я в тебя грезитвой мечу, -Дола славный стаедей, -О, взметни ты мне навстречу -Стаю вольных жарирей. -Жарбог! Жарбог! -Волю видеть огнезарную -Стаю легких жарирей, -Дабы радугой стожарною -Вспыхнул морок наших дней. - -Велимир Хлебников -(1885-1922) - -стих 42 -Эхо - -Ревет ли зверь в лесу глухом, -Трубит ли рог, гремит ли гром, -Поет ли дева за холмом — -На всякий звук -Свой отклик в воздухе пустом -Родишь ты вдруг. - -Ты внемлешь грохоту громов, -И гласу бури и валов, -И крику сельских пастухов — -И шлешь ответ; -Тебе ж нет отзыва… Таков -И ты, поэт! - -Александр Сергеевич Пушкин -(1799-1837) - -стих 43 -Ветер принес издалёка - -Ветер принес издалёка -Песни весенней намек, -Где-то светло и глубоко -Неба открылся клочок. - -В этой бездонной лазури, -В сумерках близкой весны -Плакали зимние бури, -Реяли звездные сны. - -Робко, темно и глубоко -Плакали струны мои. -Ветер принес издалёка -Звучные песни твои. - -Александр Александрович Блок -(1880-1921) - -стих 44 -Похороны - -Толпы рабочих в волнах золотого заката. -Яркие стяги свиваются, плещутся, пляшут. - -На фонарях, над железной решеткой, -С крыш над домами -Платками -Машут. - -Смеркается. -Месяц серебряный, юный -Поднимается. - -Темною лентой толпа извивается. -Скачут драгуны. - -Вдоль оград, тротуаров,- вдоль скверов, -Над железной решеткой,- -Частый, короткий -Треск -Револьверов. - -Свищут пули, кося… -Ясный блеск -Там по взвизгнувшим саблям взвился. - -Глуше напев похорон. -Пули и плачут, и косят. -Новые тучи кровавых знамен — -Там, в отдаленье — проносят. - -Андрей Белый -(1880-1934) - -стих 45 -Лжи на свете нет меры - -Лжи на свете нет меры, -То ж лукавство да то ж. -Где ни ступишь, тут ложь; -Скроюсь вечно в пещеры, -В мир не помня дверей: -Люди злее зверей. - -Я сокроюсь от мира, -В мире дружба — лишь лесть -И притворная честь; -И под видом зефира -Скрыта злоба и яд, -В райском образе ад. - -В нем крючок богатится, -Правду в рынок нося -И законы кося; -Льстец у бар там лестится, -Припадая к ногам, -Их подобя богам. - -Там Кащей горько плачет: -«Кожу, кожу дерут!» -Долг с Кащея берут; -Он мешки в стену прячет, -А лишась тех вещей, -Стонет, стонет Кащей. - -Александр Петрович Сумароков -(1717-1777) - -стих 46 -Пробуждение - -Зефир последний свеял сон -С ресниц, окованных мечтами, -Но я — не к счастью пробужден -Зефира тихими крылами. -Ни сладость розовых лучей -Предтечи утреннего Феба, -Ни кроткий блеск лазури неба, -Ни запах, веющий с полей, -Ни быстрый лёт коня ретива -По скату бархатных лугов, -И гончих лай, и звон рогов -Вокруг пустынного залива — -Ничто души не веселит, -Души, встревоженной мечтами, -И гордый ум не победит -Любви — холодными словами. - -Константин Николаевич Батюшков -(1787-1855) - -стих 47 -Не более, чем сон - -Мне удивительный вчера приснился сон: -Я ехал с девушкой, стихи читавшей Блока. -Лошадка тихо шла. Шуршало колесо. -И слёзы капали. И вился русый локон. - -И больше ничего мой сон не содержал. -Но, потрясённый им, взволнованный глубоко, -Весь день я думаю, встревоженно дрожа, -О странной девушке, не позабывшей Блока. - -Игорь-Северянин -(1887-1941) - -стих 48 -Зреет рожь над жаркой нивой - -Зреет рожь над жаркой нивой, -И от нивы и до нивы -Гонит ветер прихотливый -Золотые переливы. - -Робко месяц смотрит в очи, -Изумлен, что день не минул, -Но широко в область ночи -День объятия раскинул. - -Над безбрежной жатвой хлеба -Меж заката и востока -Лишь на миг смежает небо -Огнедышащее око. - -Афанасий Афанасьевич Шеншин -(1820-1892) - -стих 49 -Девушка пела в церковном хоре - -Девушка пела в церковном хоре -О всех усталых в чужом краю, -О всех кораблях, ушедших в море, -О всех, забывших радость свою. - -Так пел ее голос, летящий в купол, -И луч сиял на белом плече, -И каждый из мрака смотрел и слушал, -Как белое платье пело в луче. - -И всем казалось, что радость будет, -Что в тихой заводи все корабли, -Что на чужбине усталые люди -Светлую жизнь себе обрели. - -И голос был сладок, и луч был тонок, -И только высоко, у Царских Врат, -Причастный Тайнам,- плакал ребенок -О том, что никто не придет назад. - -Александр Александрович Блок -(1880-1921) - -стих 50 -Опять стою я над Невой - -Опять стою я над Невой, -И снова, как в былые годы, -Смотрю и я, как бы живой, -На эти дремлющие воды. - -Нет искр в небесной синеве, -Все стихло в бледном обаянье, -Лишь по задумчивой Неве -Струится лунное сиянье. - -Во сне ль все это снится мне, -Или гляжу я в самом деле, -На что при этой же луне -С тобой живые мы глядели? - -Федор Иванович Тютчев -(1803-1873) - -стих 51 -Одним толчком согнать ладью живую - -Одним толчком согнать ладью живую -С наглаженных отливами песков, -Одной волной подняться в жизнь иную, -Учуять ветр с цветущих берегов, - -Тоскливый сон прервать единым звуком, -Упиться вдруг неведомым, родным, -Дать жизни вздох, дать сладость тайным мукам, -Чужое вмиг почувствовать своим, - -Шепнуть о том, пред чем язык немеет, -Усилить бой бестрепетных сердец — -Вот чем певец лишь избранный владеет, -Вот в чем его и признак и венец! - -Афанасий Афанасьевич Фет -(1820-1892) - -стих 52 -Закат Солнца - -Уж солнышко садится -За дальный неба круг, -И тень с горы ложится -На пестровидный луг. -Светильник дня прекрасный! -Ложись и ты, почий: -С зарею новой ясны -Ты вновь прострешь лучи. - -Не тот удел светилу -Дней смертного сужден: -Погас ли — в тьму унылу -Навек он погружен. -Так должно ль о беспрочной -Светильне нам жалеть, -Когда лишь краткосрочно -Назначено ей тлеть? - -Пускай, кто счастье, радость -Мнит в жизни сей обресть, -Кто льстится тем, что младость -Не может вдруг отцвесть,— -Пускай, пленясь мечтами, -Тот алчет долго жить -И обвивать цветами -Лишь паутинну нить; - -А мне, кого печалью -Свирепый рок гнетет, -Почто пленяться далью, -Где терн один растет? -Светильник дня прекрасный, -Ложися, опочий, -Но от страдальца ясны -Сокрой навек лучи. - -Василий Васильевич Капнист -(1758-1823) - -стих 53 -Шумит кустарник - -Шумит кустарник… На утес -Олень веселый выбегает, -Пугливо он подножный лес -С вершины острой озирает, -Глядит на светлые луга, -Глядит на синий свод небесный -И на днепровские брега, -Венчанны чащею древесной. -Недвижим, строен он стоит -И чутким ухом шевелит… - -Но дрогнул он — незапный звук -Его коснулся — боязливо -Он шею вытянул и вдруг -С вершины прянул… - -Александр Сергеевич Пушкин -(1799-1837) - -стих 54 -В цирке - -Клоун в огненном кольце… -Хохот мерзкий, как проказа, -И на гипсовом лице -Два горящих болью глаза. - -Лязг оркестра; свист и стук. -Точно каждый озабочен -Заглушить позорный звук -Мокро хлещущих пощечин. - -Как огонь, подвижный круг… -Люди — звери, люди — гады, -Как стоглазый, злой паук, -Заплетают в кольца взгляды. - -Все крикливо, все пестро… -Мне б хотелось вызвать снова -Образ бледного, больного, -Грациозного Пьеро… - -В лунном свете с мандолиной -Он поет в своем окне -Песню страсти лебединой -Коломбине и луне. - -Хохот мерзкий, как проказа; -Клоун в огненном кольце. -И на гипсовом лице -Два горящих болью глаза… - -Максимилиан Александрович Волошин -(1877-1932) - -стих 55 -Поэза о незабудках - -Поет Июнь, и песни этой зной -Палит мне грудь, и грезы, и рассудок. -Я изнемог и жажду незабудок, -Детей канав, что грезят под луной -Иным цветком, иною стороной. -Я их хочу: сирени запах жуток. -Он грудь пьянит несбыточной весной; -Я их хочу: их взор лазурный чуток, -И аромат целебен, как простор. -Как я люблю участливый их взор! -Стыдливые, как томны ваши чары… -Нарвите мне смеющийся букет, -В нем будет то, чего в сирени нет, -А ты, сирень, увянь в тоске нектара. - -Игорь-Северянин -(1887-1941) - -стих 56 -Властителям и судиям - -Восстал всевышний бог, да судит -Земных богов во сонме их; -Доколе, рек, доколь вам будет -Щадить неправедных и злых? - -Ваш долг есть: сохранять законы, -На лица сильных не взирать, -Без помощи, без обороны -Сирот и вдов не оставлять. - -Ваш долг: спасать от бед невинных, -Несчастливым подать покров; -От сильных защищать бессильных, -Исторгнуть бедных из оков. - -Не внемлют! видят — и не знают! -Покрыты мздою очеса: -Злодействы землю потрясают, -Неправда зыблет небеса. - -Цари! Я мнил, вы боги властны, -Никто над вами не судья, -Но вы, как я подобно, страстны, -И так же смертны, как и я. - -И вы подобно так падете, -Как с древ увядший лист падет! -И вы подобно так умрете, -Как ваш последний раб умрет! - -Воскресни, боже! боже правых! -И их молению внемли: -Приди, суди, карай лукавых, -И будь един царем земли! - -Гавриил Романович Державин -(1743-1816) - -стих 57 -Уж ты нива моя, нивушка - -Уж ты нива моя, нивушка, -Не скосить тебя с маху единого, -Не связать тебя всю во единый сноп! -Уж вы думы мои, думушки, -Не стряхнуть вас разом с плеч долой, -Одной речью-то вас не высказать! -По тебе ль, нива, ветер разгуливал, -Гнул колосья твои до земли, -Зрелые зерна все разметывал! -Широко вы, думы, порассыпались, -Куда пала какая думушка, -Там всходила люта печаль-трава, -Вырастало горе горючее. - -Алексей Константинович Толстой -(1817-1875) - -стих 58 -Мщение - -Изменой слуга паладина убил: -Убийце завиден сан рыцаря был. - -Свершилось убийство ночною порой — -И труп поглощен был глубокой рекой. - -И шпоры и латы убийца надел -И в них на коня паладинова сел. - -И мост на коне проскакать он спешит, -Но конь поднялся на дыбы и храпит. - -Он шпоры вонзает в крутые бока — -Конь бешеный сбросил в реку седока. - -Он выплыть из всех напрягается сил, -Но панцирь тяжелый его утопил. - -Перевод стихотворения Людвига Уланда -от Василия Андреевича Жуковского -(1783-1852) - -стих 59 -Паучок - -Я привёз из Каракумов -Очень злого паучка, -Он зовётся каракуртом — -Он из жителей песка. - -Им укушенный верблюд -Не живёт пяти минут. - -Я привёз из Каракумов -Очень злого паучка, -Он зовётся «чёрной смертью» — -Житель жёлтого песка. - -Если кто меня разлюбит, -Паучок того погубит. - -Сергей Владимирович Михалков -(1913-2009) - -стих 60 -Была пора, и лед потока - - -Была пора, и лед потока -Лежал под снежной пеленой, -Недосягаемо для ока -Таился речки бег живой. - -Пришла весна, ее дыханье -Над снежным пронеслось ковром, -И стали видны содроганья -Струи, бегущей подо льдом. - -И близки дни, когда все блага -К нам низведет пора любви, -И мне зарей раскроет влага -Объятья чистые свои. - -Афанасий Афанасьевич Фет -(1820-1892) - -стих 61 -Наш век - -Не плоть, а дух растлился в наши дни, -И человек отчаянно тоскует… -Он к свету рвется из ночной тени -И, свет обретши, ропщет и бунтует. - -Безверием палим и иссушен, -Невыносимое он днесь выносит… -И сознает свою погибель он, -И жаждет веры… но о ней не просит… - -Не скажет ввек, с молитвой и слезой, -Как ни скорбит перед замкнутой дверью: -«Впусти меня!- Я верю, боже мой! -Приди на помощь моему неверью!..» - -Федор Иванович Тютчев -(1803-1873) - -стих 62 -Человек - -Все творенья в божьем мире -Так прекрасны, хороши! -Но прекрасней человека -Ничего нет на земли! - -То себя он ненавидит; -То собой он дорожит; -То полюбит, то разлюбит; -За миг жизни век дрожит… - -Даст желаньям ли свободу, – -Землю кровью напоит; -Буйной воле даст ли волю, – -Под ним море закипит. - -Но изменятся стремленья, -Озарится светом ум, — -И своей он красотою -Всё на свете помрачит… - -Алексей Васильевич Кольцов -(1809-1842) - -стих 63 -Жизнь - -Умом легко нам свет обнять; -В нем мыслью вольной мы летаем; -Что не дано нам понимать – -Мы все как будто понимаем. - -И резко судим обо всём, -С веков покрова не снимая; -Дошло, — что людям нипочем -Сказать: вот тайна мировая! - -Как свет стоит, до этих пор -Всего мы много пережили; -Страстей мы видели напор; -За царством царство схоронили. - -Живя, проникли глубоко -В тайник природы чудотворной; -Одни познанья взяли мы легко, -Другие — силою упорной… - -Но всё ж успех наш не велик. -Что до преданий? — мы не знаем. -Вперед что будет — кто проник? -Что мы теперь? — не разгадаем. - -Один лишь опыт говорит, -Что прежде нас здесь люди жили, — -И мы живём — и будут жить. -Вот каковы все наши были!.. - -Алексей Васильевич Кольцов -(1809-1842) - -стих 64 -Подражание Пушкину - -Лентин к дьякону бежит, -Лентин дьякону кричит: -«Дьякон, где бы нам напиться, -Как бы нам распорядиться?» -Дьякон Лентину в ответ: -«Знаю где, да денег нет! -У Степана Бардакова -Штофа три вина простова, -Где достал и вкус каков, -Знает, верно, Бердышов -И Катюха повариха, -И Устинья столяриха, -Знает Зубов Андреян, -Знает Храпов, но он пьян -И не скажет нам ни слова, -А жаль случая такова!» - -Иван Петрович Мятлев -(1796-1844) - -стих 65 -Розы - -Как хороши, как свежи были розы -В моем саду! Как взор прельщали мой! -Как я молил весенние морозы -Не трогать их холодною рукой! - -Как я берег, как я лелеял младость -Моих цветов заветных, дорогих; -Казалось мне, в них расцветала радость, -Казалось мне, любовь дышала в них. - -Но в мире мне явилась дева рая, -Прелестная, как ангел красоты, -Венка из роз искала молодая, -И я сорвал заветные цветы. - -И мне в венке цветы еще казались -На радостном челе красивее, свежей, -Как хорошо, как мило соплетались -С душистою волной каштановых кудрей! - -И заодно они цвели с девицей! -Среди подруг, средь плясок и пиров, -В венке из роз она была царицей, -Вокруг ее вились и радость и любовь. - -В ее очах — веселье, жизни пламень; -Ей счастье долгое сулил, казалось, рок. -И где ж она?.. В погосте белый камень, -На камне — роз моих завянувший венок. - -Иван Петрович Мятлев -(1796-1844) - -стих 66 -Ангел - -В дверях эдема ангел нежный -Главой поникшею сиял, -А демон мрачный и мятежный -Над адской бездною летал. - -Дух отрицанья, дух сомненья -На духа чистого взирал -И жар невольный умиленья -Впервые смутно познавал. - -«Прости, — он рек, — тебя я видел, -И ты недаром мне сиял: -Не все я в небе ненавидел, -Не все я в мире презирал». - -Александр Сергеевич Пушкин -(1799-1837) - -стих 67 -Асе -Те же — приречные мрежи, -Серые сосны и пни; -Те же песчаники; те же — -Сирые, тихие дни; - -Те же немеют с отвеса -Крыши поникнувших хат; -Синие линии леса -Немо темнеют в закат. - -А над немым перелеском, -Где разредились кусты, -Там проясняешься блеском -Неугасимым — Ты! - -Струями ярких рубинов -Жарко бежишь по крови: -Кроет крыло серафимов -Пламенно очи мои. - -Бегом развернутых крылий -Стала крылатая кровь. -Давние, давние были -Приоткрываются вновь. - -В давнем грядущие встречи; -В будущем — давность мечты; -Неизреченные речи, -Неизъяснимая — Ты! - -Андрей Белый -(1880-1934) - -стих 68 -29 января 1837 - -Из чьей руки свинец смертельный -Поэту сердце растерзал? -Кто сей божественный фиал -Разрушил, как сосуд скудельный? -Будь прав или виновен он -Пред нашей правдою земною, -Навек он высшею рукою -В «цареубийцы» заклеймен. - -Но ты, в безвременную тьму -Вдруг поглощенная со света, -Мир, мир тебе, о тень поэта, -Мир светлый праху твоему!.. -Назло людскому суесловью -Велик и свят был жребий твой!.. -Ты был богов орган живой, -Но с кровью в жилах… знойной кровью. - -И сею кровью благородной -Ты жажду чести утолил — -И осененный опочил -Хоругвью горести народной. -Вражду твою пусть тот рассудит, -Кто слышит пролитую кровь… -Тебя ж, как первую любовь, -России сердце не забудет!.. - -Федор Иванович Тютчев -(1803-1873) - -стих 69 -Пророк - -Не говори: «Забыл он осторожность! -Он будет сам судьбы своей виной!..» -Не хуже нас он видит невозможность -Служить добру, не жертвуя собой. - -Но любит он возвышенней и шире, -В его душе нет помыслов мирских. -«Жить для себя возможно только в мире, -Но умереть возможно для других!» - -Так мыслит он — и смерть ему любезна. -Не скажет он, что жизнь его нужна, -Не скажет он, что гибель бесполезна: -Его судьба давно ему ясна… - -Его еще покамест не распяли, -Но час придет — он будет на кресте; -Его послал бог Гнева и Печали -Рабам земли напомнить о Христе. - -Николай Алексеевич Некрасов -(1821-1878) - -стих 70 -Маскарад - -Брал мальчика отец с собою в маскарад, -А мальчик узнавать умел людей под маской -Пляской, -Какой бы кто ни вздел сокрыть себя наряд. -Неладно прыгая, всей тушей там тряхнулся, -Упал, расшиб он лоб, расквасил мозг, рехнулся, -Но выздоровел бы по-прежнему плясать, -Когда бы без ума не стал стихов писать. -Склад был безмерно гнусен, -Не видывал еще никто подобных врак. -О мальчик! узнавать ты был людей искусен, -Но знаешь ли теперь, что ты парнасский рак? -Ты в масках прежде знал людей по виду пляски, -А ныне сам себя не знаешь и без маски. -Брось музу, если быть не хочешь ты дурак. - -Александр Петрович Сумароков -(1717-1777) - -стих 71 -Шумит на дворе непогода - -Шумит на дворе непогода, -А в доме давно уже спят; -К окошку, вздохнув, подхожу я — -Чуть виден чернеющий сад; - -На небе так темно, так темно -И звездочки нет ни одной, -А в доме старинном так грустно -Среди непогоды ночной! - -Дождь бьет, барабаня, по крыше, -Хрустальные люстры дрожат, -За шкапом проворные мыши -В бумажных обоях шумят; - -Они себе чуют раздолье: -Как скоро хозяин умрет, -Наследник покинет поместье, -Где жил его доблестный род, - -И дом навсегда запустеет, -Заглохнут ступени травой… -И думать об этом так грустно -Среди непогоды ночной! - -Алексей Константинович Толстой -(1817-1875) - -стих 72 -То было раннею весной - -То было раннею весной, -Трава едва всходила, -Ручьи текли, не парил зной, -И зелень рощ сквозила; - -Труба пастушья поутру -Еще не пела звонко, -И в завитках еще в бору -Был папоротник тонкий. - -То было раннею весной, -В тени берез то было, -Когда с улыбкой предо мной -Ты очи опустила. - -То на любовь мою в ответ -Ты опустила вежды — -О жизнь! о лес! о солнца свет! -О юность! о надежды! - -И плакал я перед тобой, -На лик твой глядя милый,- -То было раннею весной, -В тени берез то было! - -То было утро наших лет — -О счастие! о слезы! -О лес! о жизнь! о солнца свет! -О свежий дух березы! - -Алексей Константинович Толстой -(1817-1875) - -стих 73 -Классические розы - -В те времена, когда роились грезы -В сердцах людей, прозрачны и ясны, -Как хороши, как свежи были розы -Моей любви, и славы, и весны! - -Прошли лета, и всюду льются слезы… -Нет ни страны, ни тех, кто жил в стране… -Как хороши, как свежи ныне розы -Воспоминаний о минувшем дне! - -Но дни идут — уже стихают грозы. -Вернуться в дом Россия ищет троп… -Как хороши, как свежи будут розы, -Моей страной мне брошенные в гроб! - -Игорь-Северянин -(1887-1941) - -стих 74 -Зимнее небо - -Талый снег налетал и слетал, -Разгораясь, румянились щеки, -Я не думал, что месяц так мал -И что тучи так дымно-далеки… - -Я уйду, ни о чем не спросив, -Потому что мой вынулся жребий, -Я не думал, что месяц красив, -Так красив и тревожен на небе. - -Скоро полночь. Никто и ничей, -Утомлен самым призраком жизни, -Я любуюсь на дымы лучей -Там, в моей обманувшей отчизне. - -Иннокентий Федорович Анненский -(1855-1909) - -стих 75 -В вагоне - -Довольно дел, довольно слов, -Побудем молча, без улыбок, -Снежит из низких облаков, -А горний свет уныл и зыбок. - -В непостижимой им борьбе -Мятутся черные ракиты. -«До завтра,- говорю тебе,- -Сегодня мы с тобою квиты». - -Хочу, не грезя, не моля, -Пускай безмерно виноватый, -Глядеть на белые поля -Через стекло с налипшей ватой. - -А ты красуйся, ты — гори… -Ты уверяй, что ты простила, -Гори полоской той зари, -Вокруг которой всё застыло. - -Иннокентий Федорович Анненский -(1855-1909) - -стих 76 -Два великана - -В шапке золота литого -Старый русский великан -Поджидал к себе другого -Из далёких чуждых стран. - -За горами, за долами -Уж гремел об нём рассказ, -И померяться главами -Захотелось им хоть раз. - -И пришёл с грозой военной -Трёхнедельный удалец — -И рукою дерзновенной -Хвать за вражеский венец. - -Но улыбкой роковою -Русский витязь отвечал; -Посмотрел — тряхнул главою… -Ахнул дерзкий — и упал! - -Но упал он в дальнем море -На неведомый гранит, -Там, где буря на просторе -Над пучиною шумит. - -Михаил Юрьевич Лермонтов -(1814-1841) - -стих 77 -Смерть Орфеева - -Нимфы, плачьте! Нет Орфея!.. -Ветр унылый, тихо вея, -Нам вещает: «Нет его!» -Ярость фурий исступленных, -Гнусной страстью воспаленных, -Прекратила жизнь того, -Кто пленял своей игрою -Кровожаждущих зверей, -Гармонической струною -Трогал сердце лютых грей -И для нежной Эвридики -В Тартар мрачный нисходил. -Ах, стенайте! – берег дикий -Прах его в себя вместил. -Сиротеющая лира -От дыхания зефира -Звук печальный издает: -«Нет певца! Орфея нет!» -Эхо повторяет: нет! -Над могилою священной, -Мягким дерном покровенной, -Филомела слезы льет. - -Николай Михайлович Карамзин -(1766-1826) - -стих 78 -Врубелю - -Так тихо-долго шла жизнь на убыль -В душе, исканьем обворованной… -Так странно тихо растаял Врубель, -Так безнадежно очарованный… - -Ему фиалки струили дымки -Лица трагически-безликого… -Душа впитала все невидимки, -Дрожа в преддверии великого… - -Но дерзновенье слепило кисти, -А кисть дразнила дерзновенное… -Он тихо таял, — он золотистей -Пылал душою вдохновенною… - -Цветов побольше на крышку гроба; -В гробу — венчанье!.. Отныне оба — -Мечта и кисть — в немой гармонии, -Как лейтмотив больной симфонии. - -Игорь-Северянин -(1887-1941) - -стих 79 -Чкалов - -Изо всех больших имен геройских, -Что известны нам наперечет, -Как-то по-особому, по-свойски, -Это имя называл народ. - -Попросту — мы так его любили, -И для всех он был таким своим, -Будто все мы в личной дружбе были, -Пили, ели и летали с ним… - -Богатырским мужеством и нравом -Был он славен — Сталинский пилот. -И казалось так, что эта слава — -Не года, уже века живет. - -Что она из повестей старинных -Поднялась сквозь вековую тьму, -Что она от витязей былинных -По наследству перешла к нему. - -Пусть же по наследству и по праву -В память о делах твоих, пилот, -Чкаловское мужество и слава -Чкаловским питомцам перейдет! - -Александр Трифонович Твардовский -(1910-1971) - -стих 80 -Пушкину - -Мечтая о могучем даре -Того, кто русской стал судьбой, -Стою я на Тверском бульваре, -Стою и говорю с собой. - -Блондинистый, почти белесый, -В легендах ставший как туман, -О Александр! Ты был повеса, -Как я сегодня хулиган. - -Но эти милые забавы -Не затемнили образ твой, -И в бронзе выкованной славы -Трясешь ты гордой головой. - -А я стою, как пред причастьем, -И говорю в ответ тебе: -Я умер бы сейчас от счастья, -Сподобленный такой судьбе. - -Но, обреченный на гоненье, -Еще я долго буду петь… -Чтоб и мое степное пенье -Сумело бронзой прозвенеть. - -Сергей Александрович Есенин -(1895-1925) - -стих 81 -Как неожиданно и ярко - -Как неожиданно и ярко, -На влажной неба синеве, -Воздушная воздвиглась арка -В своем минутном торжестве! -Один конец в леса вонзила, -Другим за облака ушла — -Она полнеба обхватила -И в высоте изнемогла. - -О, в этом радужном виденье -Какая нега для очей! -Оно дано нам на мгновенье, -Лови его — лови скорей! -Смотри — оно уж побледнело, -Еще минута, две — и что ж? -Ушло, как то уйдет всецело, -Чем ты и дышишь и живёшь. - -Федор Иванович Тютчев -(1803-1873) - -стих 82 -Не множеством картин старинных мастеров - -Не множеством картин старинных мастеров -Украсить я всегда желал свою обитель, -Чтоб суеверно им дивился посетитель, -Внимая важному сужденью знатоков. - -В простом углу моем, средь медленных трудов, -Одной картины я желал быть вечно зритель, -Одной: чтоб на меня с холста, как с облаков, -Пречистая и наш божественный спаситель — - -Она с величием, он с разумом в очах — -Взирали, кроткие, во славе и в лучах, -Одни, без ангелов, под пальмою Сиона. - -Исполнились мои желания. Творец -Тебя мне ниспослал, тебя, моя Мадонна, -Чистейшей прелести чистейший образец. - -Александр Сергеевич Пушкин -(1799-1837) - -стих 83 -Юмористам отечественных записок - -Поморная муза резва: -В стихах, понимаете, надо -Уметь, как расставить слова, -Чтоб свистнуло с первого взгляда. - -Умеючи надо шутить -С богиней веселых мелодий; -Как вам нужно кушать и пить, -Так нужен размер для пародий. - -Богине мелодий верны, -Поморные я все староверы -И скромно, как все свистуны, -Свистят, соблюдая размеры. - -За то им богинею дан, -Надежнее стали звенящей, -Для битвы с врагом талисман: -Стих, мягко и нежно свистящий, - -Одним услаждающий слух, -Других повергающий в холод, -И главное: легкий, как пух, -Но пошлость дробящий, как молот - -Василий Степанович Курочкин -(1831-1875) - -стих 84 -На смерть князя Мещерского - -Глагол времен! металла звон! -Твой страшный глас меня смущает, -Зовет меня, зовет твой стон, -Зовет — и к гробу приближает. -Едва увидел я сей свет, -Уже зубами смерть скрежещет, -Как молнией, косою блещет -И дни мои, как злак, сечет. - -Ничто от роковых кохтей, -Никая тварь не убегает: -Монарх и узник — снедь червей, -Гробницы злость стихий снедает; -Зияет время славу стерть: -Как в море льются быстры воды, -Так в вечность льются дни и годы; -Глотает царства алчна смерть. - -Скользим мы бездны на краю, -В которую стремглав свалимся; -Приемлем с жизнью смерть свою, -На то, чтоб умереть, родимся. -Без жалости все смерть разит: -И звезды ею сокрушатся, -И солнцы ею потушатся, -И всем мирам она грозит. - -Не мнит лишь смертный умирать -И быть себя он вечным чает; -Приходит смерть к нему, как тать, -И жизнь внезапу похищает. -Увы! где меньше страха нам, -Там может смерть постичь скорее; -Ее и громы не быстрее -Слетают к гордым вышинам. - -Сын роскоши, прохлад и нег, -Куда, Мещерский! ты сокрылся? -Оставил ты сей жизни брег, -К брегам ты мертвых удалился; -Здесь персть твоя, а духа нет. -Где ж он? — Он там.- Где там? — Не знаем. -Мы только плачем и взываем: -«О, горе нам, рожденным в свет!» - -Утехи, радость и любовь -Где купно с здравием блистали, -У всех там цепенеет кровь -И дух мятется от печали. -Где стол был яств, там гроб стоит; -Где пиршеств раздавались лики, -Надгробные там воют клики, -И бледна смерть на всех глядит. - -Глядит на всех — и на царей, -Кому в державу тесны миры; -Глядит на пышных богачей, -Что в злате и сребре кумиры; -Глядит на прелесть и красы, -Глядит на разум возвышенный, -Глядит на силы дерзновенны -И точит лезвие косы. - -Смерть, трепет естества и страх! -Мы — гордость, с бедностью совместна; -Сегодня бог, а завтра прах; -Сегодня льстит надежда лестна, -А завтра: где ты, человек? -Едва часы протечь успели, -Хаоса в бездну улетели, -И весь, как сон, прошел твой век. - -Как сон, как сладкая мечта, -Исчезла и моя уж младость; -Не сильно нежит красота, -Не столько восхищает радость, -Не столько легкомыслен ум, -Не столько я благополучен; -Желанием честей размучен, -Зовет, я слышу, славы шум. - -Но так и мужество пройдет -И вместе к славе с ним стремленье; -Богатств стяжание минет, -И в сердце всех страстей волненье -Прейдет, прейдет в чреду свою. -Подите счастьи прочь возможны, -Вы все пременны здесь и ложны: -Я в дверях вечности стою. - -Сей день иль завтра умереть, -Перфильев! должно нам конечно,- -Почто ж терзаться и скорбеть, -Что смертный друг твой жил не вечно? -Жизнь есть небес мгновенный дар; -Устрой ее себе к покою -И с чистою твоей душою -Благословляй судеб удар. - -Гавриил Романович Державин -(1743-1816) - -стих 85 -Отрывок из «Бродяги» - -День вечерел. Косая тень -Ложилась низко и широко… -Заутра праздник, вещий день -Ильи, гремящего пророка… - -Приди ты, немощный, -Приди ты, радостный! -Звонят ко всенощной, -К молитве благостной. -И звон смиряющий -Всем в душу просится, -Окрест сзывающий, -В полях разносится! - -В Холмах, селе большом, -Есть церковь новая; -Воздвигла божий дом -Сума торговая; -И службы божие -Богато справлены, -Икон подножия -Свечьми уставлены. -И стар и млад войдет — -Сперва помолится, -Поклон земной кладет, -Кругом поклонится; - -Аксаков Иван Сергеевич -(1823-1886) - -стих 86 -Воззвание - -Приди ты, немощный, -Приди ты, радостный. - -Приди — не знающий -Любостяжания, -Приди — не чающий -С истцов даяния, -Виновных жёнами -Не соблазнившийся -И лишь законами -Руководившийся, -Злом не торгующий, -Добра не давящий, -Споспешествующий -И правоправящий! -Придите, сильные, -Придите, слабые, -Правдообильные! -Придите — дабы я -Деянья честности, -Душевной ясности -Обрек известности -Посредством гласности! - -Василий Степанович Курочкин -(1831-1875) - -стих 87 -Царскосельская статуя - -Урну с водой уронив, об утес ее дева разбила. -Дева печально сидит, праздный держа черепок. -Чудо! не сякнет вода, изливаясь из урны разбитой; -Дева, над вечной струей, вечно печальна сидит. - -Александр Сергеевич Пушкин - (1799-1837) - -стих 88 -Преданность - -Преданность вечно была в характере русского люда. -Кто же не предан теперь? Ни одного не найдешь. -Каждый, кто глуп или подл, предан, конечно, престолу; -Каждый, кто честен, умен, предан будет суду. - -Михаил Ларионович Михайлов - (1829-1865) - -стих 89 -И скучно и грустно - -И скучно и грустно, и некому руку подать -В минуту душевной невзгоды… -Желанья!.. что пользы напрасно и вечно желать?.. -А годы проходят — все лучшие годы! - -Любить… но кого же?.. на время — не стоит труда, -А вечно любить невозможно. -В себя ли заглянешь? — там прошлого нет и следа: -И радость, и муки, и всё там ничтожно… - -Что страсти? — ведь рано иль поздно их сладкий недуг -Исчезнет при слове рассудка; -И жизнь, как посмотришь с холодным вниманьем вокруг — -Такая пустая и глупая шутка… - -Михаил Юрьевич Лермонтов -(1814-1841) - -стих 90 -Как океан меняет цвет - -Как океан меняет цвет, -Когда в нагроможденной туче -Вдруг полыхнет мигнувший свет,一 -Так сердце под грозой певучей -Меняет строй, боясь вздохнуть, -И кровь бросается в ланиты, -И слезы счастья душат грудь -Перед явленьем Карменситы. - -Александр Александрович Блок -(1880-1921) - -стих 91 -Плюшевые волки - -Плюшевые волки, -Зайцы, погремушки. -Детям дарят с елки -Детские игрушки. - -И, состарясь, дети -До смерти без толку -Все на белом свете -Ищут эту елку. - -Где жар-птица в клетке, -Золотые слитки, -Где висит на ветке -Счастье их на нитке. - -Только дед-мороза -Нету на макушке, -Чтоб в ответ на слезы -Сверху снял игрушки. - -Желтые иголки -На пол опадают… -Всё я жду, что с ёлки -Мне тебя подарят. - -Константин Михайлович Симонов -(1915-1979) - -стих 92 -Глупой красавице - -Амур спросил меня однажды, -Хочу ль испить его вина, — -Я не имел в то время жажды, -Но выпил кубок весь до дна. - -Теперь желал бы я напрасно -Смочить горящие уста, -Затем что чаша влаги страстной, -Как голова твоя, — пуста. - -Михаил Юрьевич Лермонтов -(1814-1841) - -стих 93 -Статуя - -Лошадь влекли под уздцы на чугунный -Мост. Под копытом чернела вода. -Лошадь храпела, и воздух безлунный -Храп сохранял на мосту навсегда. -Песни воды и хрипящие звуки -Тут же вблизи расплывались в хаос. -Их раздирали незримые руки. -В черной воде отраженье неслось. -Мерный чугун отвечал однотонно. -Разность отпала. И вечность спала. -Черная ночь неподвижно, бездонно — -Лопнувший в бездну ремень увлекла. -Всё пребывало. Движенья, страданья -Не было. Лошадь храпела навек. -И на узде в напряженьи молчанья -Вечно застывший висел человек. - -Александр Александрович Блок -(1880-1921) - -стих 94 -Соловей, галки и вороны - -Прошедшею весною, -Вечернею зарею -В лесочке сем певал любезный соловей. -Пришла опять весна: где друг души моей? -Ах, нет его! Зачем он скрылся? -Зачем? В лесочке поселился -Хор галок и ворон. Они и день и ночь -Кричат, усталости не знают, -И слух людей (увы!) безжалостно терзают! -Что ж делать соловью? — Лететь подале прочь! -Жестокие врали и прозой и стихами! -Какому соловью петь можно вместе с вами? - -Николай Михайлович Карамзин -(1766-1826) - -стих 95 -С поляны коршун поднялся - -С поляны коршун поднялся, -Высоко к небу он взвился; -Всё выше, дале вьется он — -И вот ушел за небосклон! - -Природа-мать ему дала -Два мощных, два живых крыла — -А я здесь в поте и в пыли. -Я, царь земли, прирос к земли!.. - -Фёдор Иванович Тютчев -(1803-1873) - -стих 96 -Синица - -Синица на море пустилась: -Она хвалилась, -Что хочет море сжечь. -Расславилась тотчас о том по свету речь. -Страх обнял жителей Нептуновой столицы; -Летят стадами птицы; -А звери из лесов сбегаются смотреть, -Как будет Океан, и жарко ли гореть. -И даже, говорят, на слух молвы крылатой, -Охотники таскаться по пирам -Из первых с ложками явились к берегам, -Чтоб похлебать ухи такой богатой, -Какой-де откупщик и самый тароватый -Не давывал секретарям. -Толпятся: чуду всяк заранее дивится, -Молчит и, на море глаза уставя, ждет; -Лишь изредка иной шепнет: -«Вот закипит, вот тотчас загорится!» -Не тут-то: море не горит. -Кипит ли хоть? — и не кипит. -И чем же кончились затеи величавы? -Синица со стыдом восвояси уплыла; -Наделала Синица славы, -А море не зажгла. -_____________________________________________ -Примолвить к речи здесь годится, -Но ничьего не трогая лица: -Что делом, не сведя конца, -Не надобно хвалиться. - -Иван Андреевич Крылов -(1769-1844) - -стих 97 -Разлука - -Вытерла заплаканное личико, -Ситцевое платьице взяла, -Вышла — и, как птичка–невеличка, -В басенку, как в башенку, пошла. - -И теперь мне постоянно снится, -Будто ты из басенки ушла, -Будто я женат был на синице, -Что когда–то море подожгла. - -Михаил Аркадьевич Светлов -(1903-1964) - -стих 98 -Муха - -Бык с плугом на покой тащился по трудах; -А Муха у него сидела на рогах, -И Муху же они дорогой повстречали. -«Откуда ты, сестра?» — от этой был вопрос. -А та, поднявши нос, -В ответ ей говорит: «Откуда? — мы пахали!» - -От басни завсегда -Нечаянно дойдешь до были. -Случалось ли подчас вам слышать, господа: -«Мы сбили! Мы решили!» - -Иван Иванович Дмитриев -(1760-1837) - -стих 99 -Снегири - -Тихо-тихо сидят снегири на снегу -меж стеблей прошлогодней крапивы; -я тебе до конца описать не смогу, -как они и бедны и красивы! - -Тихо-тихо клюют на крапиве зерно,— -без кормежки прожить не шутки!— -пусть крапивы зерно, хоть не сытно оно, -да хоть что-нибудь будет в желудке. - -Тихо-тихо сидят на снегу снегири — -на головках бобровые шапочки; -у самца на груди отраженье зари, -скромно-серые перья на самочке. - -Поскакали вприпрыжку один за другой -по своей падкрапивенской улице; -небо взмыло над ними высокой дугой, -снег последний поземкою курится. - -И такая вокруг снегирей тишина, -так они никого не пугаются, -и так явен их поиск скупого зерна, -что понятно: весна надвигается! - -Николай Николаевич Асеев -(1889-1963) - -стих 100 -Изрек пророк - -Изрек пророк: -— Нет бога, кроме бога!- -Я говорю: -— Нет мамы, кроме мамы!..- -Никто меня не встретит у порога, -Где сходятся тропинки, словно шрамы. - -Вхожу и вижу четки, -на которых -Она в разлуке, сидя одиноко, -Считала ночи, черные, как порох, -И белы дни, летящие с востока. - -Кто разожжет теперь огонь в камине, -Чтобы зимой согрелся я с дороги? -Кто мне, любя, грехи отпустит ныне -И за меня помолится в тревоге? - -Я в руки взял Коран, тисненный строго, -Пред ним склонялись грозные имамы. -Он говорит: -— Нет бога, кроме бога!- -Я говорю: -— Нет мамы, кроме мамы! - -Расул Гамзатович Гамзатов -(1929-2003) - -стих 101 -«Walking Time» - -Январский мороз, -Лицо полно слёз. -Мне не согреться, -Погасло сердце. - -От неё иду, -Чувства во льду. -Она поняла, -С меня спали рога. - -Глаза вскрыли боль: -Была она нагой, -С ней лежал другой. -Туда больше не ногой. - -Разрушен дуэт, -Простыл любви след. -Друг другу мы никто, -Теперь всё прошло. - -Нет, я должен простить, -Восстановить нить -Любви между нами, -Двумя полюсами. - -Она как родня, -Мне жизнью верна. -Немного ошиблась, -Погорячилась. - -Куплю ей айфон -И буду прощен. -С кредиткой от Альфа, -Так больше кайфа! - -Тимур Вульфов -(200X-XXXX) - -стих 102 diff --git a/back/unimportant.env b/back/unimportant.env deleted file mode 100644 index 3e418f7..0000000 --- a/back/unimportant.env +++ /dev/null @@ -1,2 +0,0 @@ -TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODYyMjUzMzMsImlhdCI6MTY5MTUzMDkzMywianRpIjoiYjU0MmU3MTQtYzJkMS00NTY2LWJkY2MtYmQ5NzA0ODY1ZjgzIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6IjJhOTgwMzUyLTY1M2QtNGZlZC1iMDI1LWQ1N2U0NDRjZmM3NiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiIyYTk4MDM1Mi02NTNkLTRmZWQtYjAyNS1kNTdlNDQ0Y2ZjNzYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.FTKiC1hpWcOkmSW9QZpC-RY7Ko50jw1mDMfXIWYxlQ-zehLm2CLmOnHvYoOoI39k2OzeCIAB9ZdRrrGZc6G9Z1eFELUjNGEqKxSC1Phj9ATemKgbOKEttk-OGc-rFr9VPA8_SnfvLts6wTI2YK33YBIxCF5nCbnr4Qj3LeEQ0d6Hy8PO4ATrBF5EOeuAZRprvIEjXe_f8N9ONKckCPB-xFB4P2pZlVXGoCNoewGEcY3zXH4khezN6zcVr6tpc6G8dBv9EqT_v92IDSg-aXQk6ysA0cO0-6x5w1-_qU0iHGIAPsLNV9IKBoFbjc0JH6cWabldPRH12NP1trvYfqKDGQ" -DOMAIN = "https://geointelect2.gate.petersburg.ru" \ No newline at end of file diff --git a/front/src/api/putAnnouncement/index.ts b/front/src/api/putAnnouncement/index.ts index 0cc2cb4..c4de6e9 100644 --- a/front/src/api/putAnnouncement/index.ts +++ b/front/src/api/putAnnouncement/index.ts @@ -6,7 +6,7 @@ const composePutAnnouncementURL = () => ( ) const processPutAnnouncement = (data: PutAnnouncementResponse): PutAnnouncement => { - return data.Answer + return data.Success } export { composePutAnnouncementURL, processPutAnnouncement } diff --git a/front/src/api/putAnnouncement/types.ts b/front/src/api/putAnnouncement/types.ts index 9339351..dc2b676 100644 --- a/front/src/api/putAnnouncement/types.ts +++ b/front/src/api/putAnnouncement/types.ts @@ -1,12 +1,12 @@ import { isObject } from '../../utils/types' type PutAnnouncementResponse = { - Answer: boolean, + Success: boolean, } const isPutAnnouncementResponse = (obj: unknown): obj is PutAnnouncementResponse => ( isObject(obj, { - 'Answer': 'boolean', + 'Success': 'boolean', }) ) diff --git a/front/src/api/removeAnnouncement/index.ts b/front/src/api/removeAnnouncement/index.ts index dd52f7a..0aee986 100644 --- a/front/src/api/removeAnnouncement/index.ts +++ b/front/src/api/removeAnnouncement/index.ts @@ -6,11 +6,11 @@ const composeRemoveAnnouncementURL = () => ( ) function processRemoveAnnouncement(data: RemoveAnnouncementResponse): RemoveAnnouncement { - if (!data.Answer) { + if (!data.Success) { throw new Error('Не удалось закрыть объявление') } - return data.Answer + return data.Success } export { composeRemoveAnnouncementURL, processRemoveAnnouncement } diff --git a/front/src/api/removeAnnouncement/types.ts b/front/src/api/removeAnnouncement/types.ts index 016379a..4a02fd8 100644 --- a/front/src/api/removeAnnouncement/types.ts +++ b/front/src/api/removeAnnouncement/types.ts @@ -1,12 +1,12 @@ import { isObject } from '../../utils/types' type RemoveAnnouncementResponse = { - Answer: boolean, + Success: boolean, } const isRemoveAnnouncementResponse = (obj: unknown): obj is RemoveAnnouncementResponse => ( isObject(obj, { - 'Answer': 'boolean', + 'Success': 'boolean', }) ) diff --git a/front/src/hooks/api/useAddAnnouncement.ts b/front/src/hooks/api/useAddAnnouncement.ts index c8701b0..5680439 100644 --- a/front/src/hooks/api/useAddAnnouncement.ts +++ b/front/src/hooks/api/useAddAnnouncement.ts @@ -14,8 +14,8 @@ function useAddAnnouncement() { processPutAnnouncement ) - function handleAdd(formData: FormData) { - void doSend({}, { + async function handleAdd(formData: FormData) { + await doSend({}, { body: formData, }) } diff --git a/front/src/hooks/api/useBook.ts b/front/src/hooks/api/useBook.ts index 5a1e091..53a0eea 100644 --- a/front/src/hooks/api/useBook.ts +++ b/front/src/hooks/api/useBook.ts @@ -15,8 +15,8 @@ function useBook() { processBook, ) - const handleBook = useCallback((id: number) => { - void doSend({}, { + const handleBook = useCallback(async (id: number) => { + await doSend({}, { body: JSON.stringify({ id, }), diff --git a/front/src/hooks/useSendButtonCaption.ts b/front/src/hooks/useSendButtonCaption.ts index 55e1fa0..25b7041 100644 --- a/front/src/hooks/useSendButtonCaption.ts +++ b/front/src/hooks/useSendButtonCaption.ts @@ -12,7 +12,7 @@ function useSendButtonCaption( const [title, setTitle] = useState(initial) const update = useCallback(>(data: T | null | undefined) => { - if (data !== undefined) { // not loading + if (data !== undefined && data !== null) { // not loading or error setCaption(result) setTitle('Отправить ещё раз') diff --git a/migrations/README b/migrations/README index 98e4f9c..e0d0858 100644 --- a/migrations/README +++ b/migrations/README @@ -1 +1 @@ -Generic single-database configuration. \ No newline at end of file +Generic single-database configuration with an async dbapi. \ No newline at end of file diff --git a/migrations/env.py b/migrations/env.py index bfa8186..7523a7e 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -1,11 +1,12 @@ +import asyncio from logging.config import fileConfig -from sqlalchemy import engine_from_config from sqlalchemy import pool +from sqlalchemy.engine import Connection +from sqlalchemy.ext.asyncio import async_engine_from_config from alembic import context - from back import auxiliary_for_alembic, db # this is the Alembic Config object, which provides @@ -17,6 +18,10 @@ config = context.config if config.config_file_name is not None: fileConfig(config.config_file_name) +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata target_metadata = auxiliary_for_alembic.Base.metadata # other values from the config, defined by the needs of env.py, @@ -25,7 +30,7 @@ target_metadata = auxiliary_for_alembic.Base.metadata # ... etc. -def run_migrations_offline(): +def run_migrations_offline() -> None: """Run migrations in 'offline' mode. This configures the context with just a URL @@ -37,44 +42,49 @@ def run_migrations_offline(): script output. """ - # url = config.get_main_option("sqlalchemy.url") url = config.get_main_option(db.SQLALCHEMY_DATABASE_URL) context.configure( url=url, target_metadata=target_metadata, literal_binds=True, dialect_opts={"paramstyle": "named"}, - render_as_batch=True ) with context.begin_transaction(): context.run_migrations() -def run_migrations_online(): - """Run migrations in 'online' mode. +def do_run_migrations(connection: Connection) -> None: + context.configure(connection=connection, target_metadata=target_metadata) - In this scenario we need to create an Engine + with context.begin_transaction(): + context.run_migrations() + + +async def run_async_migrations() -> None: + """In this scenario we need to create an Engine and associate a connection with the context. """ + configuration = config.get_section(config.config_ini_section) configuration['sqlalchemy.url'] = db.SQLALCHEMY_DATABASE_URL - connectable = engine_from_config( + connectable = async_engine_from_config( configuration, prefix="sqlalchemy.", poolclass=pool.NullPool, ) - with connectable.connect() as connection: - context.configure( - connection=connection, - target_metadata=target_metadata, - render_as_batch=True - ) + async with connectable.connect() as connection: + await connection.run_sync(do_run_migrations) - with context.begin_transaction(): - context.run_migrations() + await connectable.dispose() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode.""" + + asyncio.run(run_async_migrations()) if context.is_offline_mode(): diff --git a/migrations/script.py.mako b/migrations/script.py.mako index 2c01563..fbc4b07 100644 --- a/migrations/script.py.mako +++ b/migrations/script.py.mako @@ -5,20 +5,22 @@ Revises: ${down_revision | comma,n} Create Date: ${create_date} """ +from typing import Sequence, Union + from alembic import op import sqlalchemy as sa ${imports if imports else ""} # revision identifiers, used by Alembic. -revision = ${repr(up_revision)} -down_revision = ${repr(down_revision)} -branch_labels = ${repr(branch_labels)} -depends_on = ${repr(depends_on)} +revision: str = ${repr(up_revision)} +down_revision: Union[str, None] = ${repr(down_revision)} +branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} +depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} -def upgrade(): +def upgrade() -> None: ${upgrades if upgrades else "pass"} -def downgrade(): +def downgrade() -> None: ${downgrades if downgrades else "pass"} diff --git a/migrations/versions/8e631a2fe6b8_lazy_selectin_added_to_user_table_.py b/migrations/versions/8e631a2fe6b8_lazy_selectin_added_to_user_table_.py new file mode 100644 index 0000000..736e5a3 --- /dev/null +++ b/migrations/versions/8e631a2fe6b8_lazy_selectin_added_to_user_table_.py @@ -0,0 +1,30 @@ +"""lazy=selectin added to user table relationships + +Revision ID: 8e631a2fe6b8 +Revises: +Create Date: 2023-09-02 23:45:08.799366 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '8e631a2fe6b8' +down_revision: Union[str, None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/text121.txt b/poems.txt similarity index 100% rename from text121.txt rename to poems.txt diff --git a/privacy_policy.pdf b/privacy_policy.pdf new file mode 100644 index 0000000..b4aa2a4 Binary files /dev/null and b/privacy_policy.pdf differ diff --git a/requirements.txt b/requirements.txt index 2a1c749..2ac0161 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,7 @@ +aiosqlite==0.19.0 annotated-types==0.5.0 anyio==3.7.1 +asyncpg==0.28.0 certifi==2023.7.22 charset-normalizer==3.2.0 click==8.1.6 @@ -15,6 +17,7 @@ pyasn1==0.5.0 pydantic==1.10.10 pydantic_core==2.4.0 python-dateutil==2.8.2 +python-dotenv==1.0.0 python-jose==3.3.0 python-multipart==0.0.6 redbird==0.7.1