当前位置: 首页 > wzjs >正文

高校网站建设 安全教育最近几天的新闻大事

高校网站建设 安全教育,最近几天的新闻大事,营销型网站模板免费下载,深圳龙江网站设计最近使用它交互数据库,想实现类似java aop那种自动事务控制,不用手动commit或者rollback。我是用的是flaskdenpendency-injecter 这是我的db的配置类,里面会初始化一些session配置,里面比较重要的是把autocommit和autoflush关闭了…

最近使用它交互数据库,想实现类似java aop那种自动事务控制,不用手动commit或者rollback。我是用的是flask+denpendency-injecter

 这是我的db的配置类,里面会初始化一些session配置,里面比较重要的是把autocommit和autoflush关闭了,因为我们的代码会来处理这个,还有就是把expire_on_commit设置为flase,否则你commit之后,再取用某个entity就会报错了,例如你新建了一个entity,这个时候会更新他的id,返回给前端的时候就会报错了(Error Messages — SQLAlchemy 2.0 Documentation)。

"""Database module."""from contextlib import contextmanager, AbstractContextManager
from typing import Callablefrom sqlalchemy import create_engine, orm
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session
Base = declarative_base()class DatabaseConfig:def __init__(self, db_url: str) -> None:self._engine = create_engine(db_url, echo=True)self._session_factory = orm.scoped_session(orm.sessionmaker(autocommit=False,autoflush=False,expire_on_commit=False,bind=self._engine,),)def create_database(self) -> None:Base.metadata.create_all(self._engine)@contextmanagerdef session(self) -> Callable[..., AbstractContextManager[Session]]:session: Session = self._session_factory()try:yield sessionexcept Exception:session.rollback()raiseelse:if session._transaction.is_active:session.commit()session.close()

然后comtextmanger里面就是我们的处理代码了,我们主要依靠with代码块来控制,在yield之前的属于__init__,在yield之后属于__exit__,也就是当with代码块结束之前,如果发生任何报错,我们都会进行rollback操作,并且raise(这部分需要error handler来做了,这里就不赘述了),然后如果什么错误都没有发生,就检测transaction是否还是active,如果是就commit,然后关闭session。

 然后在Container中注入session contextmanager。

class Container(containers.DeclarativeContainer):wiring_config = containers.WiringConfiguration(packages=["main"])config = providers.Configuration(yaml_files=["config.yml"])db=providers.Singleton(DatabaseConfig,db_url=config.db.url)user_repository = providers.Factory(UserRepositoryImpl)user_service = providers.Factory(UserService,user_repository=user_repository,session_factory=db.provided.session)

然后再service层使用with代码块控制transation ,整个逻辑包含在同一个with中就行了。

class UserService:@injectdef __init__(self, user_repository: UserRepository, session_factory: Callable[..., AbstractContextManager[Session]]) -> None:self._repository: UserRepository = user_repositoryself.session_factory=session_factorydef create_user(self,user) -> User:with self.session_factory() as session:return self._repository.add(session=session,user=user)

然后在repo里面写具体代码就行了

class UserRepositoryImpl(UserRepository):def __init__(self) -> None:passdef add(self, user,session):session.add(user)return user

关于测试怎么写,可以看我篇blog,里面也会讲到测试类的事务控制:
Flask+ Dependency-injecter+pytest 写测试类-CSDN博客

http://www.dtcms.com/wzjs/330619.html

相关文章:

  • 工信部网站备案进度查询拼多多关键词优化是怎么弄的
  • 一个域名做多个网站日本进口yamawa
  • 成都网站建设前十推广引流平台
  • 上海营销型网站建设费用seo计费系统
  • 国外手机网站沈阳专业seo
  • 电子商务网站推广的目的东莞seo黑帽培训
  • 凡科建设网站入门版好不seo的优化技巧和方法
  • 做网站的图片的内存台州seo
  • 为什么做网站比app便宜seo技术最新黑帽
  • 福建龙岩有哪些网络平台北京seo课程培训
  • 上海网站建设备案号怎么恢复苏州seo网站推广哪家好
  • 拍摄宣传片费用明细seo技术培训价格表
  • 网站模版 下载工具seo快排优化
  • 公司网站建设好搜索推广代运营
  • 做网站简历怎么写国际新闻头条最新消息
  • 广州 四合一网站开发网站竞价推广托管公司
  • .net 做手机网站吗网站推广优化外链
  • 自建网站平台阿亮seo技术顾问
  • 石家庄网站制作设计郑州seo服务技术
  • 做网站会用到的代码单词十种营销方式
  • 视频推广网站百度关键词推广可以自己做吗
  • 张家港网站定制整站优化和单词
  • 黄骗免费网站平台营销
  • app和网站的关系seo百科大全
  • 国外高清视频素材网站推荐谷歌排名推广公司
  • 如何建设一个自己 的网站知乎推广合作
  • 网站开发要花多少钱赣州seo外包
  • 做详情页不错的网站陕西新闻今日头条
  • 网站收录查询代码合肥网站优化推广方案
  • 做盗版小说网站犯法吗南宁网站运营优化平台