Chatbot using Django Channels. Persist a python object in a scope?

66 views
Skip to first unread message

Rithwik Cherian

unread,
Jun 9, 2018, 8:05:27 AM6/9/18
to Django users
Hello all,

Very excited to discover the Channels project. I think it could be exactly what I was looking for. I am going through the documentation and seeing how it works right now, but I would really appreciate if someone could tell me if it will help me do what I want.

I am making a chatbot, which is state dependent. The dialogue delivery and state management is handled by a Finite State Machine built using the transitions (pytransitions) library. So my chatbot is a python object, which transitions from one state to another based on the users input. So to run the chatbot (per user per session) I need something exactly like the scope provided by channels, something that lasts for more than one request. 

My question is if I can have a python object instantiated per scope and have it persist for the duration of the scope, so that for each user I can have a different object keeping track of which state the user is in and returning responses based on the state?

Any help would be appreciated, as I am very inexperienced on things related to web (websockets, WSGI, ASGI etc.).

Thanks.

Ryan Nowakowski

unread,
Jun 9, 2018, 9:37:23 PM6/9/18
to Rithwik Cherian, Django users
I've never used pytransitions. Typically persistent state in Django is stored in the model instead of objects in memory. This allows you to easily scale and also recover state if your app process stops.

Andrew Godwin

unread,
Jun 10, 2018, 12:44:29 PM6/10/18
to django...@googlegroups.com
Hi!

You can indeed have things persist for the entire scope - the Consumer (or any other ASGI app) does exactly this, and so if you're in a consumer you can just store things on "self". That'll be tied to a specific socket and garbage-collected once it's done (on Channels 2 only - channels 1 didn't do this!)

Of course, I am assuming you're meaning "per websocket". If you want to use another protocol - like the ASGI Telegram server I cooked up - those scopes are per-user but sometimes get garbage collected after an idle period with no communication. You should think about this even for WebSocket; what happens if the user's socket reconnects? Does the state machine reset? If not, you need to store state somewhere externally from the socket handling code.

Andrew

Andrew

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/142cb856-17f7-4cf1-9f3b-87d80e0ca5f8%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Rithwik Cherian

unread,
Jun 11, 2018, 1:12:52 AM6/11/18
to Django users
Hey Ryan. 
The problem is actually not specific to pytransitions. But anyways, I wanted to persist an object in memory and not have to retrieve it from the DB every time. Although I'm not sure which is better for scaling (please give suggestions if you know more). As for recovering state, I'm planning to store the state in a session variable as a fail safe.

Rithwik Cherian

unread,
Jun 11, 2018, 1:16:44 AM6/11/18
to Django users
Hi Andrew,

Great. That's good to know. :) 
I'll try it out right away.
Yeah, I read somewhere that it is available from Channels 2. I am using the latest version anyways. :)

Well, pardon my usage. I am not 100% sure about what exactly these terms (websocket, asgi etc) mean exactly (I'm very new to all this), so I may have made a few mistakes when talking about them.
As for what happens when connection is lost or reconnects, I'm planning to store the state in a session variable as well to be safe.
Reply all
Reply to author
Forward
0 new messages