2017-01-04 4 views
1

Я строию controller между системой управления источниками и Odoo таким образом, что определенная интегрированная система управления исходным кодом (как битбакет, github) сможет обрабатывать данные с помощью json. Чтение реальных полезных данных работает, но то, что я борюсь, составляет headers данных внутри controller.Python - Прочитайте заголовки внутри контроллера?

Мне нужны данные headers, чтобы я мог определить, из какой системы получен этот полезный груз (например, структура данных может быть разной в битбакете и 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.

Возможно, у кого-то есть больше опыта работы с werkzeug или controllers в целом, так может указать на меня в правильном направлении?

P.S. Также в Odoo я не нашел никакого примера, который бы читал заголовки, как я хочу. Похоже, что используются только заголовки заголовков (фактически устанавливающие их вместо чтения), после того, как они были созданы, когда вы возвращаете ответ.

+0

Вы взглянули здесь http://werkzeug.pocoo.org/docs/0.11/quickstart/#header-parsing? –

ответ

1
from openerp.http import request 

Внутри вашего контроллера, управляющего вашим конкретным путем. Вы можете получить доступ к заголовкам запроса, используя приведенный ниже код. (Подтверждено Odoo8, Odoo10 ... вероятно, работает Odoo9 а)

headers = request.httprequest.headers 
+0

Спасибо. Я видел это в исходном коде, но почему-то думал, что он предназначен для типа маршрута http, и я использую 'json'. Но он работает независимо от типа. Он возвращает только то, что мне нужно. – Andrius

+0

Поверь мне, я тебя слышу. Я сделал много с контроллерами. Документация действительно ограничивает, какие аспекты запроса и ответа содержатся там. Я потратил огромное количество времени, пытаясь определить, где был объект ответа, когда я создал Bot Chat для Facebook для Odoo. Документы показывают, что вы найдете все в ** kw. Очевидно, это царапает поверхность. Хороший. –

Смежные вопросы