我是SQLAlchemy的新手,并且在没有访问原始作者的情况下继承了一些有点混乱的代码库.
代码是通过调用来编写的DBSession.flush(),似乎是作者想要确保数据被保存的任何时候.起初我只是遵循我在这段代码中看到的模式,但是当我正在阅读文档时,似乎这是不必要的 - 自动清理应该到位.另外,我遇到了一些AJAX调用的情况,这些调用会产生错误"InvalidRequestError:Session已经刷新".
在什么情况下,我合法地想要保持对flush()的调用?
这是一个Pyramid应用程序,SQLAlchemy正在设置:
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension(), expire_on_commit=False))
Base = declarative_base()
Run Code Online (Sandbox Code Playgroud) 我有一个页面,其中包含很长的文本区域,用于编辑大量文本.通常,当您键入时,当插入符号接近textarea的底部时,页面将自动滚动以使插入符号始终位于视口内(Firefox将一次滚动一行,Chrome将滚动插入符号的中心视口).
我的问题来自于我以编程方式根据用户输入的内容更改文本区域的内容.在某些情况下,这涉及添加额外的内容,从而推动插入视图.
一旦用户点击一个键,自动滚动就会启动并且插入符号被滚动到视图中 - 但不是之前,因此当用户键入时他们看不到插入符号.我曾希望我可以简单地触发textarea上的关键事件以使浏览器自动滚动,但是触发的事件并不能完全模拟用户行为,我也没有得到响应.
我现在能看到的唯一解决方案是尝试通过以下方式获得插入符号的XY坐标:
有更简单的方法吗?
我正在使用nextSibling遍历某个级别的元素来解析HTML中的一些数据,并根据遇到的每个元素的标记名称和类来执行不同的操作.
例如,
if n.name == "p" and n.class == "poem": blah()
Run Code Online (Sandbox Code Playgroud)
但是如果元素没有类或者它不是Tag的实例而因此没有名称,则会引发错误.
在访问之前进行测试
if "name" in n:
Run Code Online (Sandbox Code Playgroud)
总是返回假.我可以检查nextSibling返回的对象的类型,试图清除NavigableString和Comment,但必须有一个更简单的方法.
编辑
通过这个问题通过电子邮件发送了BeautifulSoup的开发者,他推荐使用
n.get("class")
Run Code Online (Sandbox Code Playgroud)
如果未设置"class",则返回None,这样就可以:
if n.get("class") == "poem": blah()
Run Code Online (Sandbox Code Playgroud) 我正在寻找在我的 React 组件中构建状态的方法,以便我可以一起实现两个目标:(1) 在复杂的应用程序中管理浏览器历史记录,以及 (2) 让单个组件可以在主应用程序之外的环境中轻松重用。
该应用程序有一个面板组件,可让用户导航和阅读我们网站上的内容。在主应用程序中,可以打开多个面板并将其排列在一起。在主应用程序之外,还有其他页面,我希望能够轻松放入单个 Panel 组件。
到目前为止,随着这段代码的发展,每个面板都有一个丰富的状态,表示它加载了什么内容和其他显示设置。这使得进入另一个页面变得容易——我可以只渲染一个 Panel 组件,用户可以与它交互,它会自行处理。
然而,对于浏览器历史记录,这变得越来越麻烦。有一个 App 组件可以管理多个面板以及推送到历史记录和从历史记录中弹出的状态。为了让它对整个应用程序的状态有一个完整的了解,当发生变化时,每个面板都会推送其状态的副本。当状态从历史记录中弹出时,App 组件可以从它呈现的每个面板传递一个初始状态。正如您可以想象的那样,随着更新周期最终相互循环,这变得混乱和容易出错。
感觉我需要采取的方法是集中状态(这是这里的建议)并尝试使每个单独的面板无状态。由于重写setState代码中已经存在的所有调用将是一项巨大的努力,因此我正在尝试评估这是否是唯一的方法。感觉这种方法会使重用应用程序外部的组件变得更加困难。我将失去 Panel 是一个独立组件的感觉,我可以只在页面上呈现它,因为它还需要某种外部管理器来处理它的状态以及从内部更改它的所有事件。
你会推荐什么?