[Python] How to use a xmlrpc.client.ServerProxy object in package function?

Discussão em 'Python' iniciado por Stack, Abril 23, 2025.

  1. Stack

    Stack Membro Participativo

    I am working with the Odoo XML-RPC API and I want to reuse a connection (ServerProxy object) across multiple functions in my package.

    Current Setup

    I establish the connection like this:

    import xmlrpc.client
    import pprint

    # Demo connection to Odoo
    info = xmlrpc.client.ServerProxy('https://demo.odoo.com/start').start()
    url, db, username, password = info['host'], info['database'], info['user'], info['password']

    print(f"Connecting to Odoo at {url}, database: {db}, user: {username}")

    # Real data for actual operations
    from my_package.core.config import odoo_url, odoo_db, odoo_username, odoo_password

    common = xmlrpc.client.ServerProxy(f'{odoo_url}/xmlrpc/2/common')
    uid = common.authenticate(odoo_db, odoo_username, odoo_password, {})
    models = xmlrpc.client.ServerProxy(f'{odoo_url}/xmlrpc/2/object')

    pprint.pprint(common.version())
    print('uid =', uid)
    print('models =', models)


    output:

    Connecting to Odoo at https://demo4.odoo.com, database: demo_saas-182_6bcd3971f542_1745421877, user: admin
    {'protocol_version': 1,
    'server_serie': '17.0',
    'server_version': '17.0+e',
    'server_version_info': [17, 0, 0, 'final', 0, 'e']}
    uid = 21
    models = <ServerProxy for dtsc.odoo.com/xmlrpc/2/object>


    What I Want to Achieve

    I want to connect to the Odoo server once and reuse the models object in different functions across my package, so I avoid reconnecting every time.

    Instead of doing this in each function:

    # Reconnect every time (current approach)
    common = xmlrpc.client.ServerProxy(f'{odoo_url}/xmlrpc/2/common')
    uid = common.authenticate(odoo_db, odoo_username, odoo_password, {})
    models = xmlrpc.client.ServerProxy(f'{odoo_url}/xmlrpc/2/object')

    # Do something


    I want to do something like this:

    # my_package/core/my_file.py

    def my_function(models):
    # Use the existing ServerProxy object
    information = do_something_with(models)
    return information

    ...
    # main.py
    from my_package.core.my_file import my_function

    update_information = my_function(models) # Pass the connected models object



    My Question

    How can I best structure my code to pass the ServerProxy object (or other related objects like uid) into my functions for reuse?

    Should I pass multiple objects (models, uid, etc.) into each function, or is there a better way to encapsulate this connection logic (e.g., using a class or context manager)?

    Would you use a class or a context manager?

    Any best practices for this kind of setup with Odoo’s XML-RPC API would be appreciated!

    thanks!

    Continue reading...

Compartilhe esta Página