mirror of
https://github.com/django/daphne.git
synced 2025-04-20 08:42:18 +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
|
||||
|
||||
from django.core import serializers
|
||||
from django.core.serializers.json import DjangoJSONEncoder
|
||||
|
||||
from .base import Binding
|
||||
from ..generic.websockets import WebsocketDemultiplexer
|
||||
|
@ -92,3 +93,44 @@ class WebsocketBinding(Binding):
|
|||
for name in data.keys():
|
||||
setattr(instance, name, getattr(hydrated.object, name))
|
||||
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