【问题标题】:submit request (post) internally in python-eve在 python-eve 内部提交请求(发布)
【发布时间】:2014-03-05 07:58:16
【问题描述】:

我在前夕有一个资源,例如ABC,我想操纵另一个资源,例如BCD 当我向 ABC 发布新项目时满足某些条件时,我知道我可以为 post/pre_POST_ABC 挂钩事件,但是是否有一种“内部”方式可以在 BCD 上发布而无需再次通过 HTTP?

【问题讨论】:

    标签: python eve


    【解决方案1】:

    在您的回调函数中,您可以:

    A) 使用数据驱动将数据直接存储到数据库中

    类似这样的:

    def update_ABC(request, payload):    
        accounts = app.data.driver.db['abc_collection']
        account = accounts.insert(docs)
    
    app = Eve()
    app.on_post_POST_ABC += update_ABC
    app.run()
    

    会做的伎俩。你会以这种方式绕过框架,直接存储在数据库中。

    B) 使用app.test_client.post() 直接通过应用程序进行POST。

    app.test_client().post('/bcd', json.dumps({"field":"value"}, content_type='application_json'))
    

    这可能是一个更好的选择,因为请求会通过框架(为您处理像 data_created 这样的元字段。)

    更新:在 v0.5+ 中,您现在可以使用 post_internal 来获得相同的结果。其他 CRUD 方法也有等效的内部方法。

    【讨论】:

    • 选项 2 正是我正在寻找的,但它似乎不起作用? app.post 是“实例”类型而不是 func?
    • 我也尝试过 requests.post(url, data, headers) 但它是冻结前夕....但是使用请求并不理想,因为会有一些 http 开销。理想情况下调用一些前夕内部函数来做帖子?
    • 我意识到,@nicola-iarocci,我可以做 eve.methods.post,但是使用这种方法,一些相关的事件挂钩不再起作用,例如on_post_POST_BCD 没有被触发,你能指教吗?谢谢
    • 我修复了选项 2 的 sn-p。对此感到抱歉。
    • 对于选项 B) 我需要添加以下内容:app.test_client().post('/bcd', data=json.dumps({"field":"value"}), content_type='application/json')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多