mirror of
https://github.com/django/daphne.git
synced 2025-07-13 09:22:17 +03:00
Added WebsocketBindingWithMembers (#262)
* Added WebsocketBindingWithMembers WebsocketBindingWithMembers inherits WebsocketBinding and additionally enables sending of member variables, properties and methods. * pep fixes * pep fixes * Changed to Mixin More flexible this way; also checking if members are callable now, not just a try-except. * moved BindingWithMembersMixin to base.py * moved BindingWithMembersMixin to base.py * undo moving to base.py * undo moving to base.py; undo Mixin * use DjangoJSONEncoder to serialize members * missing self * removed nasty whitespace
This commit is contained in:
parent
10eaa36c9c
commit
77f41ce1a9
|
@ -1,6 +1,7 @@
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from django.core import serializers
|
from django.core import serializers
|
||||||
|
from django.core.serializers.json import DjangoJSONEncoder
|
||||||
|
|
||||||
from .base import Binding
|
from .base import Binding
|
||||||
from ..generic.websockets import WebsocketDemultiplexer
|
from ..generic.websockets import WebsocketDemultiplexer
|
||||||
|
@ -92,3 +93,44 @@ class WebsocketBinding(Binding):
|
||||||
for name in data.keys():
|
for name in data.keys():
|
||||||
setattr(instance, name, getattr(hydrated.object, name))
|
setattr(instance, name, getattr(hydrated.object, name))
|
||||||
instance.save()
|
instance.save()
|
||||||
|
|
||||||
|
|
||||||
|
class WebsocketBindingWithMembers(WebsocketBinding):
|
||||||
|
"""
|
||||||
|
Outgoing binding binding subclass based on WebsocketBinding.
|
||||||
|
Additionally enables sending of member variables, properties and methods.
|
||||||
|
Member methods can only have self as a required argument.
|
||||||
|
Just add the name of the member to the send_members-list.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
class MyModel(models.Model):
|
||||||
|
my_field = models.IntegerField(default=0)
|
||||||
|
my_var = 3
|
||||||
|
|
||||||
|
@property
|
||||||
|
def my_property(self):
|
||||||
|
return self.my_var + self.my_field
|
||||||
|
|
||||||
|
def my_function(self):
|
||||||
|
return self.my_var - self.my_vield
|
||||||
|
|
||||||
|
class MyBinding(BindingWithMembersMixin, WebsocketBinding):
|
||||||
|
model = MyModel
|
||||||
|
stream = 'mystream'
|
||||||
|
|
||||||
|
send_members = ['my_var', 'my_property', 'my_function']
|
||||||
|
"""
|
||||||
|
|
||||||
|
send_members = []
|
||||||
|
|
||||||
|
encoder = DjangoJSONEncoder()
|
||||||
|
|
||||||
|
def serialize_data(self, instance):
|
||||||
|
data = super(WebsocketBindingWithMembers, self).serialize_data(instance)
|
||||||
|
for m in self.send_members:
|
||||||
|
member = getattr(instance, m)
|
||||||
|
if callable(member):
|
||||||
|
data[m] = self.encoder.encode(member())
|
||||||
|
else:
|
||||||
|
data[m] = self.encoder.encode(member)
|
||||||
|
return data
|
||||||
|
|
Loading…
Reference in New Issue
Block a user