gpt4 book ai didi

python - 如何从 Android 应用程序连接到 Odoo 数据库

转载 作者:行者123 更新时间:2023-11-30 22:05:53 25 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,我想从 Odoo 服务器检索数据。

为此,我在 Odoo 中开发了一个自定义模块,并在其中创建了一个 Controller 。

我的 Controller :

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}与我连接的帐户的 ID。

但是我有一个其他函数,我在同一个 Controller 中使用其他路由调用,但使用 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']
}
}
}

我的工作基于This documentation ,这是 Odoo 官方文档,但存在以下问题:

1它要求我在每个函数中写入我的管理员密码,这看起来很危险。

2 身份验证后,我获得了用户的 ID,但没有 session token 。那么我如何用 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())

最佳答案

注意事项:

  • 切勿在 GET 请求中发送凭据
  • 所有 Odoo RPC 请求都是 POST 请求
  • 如果您使用 /web/session/authenticate,则不需要自定义登录路由
  • 外部 API 旨在在 odoo 框架之外使用。开发模块时,如果在模型中,请使用 self.env['< model >'] ,如果在 Controller 中,请使用 http.request.env['< model >']
  • /web/session/authenticate 的调用会返回一个包含 session_id 的 json,您必须将其在 cookie 中传递给后续请求,直到您调用 >/web/session/destroy 注销。

以下是使用 /web/session/autenticate 的示例:

import requests
import json

url_connect = "http://localhost:8069/web/session/authenticate"
url = "http://localhost:8069/web/session/get_session_info"

headers = {'Content-Type': 'application/json'}

data_connect = {
"params": {
"db": "demo1",
"login": "admin",
"password": "admin",
}
}

data = {}

session = requests.Session()

r = session.post(url=url_connect, data=json.dumps(data_connect), headers=headers)

if r.ok:
result = r.json()['result']

if result.get('session_id'):
session.cookies['session_id'] = result.get('session_id')

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

要从 Controller 获取信息,您可以使用 request.env.user 来保存当前登录的用户,并且由于您指定了 auth='user' ,因此它必须是有效的。示例代码可能如下所示:

from odoo.http import request

class UserController(http.Controller):
@http.route('/user/getInfo', type='json', method='POST', auth='user')
def get_info(self, **kwargs):
current_user = request.env.user

Response.status = '200 Succesful operation'
json_result = {'info': current_user.info}
return json.dumps(json_result)

关于python - 如何从 Android 应用程序连接到 Odoo 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52875925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com