1:注册插件
SqlalchemyPluginClient(app=app, settings=SqlalchemyPluginClient.SqlalchemySettings(
))
2:使用依赖注入方式
@app.get("/async_session_depends")
async def sync_route(async_session: AsyncSession = Depends(get_async_session_depends)):
async with get_async_session_context() as async_session:
pass
logger.info(await SysCategoryService.get_sys_category_items_all(db_session=async_session))
print("ssssssssssssssss", await SysCategoryService.get_sys_category_items_all(db_session=async_session))
# eventsaaa.async_emit_evnet("app_mention", "我是发送的数据信息")
return 'ok'
3:使用上下文的方式(依然全局的request)
@app.get("/async_session_with")
async def sync_route():
async with get_async_session_context() as async_session:
pass
logger.info(await SysCategoryService.get_sys_category_items_all(db_session=async_session))
print("ssssssssssssssss",await SysCategoryService.get_sys_category_items_all(db_session=async_session))
# eventsaaa.async_emit_evnet("app_mention", "我是发送的数据信息")
return 'ok'
使用装饰器方式的话,需要处理比较多,需要依赖一个中间件以及上下文对象处理
在中间件或获取上下文对象
................................................
AsyncSession_var: ContextVar[AsyncSession] = ContextVar("AsyncSession")
async_session: AsyncSession = bind_contextvar(AsyncSession_var)
class AsyncSessionLoadMiddleware:
'''
此类的中间件无法读取响应报文的内容
'''
pass
def __init__(self, app: ASGIApp) -> None:
self.app = app
def bind_to_request_state(self, request: Request, **kwargs):
"""
Takes in a set of kwargs and binds them to gziprequest state
"""
for key, value in kwargs.items():
setattr(request.state, key, value)
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
if scope["type"] != "http":
await self.app(scope, receive, send)
return
# 解析当前的请求体
request = Request(scope, receive=receive)
# 开启中间件的时候创建对应的会话对象
token = AsyncSession_var.set(request.app.async_session_maker())
try:
await self.app(scope, receive, send)
finally:
# 释放
AsyncSession_var.reset(token)
................................................
然后在装饰器使用对应的
token = AsyncSession_var.set(request.app.async_session_maker())生成的对象,也就是下面中
async_session: AsyncSession = bind_contextvar(AsyncSession_var)中async_session对象
然后在对应的查询中引入上面的async_session对象,并启用装饰:
................................................
class SysCategoryService:
@staticmethod
@Transactional()
async def get_sys_category_items_all22222():
print("查询async_scoped_session装饰器!!!????",id(async_scoped_session))
query = select(SysCategory)
data = (await async_scoped_session.execute(query))
return [it.name for it in data.scalars().all()]
................................................
然后在对应路由逻辑中调用!
@app.get("/async_session_zhuangshiqi")
async def sync_route():
logger.info(await SysCategoryService.get_sys_category_items_all22222())
# print("ssssssssssssssss",await SysCategoryService.get_sys_category_items_all())
# eventsaaa.async_emit_evnet("app_mention", "我是发送的数据信息")
return 'ok'
# 全局变量定义的方式使用:
1:定义变量:
# 自定义全局的变量的方式来使用对应的对象
global_async_engine = None
global_async_session: Union[Callable, AsyncSession, AsyncGenerator, sessionmaker] = lambda: None
................................................
2:初始化全局变量:
@app.on_event("startup")
async def startup_event():
try:
# 创建异步会话对象
global global_async_engine
global global_async_session
self.async_engine = create_async_engine(url=self.settings.ASYNC_SQLALCHEMY_DATABASE_URI,
echo=self.settings.SQLALCHEMY_DATABASE_ECHO,
pool_recycle=self.settings.SQLALCHEMY_POOL_RECYCLE,
max_overflow=self.settings.SQLALCHEMY_MAX_OVERFLOW,
pool_pre_ping=self.settings.SQLALCHEMY_POOL_PRE_PING,
pool_size=self.settings.SQLALCHEMY_POOL_SIZE,
)
self.async_session_maker = sessionmaker(bind=self.async_engine,
class_=AsyncSession,
expire_on_commit=False)
app.async_session = self
app.async_session_maker = self.async_session_maker
# 全局变量的定义处理
global_async_engine = self.async_engine
global_async_session = self.async_session_maker
except Exception as e:
raise e
................................................
3:定义上下文对象
................................................
@asynccontextmanager
async def get_async_session_context_globa() -> AsyncGenerator:
async_session: AsyncSession = global_async_session()
try:
yield async_session
# Exception during reset or similar
# Traceback (most recent call last):
# 使用自动提交在某些情况下 会突发的asyncio.exceptions.CancelledError异常
# await async_session.commit()
except OperationalError as ex:
pass
raise ex
except SQLAlchemyError as ex:
await async_session.rollback()
raise ex
finally:
await async_session.close()
................................................
4: 使用全局变量
@app.get("/async_session_with")
async def sync_route():
async with get_async_session_context_globa() as async_session:
pass
logger.info(await SysCategoryService.get_sys_category_items_all(db_session=async_session))
print("ssssssssssssssss",await SysCategoryService.get_sys_category_items_all(db_session=async_session))
# eventsaaa.async_emit_evnet("app_mention", "我是发送的数据信息")
return 'ok'
................................................
没有合适的资源?快使用搜索试试~ 我知道了~
基于FastAPI、Vue、PostgreSQL、Peewee和SmartAdmin的Toy项目设计源码
共1455个文件
pyc:558个
py:527个
vue:178个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 48 浏览量
2024-10-10
04:32:46
上传
评论
收藏 15.3MB ZIP 举报
温馨提示
该项目是一款基于FastAPI、Vue、PostgreSQL、Peewee和SmartAdmin框架的Toy项目设计源码,包含1395个文件,涵盖了Python、Vue、TypeScript、JavaScript、HTML和CSS等多种编程语言。源码文件类型丰富,包括558个pyc文件、470个py文件、178个vue文件、68个ts文件、36个js文件等。该项目汇集了作者的个人经验,对部分功能进行了封装,旨在为开发者提供参考和交流的平台。虽然项目较为简单,但其中可能存在一些小问题,欢迎提出宝贵意见。如有帮助,欢迎关注作者的个人公众号获取更多资讯。
资源推荐
资源详情
资源评论
收起资源包目录
基于FastAPI、Vue、PostgreSQL、Peewee和SmartAdmin的Toy项目设计源码 (1455个子文件)
swagger-ui.css 188KB
.env.development 169B
.env 38B
.eslintignore 114B
.gitignore 51B
info.2023-07-23_10-45-51_108772.log.gz 2.46MB
info.2023-07-20_07-34-24_124179.log.gz 659KB
info.2023-07-19_09-33-10_975849.log.gz 639KB
info.2023-07-22_12-25-46_562781.log.gz 223KB
info.2023-07-21_09-30-33_111808.log.gz 191KB
info.2023-07-18_15-05-28_176990.log.gz 114KB
info.2023-07-05_17-53-41_618100.log.gz 37KB
info.2023-07-06_14-08-13_116030.log.gz 15KB
index.html 719B
favicon.ico 17KB
login-bg2.jpg 394KB
login-bg3.jpg 281KB
498b48a68af58f4e1300cd1bed6c41a.jpg 211KB
login-bg.jpg 202KB
753ba3e17a995de18c3ecba177e695e.jpg 121KB
zhuoda-wechat.jpg 41KB
1024lab-gzh.jpg 27KB
xiaozhen-gzh.jpg 9KB
swagger-ui-bundle.js 1.04MB
redoc.standalone.js 973KB
businesses-api.js 5KB
role-api.js 3KB
.eslintrc.js 3KB
employee-api.js 2KB
notice-api.js 2KB
.prettierrc.js 2KB
dict-api.js 2KB
help-doc-api.js 2KB
enterprise-api.js 2KB
.stylelintrc.js 2KB
code-generator-api.js 1KB
department-api.js 1KB
login-api.js 1KB
invoice-api.js 1KB
bank-api.js 1KB
menu-api.js 1KB
file-api.js 1005B
help-doc-catalog-api.js 943B
category-api.js 936B
change-log-api.js 856B
config-api.js 813B
goods-api.js 779B
serial-number-api.js 740B
reload-api.js 729B
role-menu-api.js 711B
home-api.js 708B
cache-api.js 689B
table-column-api.js 665B
operate-log-api.js 575B
init-quick-entry-list.js 567B
feedback-api.js 556B
login-log-api.js 460B
data-tracer-api.js 441B
heart-beat-api.js 439B
package-lock.json 436KB
package.json 2KB
tsconfig.json 1KB
login.less 3KB
index.less 3KB
smart-admin.less 2KB
index.less 1KB
index.less 983B
LICENSE 1KB
.env.localhost 159B
testx.lock 0B
info.log 266KB
info.log 218KB
imagesimage.png 689KB
smart-admin-logo.png 14KB
login-qr.png 11KB
smart-admin-logo-white.png 8KB
weibo-icon.png 8KB
ali-icon.png 7KB
wechat-icon.png 7KB
login-form-open-eyes.png 6KB
google-icon.png 6KB
logo.png 6KB
qq-icon.png 5KB
login-form-open-eyes-close.png 5KB
captcha.png 2KB
logo-min.png 2KB
edit_icon.png 700B
file_icon.png 488B
.env.pre 159B
.env.production 146B
group_router.py 38KB
component.py 27KB
message.py 27KB
card.py 20KB
wrapper.py 19KB
events.py 18KB
datetime_helper.py 16KB
errors_template.py 15KB
wxa.py 15KB
__init__.py 15KB
共 1455 条
- 1
- 2
- 3
- 4
- 5
- 6
- 15
资源评论
csbysj2020
- 粉丝: 2402
- 资源: 5445
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功