使用Eve的DB层而不使用HTTP

时间:2014-08-15 00:45:37

标签: eve

在我的应用程序中,MongoDB集合需要通过服务器端脚本作业进行更新(IE:每隔30分钟从其他API中擦除/拉出的cron作业)。我真正想要做的是对MongoDB集合进行更新,但是要根据模式验证数据并包含元数据(更新,创建等)。

解决这个问题的两种方法是:

  1. 让假客户端进行HTTP POST / PUT / PATCHES。但是,这意味着这个假客户端必须处理身份验证/授权/ last-modified-since等事情。
  2. 使用PyMongo直接与DB交互。但是,这意味着我不会进行数据验证或存储元数据。
  3. Eve是否有数据库挂钩,以便我可以在没有HTTP的情况下进行Eve-rich数据库更新?

3 个答案:

答案 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()对于此方法来说还不够。

如果您是新手,请阅读appcontextreqcontext的文档。(例如我)。

答案 2 :(得分:1)

如果您想在自定义端点中执行以下操作...

  1. 接受一些POST个数据
  2. 以某种方式操纵数据
  3. 执行post_internal()
  4. 将结果作为回复
  5. 返回

    ......你会这样做:

    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没有涉及的某些情况,这种方法可能会有用。