Python中Django如何与APP通过socket进行通信?

小企业,后端开发人数较少。现在计划开发一个社交通讯系统,已经使用了 django 作为后端框架。 现在需要实现与 iOS 端的 socket 通信(能够互相推送消息即可), 有什么比较好的方案?


Python中Django如何与APP通过socket进行通信?
5 回复

websocket 了解一下?或者 django channel


在Django中,应用(APP)通过Socket与外部服务通信,通常不是直接在同一个Django进程内进行,而是借助独立Socket服务或使用Django Channels处理WebSocket。这里给你一个核心的异步TCP Socket通信示例,适合集成到Django应用里。

首先,确保你的Django项目已安装异步支持(Django 3.1+ 原生支持异步视图,但完整异步操作建议用Channels)。以下是一个简单的TCP Socket客户端示例,你可以在Django的视图、管理命令或自定义模块中调用它:

# 在Django应用的某个模块中,例如 myapp/socket_client.py
import asyncio
import json

async def tcp_client_send(data, host='127.0.0.1', port=8888):
    """
    异步TCP Socket客户端,发送数据到指定服务器并接收响应。
    data: 要发送的数据(字典或可序列化对象)
    host: Socket服务器地址
    port: Socket服务器端口
    返回:服务器响应的字符串
    """
    try:
        reader, writer = await asyncio.open_connection(host, port)
        # 将数据序列化为JSON字符串并发送
        message = json.dumps(data).encode()
        writer.write(message)
        await writer.drain()

        # 接收响应(假设服务器会回传数据)
        response = await reader.read(1024)
        writer.close()
        await writer.wait_closed()
        return response.decode()
    except Exception as e:
        return f"Socket通信错误: {e}"

# 在Django异步视图中调用示例
from django.http import JsonResponse
from .socket_client import tcp_client_send

async def my_async_view(request):
    data_to_send = {"command": "get_data", "user_id": 123}
    response = await tcp_client_send(data_to_send)
    return JsonResponse({"socket_response": response})

如果你需要处理WebSocket(浏览器与Django实时通信),那就得用Django Channels。先安装Channels(pip install channels),然后配置路由和消费者:

# myapp/consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer

class MyAppConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()

    async def receive(self, text_data):
        # 处理从WebSocket客户端收到的消息
        data = json.loads(text_data)
        # 这里可以执行你的业务逻辑,比如调用其他服务
        response = {"status": "received", "data": data}
        await self.send(json.dumps(response))

    async def disconnect(self, close_code):
        pass

然后在routing.py里配置WebSocket路由,并在Django的ASGI_APPLICATION设置中启用Channels。

总结一下:用异步TCP Socket做客户端连接外部服务,用Django Channels处理WebSocket。

Ajax 吗?

不是 websocket
也不是 ajax.

问题可能要更正一下: 现在我已经有了一个基于 Django 的网站,要增加对外的 socket 通信,有什么解决方案?

本问题与 /t/434154 类似。该帖子多数答案的建议,与本帖的 1 楼相同-----使用 django-channel。
我先尝试使用 django-channel。 多谢大家的帮助。

回到顶部