arpakitlib 1.8.227__py3-none-any.whl → 1.8.229__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "arpakitlib_project_template_version": "5",
3
- "arpakitlib_project_template_subversion": "56"
3
+ "arpakitlib_project_template_subversion": "58"
4
4
  }
@@ -7,6 +7,9 @@ class APIErrorCodes(Enumeration):
7
7
  error_in_request = "ERROR_IN_REQUEST"
8
8
  not_found = "NOT_FOUND"
9
9
 
10
+ class Common(Enumeration):
11
+ content_length_is_too_big = "content_length_is_too_big".upper()
12
+
10
13
 
11
14
  class APIErrorSpecificationCodes(Enumeration):
12
15
  pass
@@ -12,7 +12,7 @@ from sqlalchemy.orm import joinedload
12
12
 
13
13
  from arpakitlib.ar_func_util import is_async_func, is_sync_func
14
14
  from arpakitlib.ar_json_util import transfer_data_to_json_str_to_data
15
- from project.api.const import APIErrorCodes
15
+ from project.api.api_error_codes import APIErrorCodes
16
16
  from project.api.exception import APIException
17
17
  from project.core.settings import get_cached_settings
18
18
  from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
@@ -8,6 +8,7 @@ from fastapi.staticfiles import StaticFiles
8
8
 
9
9
  from project.api.event import get_startup_api_events, get_shutdown_api_events
10
10
  from project.api.exception_handler import add_exception_handler_to_api_app
11
+ from project.api.middleware.add_api_middlewares import add_api_middlewares
11
12
  from project.api.openapi_ui import add_local_openapi_ui_to_api_app
12
13
  from project.api.router.main_router import main_api_router
13
14
  from project.core.const import ProjectPaths
@@ -38,13 +39,7 @@ def create_api_app(*, prefix: str = "/api") -> FastAPI:
38
39
  },
39
40
  )
40
41
 
41
- api_app.add_middleware(
42
- CORSMiddleware,
43
- allow_origins=["*"],
44
- allow_credentials=True,
45
- allow_methods=["*"],
46
- allow_headers=["*"],
47
- )
42
+ add_api_middlewares(app=api_app)
48
43
 
49
44
  add_local_openapi_ui_to_api_app(
50
45
  app=api_app,
@@ -2,7 +2,7 @@ from typing import Any
2
2
 
3
3
  import fastapi.security
4
4
 
5
- from project.api.const import APIErrorCodes
5
+ from project.api.api_error_codes import APIErrorCodes
6
6
  from project.api.schema.out.common.error import ErrorCommonSO
7
7
 
8
8
 
@@ -11,7 +11,7 @@ from arpakitlib.ar_datetime_util import now_utc_dt
11
11
  from arpakitlib.ar_dict_util import combine_dicts
12
12
  from arpakitlib.ar_exception_util import exception_to_traceback_str
13
13
  from arpakitlib.ar_func_util import raise_if_not_async_func, is_async_func, is_sync_func
14
- from project.api.const import APIErrorCodes
14
+ from project.api.api_error_codes import APIErrorCodes
15
15
  from project.api.exception import APIException
16
16
  from project.api.response import APIJSONResponse
17
17
  from project.api.schema.out.common.error import ErrorCommonSO
@@ -175,7 +175,7 @@ def logging_func_before_in_api_exception_handler(
175
175
  return
176
176
 
177
177
  if isinstance(exception, APIException):
178
- if exception.kwargs_.get("logging") is False:
178
+ if exception.kwargs_.get("logging_full_error") is False:
179
179
  return
180
180
 
181
181
  _logger.exception(exception)
@@ -0,0 +1,15 @@
1
+ from fastapi import FastAPI
2
+ from starlette.middleware.cors import CORSMiddleware
3
+
4
+ from project.api.middleware.limit_content_length import LimitContentLengthMiddleware
5
+
6
+
7
+ def add_api_middlewares(*, app: FastAPI):
8
+ app.add_middleware(
9
+ CORSMiddleware,
10
+ allow_origins=["*"],
11
+ allow_credentials=True,
12
+ allow_methods=["*"],
13
+ allow_headers=["*"],
14
+ )
15
+ app.add_middleware(LimitContentLengthMiddleware, max_body_size=5 * 1024 * 1024)
@@ -0,0 +1,53 @@
1
+ import uvicorn
2
+ from fastapi import FastAPI, Request
3
+ from starlette import status
4
+ from starlette.middleware.base import BaseHTTPMiddleware
5
+ from starlette.responses import JSONResponse
6
+
7
+ from project.api.api_error_codes import APIErrorCodes
8
+ from project.api.schema.out.common.error import ErrorCommonSO
9
+
10
+
11
+ class LimitContentLengthMiddleware(BaseHTTPMiddleware):
12
+ def __init__(
13
+ self,
14
+ *
15
+ app,
16
+ max_body_size: int = 10 * 1024 * 1024 # 10 mb
17
+ ):
18
+ super().__init__(app)
19
+ self.max_body_size = max_body_size
20
+
21
+ async def dispatch(self, request: Request, call_next):
22
+ content_length = request.headers.get("content-length")
23
+ if content_length is None:
24
+ return await call_next(request)
25
+ if isinstance(content_length, str) and not content_length.isdigit():
26
+ return await call_next(request)
27
+ content_length = int(content_length)
28
+ if content_length > self.max_body_size:
29
+ return JSONResponse(
30
+ status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE,
31
+ content=ErrorCommonSO(
32
+ has_error=True,
33
+ error_code=APIErrorCodes.Common.content_length_is_too_big
34
+ ).model_dump_json()
35
+ )
36
+
37
+ return await call_next(request)
38
+
39
+
40
+ def __example():
41
+ app = FastAPI()
42
+ app.add_middleware(LimitContentLengthMiddleware) # 5 MB
43
+
44
+ @app.post("/upload")
45
+ async def upload_file(request: Request):
46
+ data = await request.body()
47
+ return {"size": len(data)}
48
+
49
+ uvicorn.run(app)
50
+
51
+
52
+ if __name__ == '__main__':
53
+ __example()
@@ -35,6 +35,6 @@ async def _(
35
35
  error_specification_code="3",
36
36
  error_description="Simple, logging=False",
37
37
  kwargs_={
38
- "logging": False
38
+ "logging_full_error": False
39
39
  }
40
40
  )
@@ -2,7 +2,7 @@ import fastapi.requests
2
2
  from fastapi import APIRouter
3
3
 
4
4
  from project.api.authorize import APIAuthorizeData, api_authorize, require_api_key_dbm_api_authorize_middleware
5
- from project.api.const import APIErrorCodes, APIErrorSpecificationCodes
5
+ from project.api.api_error_codes import APIErrorCodes, APIErrorSpecificationCodes
6
6
  from project.api.schema.common import BaseSO
7
7
  from project.api.schema.out.common.error import ErrorCommonSO
8
8
 
@@ -0,0 +1,43 @@
1
+ # main
2
+ server {
3
+ listen 80;
4
+ listen [::]:80;
5
+ server_name api.site.com www.site.com;
6
+
7
+ client_max_body_size 10M;
8
+
9
+ location / {
10
+ proxy_pass http://127.0.0.1:8080;
11
+
12
+ # базовые прокси-заголовки
13
+ proxy_set_header Host $host;
14
+ proxy_set_header X-Real-IP $remote_addr;
15
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
16
+ proxy_set_header X-Forwarded-Proto $scheme;
17
+ proxy_set_header X-Forwarded-Host $host;
18
+ proxy_set_header X-Forwarded-Port $server_port;
19
+
20
+ # буферизация запроса на стороне nginx (полезно для больших аплоадов)
21
+ proxy_request_buffering off;
22
+
23
+ # таймауты по вкусу (чтобы не висеть вечно)
24
+ proxy_connect_timeout 3s;
25
+ proxy_read_timeout 30s;
26
+ proxy_send_timeout 30s;
27
+
28
+ # (необязательно) меньше магии с Location/Redirect от апстрима
29
+ proxy_redirect off;
30
+ # proxy_redirect http://127.0.0.1:8080/ /;
31
+ # proxy_redirect http://backend.local/ https://site.com/;
32
+
33
+ }
34
+ }
35
+
36
+
37
+ # redirect
38
+ server {
39
+ listen 80;
40
+ listen [::]:80;
41
+ server_name www.site.arpakit.com;
42
+ return 301 http://site.com$request_uri;
43
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.8.227
3
+ Version: 1.8.229
4
4
  Summary: arpakitlib
5
5
  License: Apache-2.0
6
6
  Keywords: arpakitlib,arpakit,arpakit-company,arpakitcompany,arpakit_company
@@ -8,7 +8,7 @@ arpakitlib/_arpakit_project_template_v_5/alembic/env.py,sha256=Qesmnj5A2kB-Doeuf
8
8
  arpakitlib/_arpakit_project_template_v_5/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
9
9
  arpakitlib/_arpakit_project_template_v_5/alembic/versions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  arpakitlib/_arpakit_project_template_v_5/alembic.ini,sha256=8fuyeEvGBiPGbxEFy8ISBV3xX_fgVmuhEGpB10_B5Uo,3733
11
- arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json,sha256=C_MYSLufFOeakgn7AdJRDZ1Ju13vyaGZWfiG3z3c-4Y,98
11
+ arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json,sha256=tYsY8U4lzAXkijKJu4wwZUROFtOIeG4P3ToozX06MKc,98
12
12
  arpakitlib/_arpakit_project_template_v_5/command/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  arpakitlib/_arpakit_project_template_v_5/command/alembic_history.sh,sha256=OMnDNtHIksGh9iavWnzbtxcudZW4vjdcISsBXvzZSPw,22
14
14
  arpakitlib/_arpakit_project_template_v_5/command/alembic_revision_autogenerate.sh,sha256=yW2i-SBOtBx15Ya0poVQqKkJM5t2JZp06r9AEW-DmGE,46
@@ -81,19 +81,22 @@ arpakitlib/_arpakit_project_template_v_5/project/__init__.py,sha256=47DEQpj8HBSa
81
81
  arpakitlib/_arpakit_project_template_v_5/project/additional_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
82
  arpakitlib/_arpakit_project_template_v_5/project/additional_model/common.py,sha256=BRz-B699ZY52DfUD6kmhpuThBWpPzpZpD0QXIjlkwC8,168
83
83
  arpakitlib/_arpakit_project_template_v_5/project/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
+ arpakitlib/_arpakit_project_template_v_5/project/api/api_error_codes.py,sha256=c8feYRXrN0BWmTsQIk5q_SOHUt5kCveVV_4yz-ZsZwE,537
84
85
  arpakitlib/_arpakit_project_template_v_5/project/api/asgi.py,sha256=ES3YGwNxWUHVyD6e2ii6QkvTyB-vlVmr8_PhfVIXQ4Y,78
85
- arpakitlib/_arpakit_project_template_v_5/project/api/authorize.py,sha256=puOmx2OSV2ExcLqtAD1zmvfY0zbLqLxkytF5xLZTnQg,15424
86
+ arpakitlib/_arpakit_project_template_v_5/project/api/authorize.py,sha256=52aMumh_e30Z92w7vYxUwH0cuIDeAuWFVWTnVfQyqqI,15434
86
87
  arpakitlib/_arpakit_project_template_v_5/project/api/before_start_api.py,sha256=a7eiV8oaWk9qYzlNNnY8BYY8VlnQAZ0w8TwuC2u6v_c,1902
87
88
  arpakitlib/_arpakit_project_template_v_5/project/api/blank/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
89
  arpakitlib/_arpakit_project_template_v_5/project/api/blank/admin.py,sha256=ii1zLHjvB7OVLQKFOhp4lpodXcwAmtwDdrM1iaafQfg,100
89
90
  arpakitlib/_arpakit_project_template_v_5/project/api/blank/client.py,sha256=rvJKtAB26Qy2pKVSHSMUM_70oI4v8Yr6Vmpr6r4EzNk,101
90
91
  arpakitlib/_arpakit_project_template_v_5/project/api/blank/common.py,sha256=ug1FylE_CVC5eij-u4nh-IHNO-gwkbBGo5KgyWDujC8,91
91
- arpakitlib/_arpakit_project_template_v_5/project/api/const.py,sha256=J9bqaRRiIc3RLn6SJTvdfDvFrSsM_Ixii9t2M8dA5Jc,433
92
- arpakitlib/_arpakit_project_template_v_5/project/api/create_api_app.py,sha256=rmD0F-9SpbGsDGi5PzVVFF6paoYLyKasPh6qw2RxTNY,3071
92
+ arpakitlib/_arpakit_project_template_v_5/project/api/create_api_app.py,sha256=rY9rI-_mbx8mu1-Q-MRVbw5Cmrv5qtHCJznFs1gBiNQ,3006
93
93
  arpakitlib/_arpakit_project_template_v_5/project/api/create_first_data.py,sha256=BgqmD-7gXQ_zoz3ATqVacQzkg9lbvKnCSvQxm0M0Vxw,1824
94
94
  arpakitlib/_arpakit_project_template_v_5/project/api/event.py,sha256=P8gV2Bq6LeLH0JDN9Z3O401PMbyNr2n-tme2gPvT-m4,996
95
- arpakitlib/_arpakit_project_template_v_5/project/api/exception.py,sha256=OkvjuJZx-rZfHisKwgeaI-cxzNNPeKgkRi9a_x7Jdbw,1415
96
- arpakitlib/_arpakit_project_template_v_5/project/api/exception_handler.py,sha256=AqT5l_GyTMWZsW-eI4ZD5FU4zMR0HKhsxsMX3p2KukY,11535
95
+ arpakitlib/_arpakit_project_template_v_5/project/api/exception.py,sha256=BSCYbdHYBldXmbdRxW14tIA47vttRXVlBGw7wMur8us,1425
96
+ arpakitlib/_arpakit_project_template_v_5/project/api/exception_handler.py,sha256=Se4Bj1Sdp6KXW7-G5xm0obJAFu3MfPA5NTm6yEEjgqU,11556
97
+ arpakitlib/_arpakit_project_template_v_5/project/api/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
+ arpakitlib/_arpakit_project_template_v_5/project/api/middleware/add_api_middlewares.py,sha256=TrWn0yPDCn0yTlHqLf19ypGtRumNjDxm0sM60yVsqXE,468
99
+ arpakitlib/_arpakit_project_template_v_5/project/api/middleware/limit_content_length.py,sha256=fRdmb9pQa5B_AT-oNfjsBRextcBQA9qwvLcF5MWG5JY,1636
97
100
  arpakitlib/_arpakit_project_template_v_5/project/api/openapi_ui.py,sha256=7yg9ZNu6BjTAregnfbRFpwvqa-gTIY6o6NCz5pmsbeo,976
98
101
  arpakitlib/_arpakit_project_template_v_5/project/api/response.py,sha256=xZMymP2BuQaRNVWLeIp3UgUUo-MFN8MJnsn9Al4vOb8,1028
99
102
  arpakitlib/_arpakit_project_template_v_5/project/api/router/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -120,7 +123,7 @@ arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/make_test_data
120
123
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/make_test_data_5.py,sha256=5hEvMeTj7Bu_JT1alRHBFjyOfdEaZeMwk_Smrpqd-So,1178
121
124
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_api_exception_1.py,sha256=Z2f7wv4R_jZPy8KccOtsmVsOjrLsFSBZYGRAsTRVbhE,1300
122
125
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_api_exception_2.py,sha256=YI5PTA7miwYtl8-GiYSPW3NfpXtx5MwzWI_kKZXWS3c,1302
123
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_api_exception_3.py,sha256=y8rrEPfS2P-273HSsWorHkxft-KOt7vly35tDukqsPU,1284
126
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_api_exception_3.py,sha256=VEiX_uXJ5GUwlmnztKxyNI9MGjtz8FtN3P-m4kCxXLo,1295
124
127
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_fake_error.py,sha256=kMr06QR39XVUoVwUuwJHoQmaWHvlfi2j53ZCMX3CU48,1048
125
128
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/reinit_sqlalchemy_db.py,sha256=kTa_RSZgPKbDfdFHzhAJroddWOUDRK4YTJN2WVnKu-Q,1343
126
129
  arpakitlib/_arpakit_project_template_v_5/project/api/router/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -130,7 +133,7 @@ arpakitlib/_arpakit_project_template_v_5/project/api/router/client/main_router.p
130
133
  arpakitlib/_arpakit_project_template_v_5/project/api/router/general/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
134
  arpakitlib/_arpakit_project_template_v_5/project/api/router/general/check_authorization.py,sha256=NUQK4KI0XpwzPEGjgQMxU43ZaTm-dEXrmU1BMIFcA3k,1853
132
135
  arpakitlib/_arpakit_project_template_v_5/project/api/router/general/get_current_api_key.py,sha256=fkQ2SYnjBiJkNu__DfDV4tpu83sZBRVZK6aiUbABJOY,1195
133
- arpakitlib/_arpakit_project_template_v_5/project/api/router/general/get_errors_info.py,sha256=OS4R5UVVjvnI8S6lDBMEZ9jXbpbttPKe4n2q-jzTs9Y,1157
136
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/general/get_errors_info.py,sha256=xc5GfBt6lEzsbjvj1S_sdSTnn_nzrSR63cnpgGFAdxg,1167
134
137
  arpakitlib/_arpakit_project_template_v_5/project/api/router/general/healthcheck.py,sha256=n-ANP4x4AD6903Lt25r2mZx3tQ1DdxKn2SRPwk-POv0,695
135
138
  arpakitlib/_arpakit_project_template_v_5/project/api/router/general/main_router.py,sha256=zYei_6fiEVRkP3fuhCmu_c1rNzTUULAlh18PckTKfR4,774
136
139
  arpakitlib/_arpakit_project_template_v_5/project/api/router/general/now_utc_datetime.py,sha256=SG-x57FCs9_nWPJAnNhem6HIx5vQ-DLj4IXwuI0GEiY,909
@@ -192,6 +195,7 @@ arpakitlib/_arpakit_project_template_v_5/project/emailer/send_simple_email.py,sh
192
195
  arpakitlib/_arpakit_project_template_v_5/project/json_db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
196
  arpakitlib/_arpakit_project_template_v_5/project/json_db/json_db.py,sha256=tBML-z4Y7uY8f_0ggcxvlDNt15Sf93Jr_OUeHwWxqOA,724
194
197
  arpakitlib/_arpakit_project_template_v_5/project/more/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
198
+ arpakitlib/_arpakit_project_template_v_5/project/more/api.nginx,sha256=o74LGt4ydV7TBvm-6CKSBOlwy4rzb2apz2AZtHE-6aY,1308
195
199
  arpakitlib/_arpakit_project_template_v_5/project/more/helloworld,sha256=eH7Hbcr9IMGQjrCTahL5Ht0QWrXNfswrGuIDJkg0Xf8,11
196
200
  arpakitlib/_arpakit_project_template_v_5/project/operation_execution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
197
201
  arpakitlib/_arpakit_project_template_v_5/project/operation_execution/const.py,sha256=dcvj5C9E2F2KCsGZPBBncQf_EvVJAC1qQgnyD8P4ZEw,6
@@ -418,8 +422,8 @@ arpakitlib/ar_yookassa_api_client_util.py,sha256=VozuZeCJjmLd1zj2BdC9WfiAQ3XYOrI
418
422
  arpakitlib/clone_pydantic_model_fields.py,sha256=xxLwtvJzDf8EWMvBE4psWIj8c-cyeCxLRX76oCY_4zk,1214
419
423
  arpakitlib/pydantic_schema_from_sqlalchemy_model.py,sha256=_5Y79kQ4lLIOL6_afIFVwxY1EXzTMpi-veRR-WkPFOs,2879
420
424
  arpakitlib/raise_own_exception_if_exception.py,sha256=XfLYQzfStHJMlaqCOvRuXZBRzcUn2Cj2a-vKJ_hspf8,4686
421
- arpakitlib-1.8.227.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
422
- arpakitlib-1.8.227.dist-info/METADATA,sha256=FghQl3kN8IgyPeZmk49PuhjyYDJtDH509y9NBuuD8Ds,3741
423
- arpakitlib-1.8.227.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
424
- arpakitlib-1.8.227.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
425
- arpakitlib-1.8.227.dist-info/RECORD,,
425
+ arpakitlib-1.8.229.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
426
+ arpakitlib-1.8.229.dist-info/METADATA,sha256=e1tXQkzgFDQmDRyxHHNpygZ5hdvXoALvsTA5yQVq9AE,3741
427
+ arpakitlib-1.8.229.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
428
+ arpakitlib-1.8.229.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
429
+ arpakitlib-1.8.229.dist-info/RECORD,,