AndroidアプリケーションからOdooデータベースに接続する方法

T.で

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スクリプトから呼び出して試してみると、正常に動作し、接続しているアカウントのIDを持つa<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応答が返されます。

応答[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認証後、ユーザーのIDを取得しましたが、セッショントークンは取得していません次に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リクエストで資格情報を送信しないでください
  • すべてのOdooRPCリクエストはPOSTリクエストです
  • / web / session / authenticateを使用する場合、カスタムログインルートは必要ありません
  • 外部APIはodooフレームワークの使用外であることを意図しています。モジュールを開発するときは、モデル内の場合はself.env ['<model>']を使用し、コントローラー内の場合はhttp.request.env ['<model>']を使用します
  • / web / session / authenticateを呼び出すと、session_idを含むjsonが返されます。これは、/ web / session / destroy呼び出してログアウトするまでCookieで後続のリクエストに渡す必要があります

/ 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())

コントローラから情報を取得するには、現時点でログに記録されたユーザーを保持する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)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ClusterpointデータベースをAndroidアプリケーションに接続する方法

分類Dev

接続文字列を使用してwinformアプリケーションからGodaddyのSQLServerデータベースに接続する方法

分類Dev

AndroidアプリケーションからFirebaseデータベースにデータを追加する方法

分類Dev

c#アプリケーションからMagentoデータベースに接続する方法はありますか?

分類Dev

ReactjsアプリケーションをMongoDBデータベースに適切に接続する方法

分類Dev

Spring BootアプリケーションをMySQLデータベースに接続する方法は?

分類Dev

データベースをAngularWebアプリケーションに接続する方法は?

分類Dev

Webアプリケーションで分散データベースに接続する方法は?

分類Dev

BlueMixの.phpアプリケーションからSQLデータベース-s2に接続する方法

分類Dev

JavaアプリケーションからOracleリモートデータベースに接続するにはどうすればよいですか?

分類Dev

データベースをセットアップしてデジタルオーシャンのNodeJSアプリケーションに接続する方法

分類Dev

CentOSでホストされているlaravelアプリケーションからdb2データベースに接続する

分類Dev

IntelliJ IDEA から Cassandra データベースに接続する Spark アプリケーションを送信する

分類Dev

外部データベースへの接続-Androidアプリケーション

分類Dev

EntityFrameworkを使用してMVCアプリケーションから既存のAzureデータベースに接続する

分類Dev

ApacheTomcatを使用してJSPWebアプリケーションのデータベースに接続する

分類Dev

NameCheapを使用してデータベースをアプリケーションに接続する

分類Dev

mvcアプリケーションから外部URLに接続する方法

分類Dev

Web サイトとデスクトップ アプリケーションを同じデータベースに接続する方法

分類Dev

AzureWebアプリケーションからのデータベース接続が遅い

分類Dev

PHPを使用してopencartアプリケーションをSQLサーバーデータベースに接続する方法

分類Dev

SpringBootアプリケーションでリモートデータベース接続用のデータソースを構成する方法

分類Dev

アプリケーションでリモートデータベースに接続するためのより安全な方法

分類Dev

Web mysqlデータベースをC#Windowsフォームアプリケーションに接続する方法を理解しています

分類Dev

AndroidアプリケーションからSOAPWebサービスにデータを送信する方法は?

分類Dev

C#アプリケーションをAWS EC2データベースに安全に接続するにはどうすればよいですか?

分類Dev

Angularアプリケーションからデータベースにデータを送信する

分類Dev

PCのプログラムをAndroidデバイスのアプリケーションに接続する方法

分類Dev

Pythonアプリケーションからmysqlクラスターに接続する

Related 関連記事

  1. 1

    ClusterpointデータベースをAndroidアプリケーションに接続する方法

  2. 2

    接続文字列を使用してwinformアプリケーションからGodaddyのSQLServerデータベースに接続する方法

  3. 3

    AndroidアプリケーションからFirebaseデータベースにデータを追加する方法

  4. 4

    c#アプリケーションからMagentoデータベースに接続する方法はありますか?

  5. 5

    ReactjsアプリケーションをMongoDBデータベースに適切に接続する方法

  6. 6

    Spring BootアプリケーションをMySQLデータベースに接続する方法は?

  7. 7

    データベースをAngularWebアプリケーションに接続する方法は?

  8. 8

    Webアプリケーションで分散データベースに接続する方法は?

  9. 9

    BlueMixの.phpアプリケーションからSQLデータベース-s2に接続する方法

  10. 10

    JavaアプリケーションからOracleリモートデータベースに接続するにはどうすればよいですか?

  11. 11

    データベースをセットアップしてデジタルオーシャンのNodeJSアプリケーションに接続する方法

  12. 12

    CentOSでホストされているlaravelアプリケーションからdb2データベースに接続する

  13. 13

    IntelliJ IDEA から Cassandra データベースに接続する Spark アプリケーションを送信する

  14. 14

    外部データベースへの接続-Androidアプリケーション

  15. 15

    EntityFrameworkを使用してMVCアプリケーションから既存のAzureデータベースに接続する

  16. 16

    ApacheTomcatを使用してJSPWebアプリケーションのデータベースに接続する

  17. 17

    NameCheapを使用してデータベースをアプリケーションに接続する

  18. 18

    mvcアプリケーションから外部URLに接続する方法

  19. 19

    Web サイトとデスクトップ アプリケーションを同じデータベースに接続する方法

  20. 20

    AzureWebアプリケーションからのデータベース接続が遅い

  21. 21

    PHPを使用してopencartアプリケーションをSQLサーバーデータベースに接続する方法

  22. 22

    SpringBootアプリケーションでリモートデータベース接続用のデータソースを構成する方法

  23. 23

    アプリケーションでリモートデータベースに接続するためのより安全な方法

  24. 24

    Web mysqlデータベースをC#Windowsフォームアプリケーションに接続する方法を理解しています

  25. 25

    AndroidアプリケーションからSOAPWebサービスにデータを送信する方法は?

  26. 26

    C#アプリケーションをAWS EC2データベースに安全に接続するにはどうすればよいですか?

  27. 27

    Angularアプリケーションからデータベースにデータを送信する

  28. 28

    PCのプログラムをAndroidデバイスのアプリケーションに接続する方法

  29. 29

    Pythonアプリケーションからmysqlクラスターに接続する

ホットタグ

アーカイブ