Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: Keep a persistent reference to an object?

Tags:

python

django

I'm happy to accept that this might not be possible, let alone sensible, but is it possible to keep a persistent reference to an object I have created?

For example, in a few of my views I have code that looks a bit like this (simplified for clarity):

api = Webclient()
api.login(GPLAY_USER,GPLAY_PASS)
url = api.get_stream_urls(track.stream_id)[0]

client = mpd.MPDClient()
client.connect("localhost", 6600)
client.clear()
client.add(url)
client.play()
client.disconnect()

It would be really neat if I could just keep one reference to api and client throughout my project, especially to avoid repeated api logins with gmusicapi. Can I declare them in settings.py? (I'm guessing this is a terrible idea), or by some other means keep a connection to them that's persistent?

Ideally I would then have functions like get_api() which would check the existing object was still ok and return it or create a new one as required.

like image 853
fredley Avatar asked Aug 08 '13 15:08

fredley


1 Answers

You can't have anything that's instantiated once per application, because you'll almost certainly have more than one server process, and objects aren't easily shared across processes. However, one per process is definitely possible, and worthwhile. To do that, you only need to instantiate it at module level in the relevant file (eg views.py). That means it will be automatically instantiated when Django first imports that file (in that process), and you can refer to it as a global variable in that file. It will persist as long as the process does, and when as new process is created, a new global var will be instantiated.

like image 70
Daniel Roseman Avatar answered Oct 25 '22 18:10

Daniel Roseman