Я разрабатываю приложение для Android и хочу получить данные с сервера Odoo.
Для этого я разработал пользовательский модуль в Odoo, в котором я создал контроллер.
Мой контроллер:
import json
import xmlrpc.client as xmlrpclib
from odoo import http
from openerp.http import Response
class resUserController(http.Controller):
url = '<my url>'
db = '<name of my database>'
@http.route('/user/login', type='json', method='GET', auth='public')
def get_login(self, **kwargs):
username = kwargs.get('email')
password = kwargs.get('password')
common = xmlrpclib.ServerProxy('{}/xmlrpc/2/common'.format(self.url), allow_none=True)
uid = common.authenticate(self.db, username, password, {})
if uid:
Response.status = '200 Succesful operation'
json_result = {'token': uid}
return json.dumps(json_result)
Response.status = '400 Invalid credentials'
return
Когда я вызываю его из скрипта Python, чтобы попробовать, он работает нормально, и я получаю <Response [200]>
и json {u'jsonrpc': u'2.0', u'result': u'{"token": 8}', u'id': None}
с идентификатором учетной записи, которую я подключаюк.
Но тогда у меня есть другая функция, которую я вызываю с другим маршрутом в том же контроллере, но с auth='user'
на этот раз, потому что я хочу, чтобы пользователь мог видеть только информацию, на которую он имеет права.
@http.route('/user/getInfo', type='json', method='GET', auth='user')
def get_info(self, **kwargs):
uid = 1
password = '<my admin password>'
models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(self.url), allow_none=True)
info = models.execute_kw(self.db, uid, password, 'res.users',
'search_read', [[['id', '=', kwargs.get('token')]]],
{'fields': ['info']})[0]['invite_code']
if info:
Response.status = '200 Succesful operation'
json_result = {'info': info}
return json.dumps(json_result)
Response.status = '404 User not found'
return
Эта функция отлично работает, когда я использую auth='public'
, но когда я выбираю auth='user'
, я получаю следующий ответ json:
Response [200]
{
u'jsonrpc': u'2.0',
u'id': None,
u'error': {
u'message': u'Odoo Session Expired',
u'code': 100,
u'data': {
u'debug': u'Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/http.py", line 650, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 310, in _handle_exception
raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
File "/usr/lib/python3/dist-packages/odoo/tools/pycompat.py", line 87, in reraise
raise value
File "/usr/lib/python3/dist-packages/odoo/addons/http_routing/models/ir_http.py", line 342, in _dispatch
cls._authenticate(func.routing[\'auth\'])
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_http.py", line 117, in _authenticate
getattr(cls, "_auth_method_%s" % auth_method)()
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_http.py", line 90, in _auth_method_user
raise http.SessionExpiredException("Session expired")
odoo.http.SessionExpiredException: Session expired',
u'exception_type': u'internal_error',
u'message': u'Session expired',
u'name': u'odoo.http.SessionExpiredException',
u'arguments': [u'Session expired']
}
}
}
Я основал свою работу на Эта документация , которая является официальным документом Odoo, но вот проблемы:
1 Он попросил меня написать свой пароль администратора в каждой функции, что кажется опасным.
2 После аутентификации я получаю идентификатор моего пользователя, но без токена сеанса .Тогда как я могу сообщить своей функции с помощью auth='user'
, что я подключен и к какому пользователю?
Вот мой скрипт для проверки моих вызовов:
import requests
import json
url_connect = "<my url>/user/login"
url = "<my url>/user/getInfo"
headers = {'Content-Type': 'application/json'}
data_connect = {
"params": {
"email": "<my test account email>",
"password": "<my test account password>",
}
}
data = {
"params": {
"token": <my test account id>,
}
}
data_json = json.dumps(data)
r = requests.get(url=url_connect, data=json.dumps(data_connect), headers=headers)
print(r)
print(r.json())
r = requests.get(url=url, data=data_json, headers=headers)
print(r)
print(r.json())