在我的应用程序中,MongoDB集合需要通过服务器端脚本作业进行更新(IE:每隔30分钟从其他API中擦除/拉出的cron作业)。我真正想要做的是对MongoDB集合进行更新,但是要根据模式验证数据并包含元数据(更新,创建等)。
解决这个问题的两种方法是:
Eve是否有数据库挂钩,以便我可以在没有HTTP的情况下进行Eve-rich数据库更新?
答案 0 :(得分:3)
从v0.5开始(目前在开发分支上,但你可以立即使用它),你可以使用post_internal
来添加数据:
Intended for internal post calls, this method is not rate limited,
authentication is not checked and pre-request events are not raised.
Adds one or more documents to a resource. Each document is validated
against the domain schema. If validation passes the document is inserted
and ID_FIELD, LAST_UPDATED and DATE_CREATED along with a link to the
document are returned. If validation fails, a list of validation issues
is returned.
添加更多内部方法以涵盖现在可通过HTTP获得的所有CRUD操作可能是有意义的。不过,你仍然可以马上调用它们。
更新:v0.5已经发布,_internal
方法可用于所有CRUD操作。
答案 1 :(得分:3)
我能够在一个可以由jenkins定期运行的单独脚本中运行它。我正在导入的run.py中的应用程序是eve quickstart末尾的应用程序。
from run import app
from eve.methods.post import post_internal
payload = {
"firstname": "Ray",
"lastname": "LaMontagne",
"role": ["contributor"]
}
with app.test_request_context():
x = post_internal('people', payload)
print(x)
post_internal运行eve.utils.parse_request,它依赖于flask.request,因此需要with app.test_request_context()
。 app.app_context()
对于此方法来说还不够。
如果您是新手,请阅读appcontext和reqcontext的文档。(例如我)。
答案 2 :(得分:1)
如果您想在自定义端点中执行以下操作...
POST
个数据post_internal()
......你会这样做:
from eve.methods.post import post_internal
from eve.render import send_response
def my_custom_endpoint(**kwargs):
data = json.loads(request.data.decode())
# <manipulate data here>
resp = post_internal('crew', data)
return send_response('crew', resp)
实际上,你可能最好使用Eve的Event Hooks做这类事情。但是如果遇到Event Hooks没有涉及的某些情况,这种方法可能会有用。