Python - 在控制器内读取标题?

时间:2017-01-04 15:15:10

标签: python openerp werkzeug request-headers odoo-10

我在源控制系统和Odoo之间构建controller,使得特定的集成代码源控制系统(如bitbucket,github)能够使用json对数据进行有效负载。阅读实际的有效数据是有效的,但我正在努力的是在headers内阅读controller数据。

我需要headers数据,因此我可以确定从哪个系统收到此有效负载(例如,bitbucket和github中的数据结构可能不同)。现在,如果我读到header,我会知道哪个系统负载数据以及如何正确解析它。

所以我的controller看起来像这样:

from odoo import http
from odoo.http import request


class GitData(http.Controller):
    """Controller responsible for receiving git data."""

    @http.route(['/web/git.data'], type='json', auth="public")
    def get_git_data(self, **kwargs):
        """Get git data."""
        # How to read headers inside here??
        data = request.jsonrequest
        # do something with data
        return '{"response": "OK"}'

现在举例来说,我可以用以下方式调用此路线:

import requests
import json

url = 'http://some_url/web/git.data'
headers = {
 'Accept': 'text/plain',
 'Content-Type': 'application/json',
 'type': 'bitbucket'}
data = {'some': 'thing'}

r = requests.post(url, data=json.dumps(data), headers=headers)

现在它看起来控制器自动读取头文件,因为它知道它是json类型。但是,如果我需要手动检查headers['type']之类的特定标题数据(在我的示例中为bitbucket),该怎么办?

我尝试调查dir(self)dir(request),但没有看到与标题相关的任何内容。此外**kwargs为空,因此没有标题。

注意。request对象实际上是:

# Thread local global request object
_request_stack = werkzeug.local.LocalStack()

request = _request_stack()
"""
    A global proxy that always redirect to the current request object.
""" 
# (This is taken from Odoo 10 source)

所以基本上它是werkzeug的一部分。

也许有人在werkzeugcontrollers方面有更多经验,所以可以指出我正确的方向吗?

P.S。同样在Odoo本身,我没有找到任何能够读取我想要的标题的例子。它看起来是唯一使用标题的地方(实际设置它们而不是阅读),事后是在建立响应时。

1 个答案:

答案 0 :(得分:1)

from openerp.http import request

在您的控制器中处理您的特定路径。您可以使用以下代码访问请求标头。 (确认Odoo8,Odoo10 ......也可能适用于Odoo9)

headers = request.httprequest.headers