From b024ea50b23ae5fcdf9edae31a3ec89c3cf92856 Mon Sep 17 00:00:00 2001 From: jze9 Date: Sun, 25 May 2025 23:38:58 +0500 Subject: [PATCH] diplom --- app/main.py | 3 +- app/pages/add_user_data.py | 51 ++++++++++++ app/pages/login.py | 15 ++-- app/pages/my_data.py | 95 ++++++++++++++++------ pyproject.toml | 1 + server/api-data-base/data_base/requests.py | 10 +++ server/api-data-base/requirements.txt | 2 +- server/api-data-base/router.py | 2 +- uv.lock | 65 +++++++++++++++ 9 files changed, 209 insertions(+), 35 deletions(-) diff --git a/app/main.py b/app/main.py index 7954d7f..ee0b4a6 100644 --- a/app/main.py +++ b/app/main.py @@ -4,11 +4,12 @@ import designer as ds def main(page: ft.Page): page.title = "COPP" - def PageLoading(route): + def PageLoading(route={}): print(page.route) page.views.clear() page.views.append(ViewsHendler(page=page)[page.route]) page.update() + page.on_route_change = PageLoading page.go("/") diff --git a/app/pages/add_user_data.py b/app/pages/add_user_data.py index 925062e..e31ca24 100644 --- a/app/pages/add_user_data.py +++ b/app/pages/add_user_data.py @@ -1,8 +1,53 @@ import flet as ft import designer as des +import requests class Add_user_data(ft.View): + + def load_table_column(self): + url = "http://localhost:8001/api-data-base/get_name_column?table_name=%D0%A1ollection_form_opk" + temp_column = [] + try: + response = requests.post(url) + if response.status_code == 200: + temp = response.json() + for column in temp: + temp_column.append(ft.DataColumn(ft.Text(column))) + return temp_column + else: + print(f"Error: Received status code {response.status_code}") + return temp_column + except requests.exceptions.RequestException as e: + print(f"Error: {e}") + return temp_column + + def load_return_rows(self): + from user_data import User_data as ud + url = f"http://localhost:8001/api-data-base/select_rows_with_filter?value={ud.inn}" + temp_row = [] + try: + response = requests.post(url) + if response.status_code == 200: + temp = response.json() + for rows in temp: + for row in rows: + temp_row.append(ft.DataRow( + cells=[ft.DataCell(ft.Text(row[row]))] + )) + return temp_row + else: + print(f"Error: Received status code {response.status_code}") + return temp_row + except requests.exceptions.RequestException as e: + print(f"Error: {e}") + return temp_row + def __init__(self,page:ft.Page,route:str=""): + self.data_grid = ft.DataTable( + columns=self.load_table_column(), + rows=self.load_return_rows() + ) + super().__init__( bgcolor=des.color[2], route=route, @@ -15,6 +60,12 @@ class Add_user_data(ft.View): des.Button(text="мои данные",on_click = self.go_to_my_data), des.Button(text="заполнить данные", on_click=self.go_to_data), ] + ), + ft.Row( + expand=True, + controls=[ + self.data_grid + ] ) ] ) diff --git a/app/pages/login.py b/app/pages/login.py index 41f0894..e6464ca 100644 --- a/app/pages/login.py +++ b/app/pages/login.py @@ -65,7 +65,7 @@ class Login(ft.Column): print("Ошибка: Пустой ответ от сервера") def enter_go_to_next_page(self, e): - url = "http://localhost:8000/api/api/login" + url = "http://localhost:8001/api-data-base/login" # исправленный путь data = { "login": self.login[0].value, "password": self.password.value @@ -77,15 +77,12 @@ class Login(ft.Column): response_data = response.json() # Используем метод .json() для извлечения данных # Проверяем сообщение в ответе - if response_data.get("message") == "Авторизация успешна.": - user = response_data.get("user") # Достаем пользователя из ответа - if user.get("id") == 0: - self.page.open(Loger(text="Неверные данные")) - else: - self.Load_user_inf(response=user) - self.page.go("/user_info") - elif response_data.get("message") == "Неверные данные": + if response_data.get("id") != 0: + self.Load_user_inf(response=response_data) + self.page.go("/user_info") + else: self.page.open(Loger(text="Неверные данные")) + else: print("Ошибка:", response.status_code, response.text) except requests.exceptions.RequestException as e: diff --git a/app/pages/my_data.py b/app/pages/my_data.py index 710a26b..2cf8981 100644 --- a/app/pages/my_data.py +++ b/app/pages/my_data.py @@ -1,38 +1,87 @@ import flet as ft -import designer as des +import designer as des +import requests class My_data(ft.View): - def __init__(self,page:ft.Page,route:str="/my_data"): + + def load_table_column(self): + url = "http://localhost:8001/api-data-base/get_name_column?table_name=%D0%A1ollection_form_opk" + temp_column = [] + try: + response = requests.post(url) + if response.status_code == 200: + temp = response.json() + # Пропускаем первый столбец (id) + for column in temp[1:]: + temp_column.append(ft.DataColumn(ft.Text(column))) + return temp_column + else: + print(f"Error: Received status code {response.status_code}") + return temp_column + except requests.exceptions.RequestException as e: + print(f"Error: {e}") + return temp_column + + def load_return_rows(self): + from user_data import User_data as ud + + url = f"http://localhost:8001/api-data-base/select_rows_with_filter?value={str(ud.inn)}" + temp_row = [] + try: + response = requests.post(url) + if response.status_code == 200: + temp = response.json() + for row in temp: + # Пропускаем первый столбец (id) + values = list(row.values())[1:] + temp_row.append( + ft.DataRow( + cells=[ft.DataCell(ft.Text(str(value))) for value in values] + ) + ) + return temp_row + else: + print(f"Error: Received status code {response.status_code}") + return temp_row + except requests.exceptions.RequestException as e: + print(f"Error: {e}") + return temp_row + + def __init__(self,page:ft.Page,route:str=""): + self.data_grid = ft.DataTable( + columns=self.load_table_column(), + rows=self.load_return_rows() + ) + super().__init__( bgcolor=des.color[2], route=route, controls=[ ft.Column( - controls=[ - ft.Container( - padding=ft.padding.all(20), - border_radius=ft.border_radius.all(10), - height=70, - expand=True, - bgcolor=des.color[3], - content=ft.Row( - expand=True, - controls=[ - des.Button(text="профиль"), - des.Button(text="мои данные",on_click = self.go_to_my_data), - des.Button(text="заполнить данные", on_click=self.go_to_data), - ] - ) + ft.Row( + controls=[ + des.Button(text="профиль"), + des.Button(text="мои данные",on_click = self.go_to_my_data), + des.Button(text="заполнить данные", on_click=self.go_to_data), + ] ), - + ft.Row( + expand=True, + scroll=True, + controls=[ + self.data_grid + ] + ) ] ) ] ) - - def go_to_my_data(self): - pass - def go_to_data(self): - pass \ No newline at end of file + + def go_to_info(self,e): + self.page.go("/user_info") + def go_to_my_data(self,e): + self.page.go("/my_data") + def go_to_data(self,e): + self.page.go("/add_new_data") \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 6b0d2b0..6e65188 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,4 +10,5 @@ dependencies = [ "flet[all]>=0.28.2", "kafka>=1.3.5", "redis>=6.0.0", + "sqlalchemy>=2.0.41", ] diff --git a/server/api-data-base/data_base/requests.py b/server/api-data-base/data_base/requests.py index b2475c7..9daee9b 100644 --- a/server/api-data-base/data_base/requests.py +++ b/server/api-data-base/data_base/requests.py @@ -4,6 +4,7 @@ import json import model_messege as mm from sqlalchemy.future import select from sqlalchemy import MetaData, inspect, text, insert, Table +import bcrypt class JsonJober: data = [] @@ -51,6 +52,15 @@ class Request(): await cls.craete_all_table() mass_table = JsonJober.ReadJson(path_file="./data_base/preset/test.json") await cls.insert_mass_table(mass_table=mass_table) + + user_data = { + "inn": "123", + "password": bcrypt.hashpw("123".encode("utf-8"), bcrypt.gensalt()).decode('utf-8'), + "mail": "123", + "name_poo": "123" + } + await cls.insert_table(data={"data": [user_data]}, table_name="users") + @classmethod async def insert_mass_table(cls, mass_table): diff --git a/server/api-data-base/requirements.txt b/server/api-data-base/requirements.txt index 1c5144f..62aa528 100644 --- a/server/api-data-base/requirements.txt +++ b/server/api-data-base/requirements.txt @@ -5,4 +5,4 @@ sqlalchemy asyncpg psycopg2-binary bcrypt -orjson \ No newline at end of file +orjson diff --git a/server/api-data-base/router.py b/server/api-data-base/router.py index c5309c3..5bf4743 100644 --- a/server/api-data-base/router.py +++ b/server/api-data-base/router.py @@ -69,7 +69,7 @@ async def insert_table(data:dict): """Добавление записи""" return await Request.insert_table(data=data) -@router.post("select_rows_with_filter") +@router.post("/select_rows_with_filter") async def select_rows_with_filter(value:str): """Выборка с фильтром""" return await Request.select_rows_with_filter(value=value) \ No newline at end of file diff --git a/uv.lock b/uv.lock index e7a26d3..ae7ae3f 100644 --- a/uv.lock +++ b/uv.lock @@ -221,6 +221,7 @@ dependencies = [ { name = "flet", extra = ["all"] }, { name = "kafka" }, { name = "redis" }, + { name = "sqlalchemy" }, ] [package.metadata] @@ -230,6 +231,7 @@ requires-dist = [ { name = "flet", extras = ["all"], specifier = ">=0.28.2" }, { name = "kafka", specifier = ">=1.3.5" }, { name = "redis", specifier = ">=6.0.0" }, + { name = "sqlalchemy", specifier = ">=2.0.41" }, ] [[package]] @@ -325,6 +327,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/77/a36708b770394b680d3b2902e420df362ea9c70652c8bf71e1ac24ce8364/flet_web-0.28.2-py3-none-any.whl", hash = "sha256:f1bfa4ee0992fd66472233ef8ac8e2dd8f80b8eaba5a4d29f0610407ebddfb71", size = 3137521, upload-time = "2025-05-10T21:49:25.393Z" }, ] +[[package]] +name = "greenlet" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/c1/a82edae11d46c0d83481aacaa1e578fea21d94a1ef400afd734d47ad95ad/greenlet-3.2.2.tar.gz", hash = "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485", size = 185797, upload-time = "2025-05-09T19:47:35.066Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/a1/88fdc6ce0df6ad361a30ed78d24c86ea32acb2b563f33e39e927b1da9ea0/greenlet-3.2.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:df4d1509efd4977e6a844ac96d8be0b9e5aa5d5c77aa27ca9f4d3f92d3fcf330", size = 270413, upload-time = "2025-05-09T14:51:32.455Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/6c1caffd65490c68cd9bcec8cb7feb8ac7b27d38ba1fea121fdc1f2331dc/greenlet-3.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da956d534a6d1b9841f95ad0f18ace637668f680b1339ca4dcfb2c1837880a0b", size = 637242, upload-time = "2025-05-09T15:24:02.63Z" }, + { url = "https://files.pythonhosted.org/packages/98/28/088af2cedf8823b6b7ab029a5626302af4ca1037cf8b998bed3a8d3cb9e2/greenlet-3.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c7b15fb9b88d9ee07e076f5a683027bc3befd5bb5d25954bb633c385d8b737e", size = 651444, upload-time = "2025-05-09T15:24:49.856Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0116ab876bb0bc7a81eadc21c3f02cd6100dcd25a1cf2a085a130a63a26a/greenlet-3.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:752f0e79785e11180ebd2e726c8a88109ded3e2301d40abced2543aa5d164275", size = 646067, upload-time = "2025-05-09T15:29:24.989Z" }, + { url = "https://files.pythonhosted.org/packages/35/17/bb8f9c9580e28a94a9575da847c257953d5eb6e39ca888239183320c1c28/greenlet-3.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae572c996ae4b5e122331e12bbb971ea49c08cc7c232d1bd43150800a2d6c65", size = 648153, upload-time = "2025-05-09T14:53:34.716Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ee/7f31b6f7021b8df6f7203b53b9cc741b939a2591dcc6d899d8042fcf66f2/greenlet-3.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02f5972ff02c9cf615357c17ab713737cccfd0eaf69b951084a9fd43f39833d3", size = 603865, upload-time = "2025-05-09T14:53:45.738Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2d/759fa59323b521c6f223276a4fc3d3719475dc9ae4c44c2fe7fc750f8de0/greenlet-3.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4fefc7aa68b34b9224490dfda2e70ccf2131368493add64b4ef2d372955c207e", size = 1119575, upload-time = "2025-05-09T15:27:04.248Z" }, + { url = "https://files.pythonhosted.org/packages/30/05/356813470060bce0e81c3df63ab8cd1967c1ff6f5189760c1a4734d405ba/greenlet-3.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a31ead8411a027c2c4759113cf2bd473690517494f3d6e4bf67064589afcd3c5", size = 1147460, upload-time = "2025-05-09T14:54:00.315Z" }, + { url = "https://files.pythonhosted.org/packages/07/f4/b2a26a309a04fb844c7406a4501331b9400e1dd7dd64d3450472fd47d2e1/greenlet-3.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:b24c7844c0a0afc3ccbeb0b807adeefb7eff2b5599229ecedddcfeb0ef333bec", size = 296239, upload-time = "2025-05-09T14:57:17.633Z" }, + { url = "https://files.pythonhosted.org/packages/89/30/97b49779fff8601af20972a62cc4af0c497c1504dfbb3e93be218e093f21/greenlet-3.2.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59", size = 269150, upload-time = "2025-05-09T14:50:30.784Z" }, + { url = "https://files.pythonhosted.org/packages/21/30/877245def4220f684bc2e01df1c2e782c164e84b32e07373992f14a2d107/greenlet-3.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf", size = 637381, upload-time = "2025-05-09T15:24:12.893Z" }, + { url = "https://files.pythonhosted.org/packages/8e/16/adf937908e1f913856b5371c1d8bdaef5f58f251d714085abeea73ecc471/greenlet-3.2.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325", size = 651427, upload-time = "2025-05-09T15:24:51.074Z" }, + { url = "https://files.pythonhosted.org/packages/ad/49/6d79f58fa695b618654adac64e56aff2eeb13344dc28259af8f505662bb1/greenlet-3.2.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fadd183186db360b61cb34e81117a096bff91c072929cd1b529eb20dd46e6c5", size = 645795, upload-time = "2025-05-09T15:29:26.673Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e6/28ed5cb929c6b2f001e96b1d0698c622976cd8f1e41fe7ebc047fa7c6dd4/greenlet-3.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825", size = 648398, upload-time = "2025-05-09T14:53:36.61Z" }, + { url = "https://files.pythonhosted.org/packages/9d/70/b200194e25ae86bc57077f695b6cc47ee3118becf54130c5514456cf8dac/greenlet-3.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d", size = 606795, upload-time = "2025-05-09T14:53:47.039Z" }, + { url = "https://files.pythonhosted.org/packages/f8/c8/ba1def67513a941154ed8f9477ae6e5a03f645be6b507d3930f72ed508d3/greenlet-3.2.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf", size = 1117976, upload-time = "2025-05-09T15:27:06.542Z" }, + { url = "https://files.pythonhosted.org/packages/c3/30/d0e88c1cfcc1b3331d63c2b54a0a3a4a950ef202fb8b92e772ca714a9221/greenlet-3.2.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1e76106b6fc55fa3d6fe1c527f95ee65e324a13b62e243f77b48317346559708", size = 1145509, upload-time = "2025-05-09T14:54:02.223Z" }, + { url = "https://files.pythonhosted.org/packages/90/2e/59d6491834b6e289051b252cf4776d16da51c7c6ca6a87ff97e3a50aa0cd/greenlet-3.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421", size = 296023, upload-time = "2025-05-09T14:53:24.157Z" }, + { url = "https://files.pythonhosted.org/packages/65/66/8a73aace5a5335a1cba56d0da71b7bd93e450f17d372c5b7c5fa547557e9/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418", size = 629911, upload-time = "2025-05-09T15:24:22.376Z" }, + { url = "https://files.pythonhosted.org/packages/48/08/c8b8ebac4e0c95dcc68ec99198842e7db53eda4ab3fb0a4e785690883991/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4", size = 635251, upload-time = "2025-05-09T15:24:52.205Z" }, + { url = "https://files.pythonhosted.org/packages/37/26/7db30868f73e86b9125264d2959acabea132b444b88185ba5c462cb8e571/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2593283bf81ca37d27d110956b79e8723f9aa50c4bcdc29d3c0543d4743d2763", size = 632620, upload-time = "2025-05-09T15:29:28.051Z" }, + { url = "https://files.pythonhosted.org/packages/10/ec/718a3bd56249e729016b0b69bee4adea0dfccf6ca43d147ef3b21edbca16/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b", size = 628851, upload-time = "2025-05-09T14:53:38.472Z" }, + { url = "https://files.pythonhosted.org/packages/9b/9d/d1c79286a76bc62ccdc1387291464af16a4204ea717f24e77b0acd623b99/greenlet-3.2.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207", size = 593718, upload-time = "2025-05-09T14:53:48.313Z" }, + { url = "https://files.pythonhosted.org/packages/cd/41/96ba2bf948f67b245784cd294b84e3d17933597dffd3acdb367a210d1949/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8", size = 1105752, upload-time = "2025-05-09T15:27:08.217Z" }, + { url = "https://files.pythonhosted.org/packages/68/3b/3b97f9d33c1f2eb081759da62bd6162159db260f602f048bc2f36b4c453e/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:45f9f4853fb4cc46783085261c9ec4706628f3b57de3e68bae03e8f8b3c0de51", size = 1125170, upload-time = "2025-05-09T14:54:04.082Z" }, + { url = "https://files.pythonhosted.org/packages/31/df/b7d17d66c8d0f578d2885a3d8f565e9e4725eacc9d3fdc946d0031c055c4/greenlet-3.2.2-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:9ea5231428af34226c05f927e16fc7f6fa5e39e3ad3cd24ffa48ba53a47f4240", size = 269899, upload-time = "2025-05-09T14:54:01.581Z" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -706,6 +742,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] +[[package]] +name = "sqlalchemy" +version = "2.0.41" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424, upload-time = "2025-05-14T17:10:32.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/2a/f1f4e068b371154740dd10fb81afb5240d5af4aa0087b88d8b308b5429c2/sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9", size = 2119645, upload-time = "2025-05-14T17:55:24.854Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e8/c664a7e73d36fbfc4730f8cf2bf930444ea87270f2825efbe17bf808b998/sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1", size = 2107399, upload-time = "2025-05-14T17:55:28.097Z" }, + { url = "https://files.pythonhosted.org/packages/5c/78/8a9cf6c5e7135540cb682128d091d6afa1b9e48bd049b0d691bf54114f70/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70", size = 3293269, upload-time = "2025-05-14T17:50:38.227Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/f74add3978c20de6323fb11cb5162702670cc7a9420033befb43d8d5b7a4/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e", size = 3303364, upload-time = "2025-05-14T17:51:49.829Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d4/c990f37f52c3f7748ebe98883e2a0f7d038108c2c5a82468d1ff3eec50b7/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078", size = 3229072, upload-time = "2025-05-14T17:50:39.774Z" }, + { url = "https://files.pythonhosted.org/packages/15/69/cab11fecc7eb64bc561011be2bd03d065b762d87add52a4ca0aca2e12904/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae", size = 3268074, upload-time = "2025-05-14T17:51:51.736Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ca/0c19ec16858585d37767b167fc9602593f98998a68a798450558239fb04a/sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6", size = 2084514, upload-time = "2025-05-14T17:55:49.915Z" }, + { url = "https://files.pythonhosted.org/packages/7f/23/4c2833d78ff3010a4e17f984c734f52b531a8c9060a50429c9d4b0211be6/sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0", size = 2111557, upload-time = "2025-05-14T17:55:51.349Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ad/2e1c6d4f235a97eeef52d0200d8ddda16f6c4dd70ae5ad88c46963440480/sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", size = 2115491, upload-time = "2025-05-14T17:55:31.177Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8d/be490e5db8400dacc89056f78a52d44b04fbf75e8439569d5b879623a53b/sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", size = 2102827, upload-time = "2025-05-14T17:55:34.921Z" }, + { url = "https://files.pythonhosted.org/packages/a0/72/c97ad430f0b0e78efaf2791342e13ffeafcbb3c06242f01a3bb8fe44f65d/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", size = 3225224, upload-time = "2025-05-14T17:50:41.418Z" }, + { url = "https://files.pythonhosted.org/packages/5e/51/5ba9ea3246ea068630acf35a6ba0d181e99f1af1afd17e159eac7e8bc2b8/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", size = 3230045, upload-time = "2025-05-14T17:51:54.722Z" }, + { url = "https://files.pythonhosted.org/packages/78/2f/8c14443b2acea700c62f9b4a8bad9e49fc1b65cfb260edead71fd38e9f19/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", size = 3159357, upload-time = "2025-05-14T17:50:43.483Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b2/43eacbf6ccc5276d76cea18cb7c3d73e294d6fb21f9ff8b4eef9b42bbfd5/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", size = 3197511, upload-time = "2025-05-14T17:51:57.308Z" }, + { url = "https://files.pythonhosted.org/packages/fa/2e/677c17c5d6a004c3c45334ab1dbe7b7deb834430b282b8a0f75ae220c8eb/sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", size = 2082420, upload-time = "2025-05-14T17:55:52.69Z" }, + { url = "https://files.pythonhosted.org/packages/e9/61/e8c1b9b6307c57157d328dd8b8348ddc4c47ffdf1279365a13b2b98b8049/sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", size = 2108329, upload-time = "2025-05-14T17:55:54.495Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224, upload-time = "2025-05-14T17:39:42.154Z" }, +] + [[package]] name = "starlette" version = "0.46.2"