我正在为可扩展的物联网应用程序的一些架构选择而苦苦挣扎.
我选择将我的项目建立在Cyclone框架的Twisted扩充上,以提供许多Tornado规范(websockets,auth-decorators,secure-cookies等)
使用Twisted核心对我来说非常漂亮.我有许多IP协议和硬件接口,所有这些都被证明在扭曲内部有很好的库支持(并且我的应用程序添加新的协议和接口是最可能的角度,我将有项目范围蔓延),所有这些都需要Twisted非常低的CPU并提供非常高的连接数.
我的问题是二阶webapp功能.
我在Cyclone中认为,使用它的auth goodies(OpenID,oauth,用户身份验证装饰器和安全cookie),在我的webapp中实现用户/会话/管理功能并不需要太多.在500多行抽象我的数据库(通过txmongo)并且只是构建用户登录之后,我很清楚:
一位朋友在Flask指出我,最初我认为这是完全多余的,直到我找到烧瓶插件.Flask-Login和Flask-Admin的组合将完全覆盖我的用户,会话和用户管理需求,否定我写下我猜想的2k行代码.不幸的是,烧瓶插件充斥着阻塞代码并调用阻塞库.我没有看到它们与我的项目兼容,即使使用了WSGI 容器,因为每次加载页面都会发生用户/会话功能(另外我没有看到任何允许我将它们移植到异步世界的快捷方式工作大致相当于重写它们的工作)
我的问题是:
在python异步空间(...希望在Twisted空间中,根据我的协议需要),是否有任何插件或备用框架提供类似于Flask-Login中的现成用户/登录/管理功能烧瓶管理员?
PS我把Klein视为Flask的明显Twisted版本,但它似乎没有插件生态系统,而且我找不到任何强大的用户/会话/管理员.
PPS当我写这个问题时,我已经编写了自己的(糟糕的)用户登录会话系统.所以我真正追求的是"管理"功能(用户风格记录上的自动CRUD功能,包括Web UI渲染,所有这些都以Twisted/async方式设计).我询问了问题中的用户/登录,如果事实证明有一个已经整合的解决方案(例如flask-login和flask-admin),在这种情况下,我很乐意放弃我的代码并切换到那个.
背景:(使用Eve和Mongo)
我正在使用Eve REST提供程序库连接和使用mongoDB 从Python中工作,以从数据库中公开许多REST端点.到目前为止,我使用Eve已经好运了,但是我遇到的问题可能超出了Eve本身可以做的事情.
我的问题是我的mongoDb文档格式有一个字段(称为"插槽"),其值是字典/嵌入文档的列表/数组.
所以mongoDB文档结构是:
{
blah1: data1,
blah2: data2,
...
slots: [
{thing1:data1, thing2:data2},
{thingX:dataX, thingY:dataY}
]
}
Run Code Online (Sandbox Code Playgroud)
我需要在'slots'列表中添加新记录(IE添加预先填充的词典).
如果我想通过pymongo直接进行插入,它看起来像:
mongo.connection = MongoClient()
mongo.db = mongo.connection['myDB']
mongo.coll = mongo.db['myCollection']
...
mongo.coll.update({'_id' : document_id},
{'$push': { "slot" : {"thing1":"data1","thingX":"dataX"} } } )
Run Code Online (Sandbox Code Playgroud)
我想要执行此操作的REST动作/ URI组合是POST'_id/slots',例如URI /app/012345678901234567890123/slots.
问题:(在Eve中将元素插入数组中)
从SO:如何在Python Eve中添加列表类型而不替换旧值和eve项目问题看起来Eve目前不支持在mongoDB嵌入式文档(或数组?)上运行,除非整个嵌入式文档被重写,并重写在我的情况下,整个数组非常不受欢迎.
所以,假设它真正的Eve没有一个允许插入数组元素的方法(并且鉴于我已经有许多其他端点在Eve内部运行良好)...
...我现在正在寻找一种方法,在具有多个工作端点的Eve/Flask配置中,拦截并更改Eve的mongoDB写入仅针对这一个端点.
我知道(最坏的情况)我可以覆盖Eve的路由并完全手工编写,但后来我会管理_updated和手工检查并更改文档_etag值,这两件事我宁愿不必写新代码.
我看过Eve的Datebase事件挂钩,但是我没有看到修改执行的数据库命令的方法(我可以看到如何更改数据,但不能看到命令).
其他人已经解决了这个问题吗?如果没有关于最直接的手动实施的想法?(希望尽可能多地重复使用Eve,因为我确实希望继续使用Eve来处理所有(已经在工作的)端点)