我目前正在尝试创建一个后端服务器来与一些使用 websocket 的客户端进行通信。客户端向后端发出一些请求,后端通过消费者直接响应客户端。
另外,我有一个需要向客户端发送一些请求的 API。它必须通过消费者打开的套接字。我正在为 API 使用 Django Rest Framework。所以我现在有 2 个应用程序。一种用于消费者,一种用于 API。我想知道这是否是正确的方法。
这实际上是我现在正在考虑的代码:
# mybackendapp/consumers.py
class MyConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.client_id = self.scope['url_route']['kwargs']['client_id']
# This line I don't get it very well. It comes from:
# [channels doc: single channels][1]
# I don't know if I should create the Clients myself or if it's
# created automatically
Clients.objects.create(channel_name=self.channel_name,
self.client_id)
self.accept()
async def disconnect(self):
Clients.objects.filter(channel_name=self.channel_name).delete()
async def receive(self, text_data):
self.recv_data = json.loads(text_data)
if self.recv_data[0] == CLIENT_REQUEST:
self.handler = ClientRequestHandler(self.client_id,
self.recv_data) …Run Code Online (Sandbox Code Playgroud) 我有一个 API 端点 POST /data。接收到的数据以某种方式格式化,这与我将其存储在数据库中的方式不同。
我将使用 postgis 中的几何类型作为示例。
class MyPostgisModel(models.Model):
...
position = models.PointField(null=True)
my_charfield = models.CharField(max_length=10)
...
errors = JSONField() # Used to save the cleaning and validation errors
class MyPostgisSerializer(serializers.ModelSerializer):
class Meta:
model = MyPostgisModel
fields = [
...
"position",
...
"my_charfield",
"errors",
]
def to_internal_value(self, data):
...
# Here the data is coming in the field geometry but in the db, it's called
# position. Moreover I need to apply the `GEOSGeometry(json.dumps(...))`
# method as well. …Run Code Online (Sandbox Code Playgroud)