Python Django - 如何支持Socket和API

时间:2018-04-23 06:03:45

标签: python django sockets

我使用的是python 3和Django 1.9,前端是android。

我必须提供2个连接,一个是通过API,以便用户可以使用UI并将他/她的详细信息发送到后端;第二,套接字连接,用于接收硬件详细信息,故障日志和向应用程序发送更新。

下面是我的套接字服务器。

import socket, ssl, json
from threading import Thread, active_count
from socketserver import ThreadingMixIn 
#from serializers import create_log_entry

# Multithreaded Python server : TCP Server Socket Thread Pool
class ClientThread(Thread): 

    def __init__(self,ip,port,conn): 
        Thread.__init__(self) 
        self.ip = ip
        self.port = port 
        self.conn = conn
        print ("[+] New server socket thread started for " + ip + ":" + str(port), active_count() )

    def run(self):
        connstream = ssl.wrap_socket(self.conn,
                                 server_side=True,
                                 certfile="/home/ubuntu/workspace/logs/server.crt",
                                 keyfile="/home/ubuntu/workspace/logs/server.key")
        while True : 
            data = connstream.read()
            print ("Server received data:", data)
            if data != b"" : data = json.loads(data.decode("utf-8"))
            else:
                print("Exiting loop")
                break
            print ("Server received data:", data)
            #create_log_entry(data)
            connstream.send("OK".encode("utf-8"))  # echo 

# Multithreaded Python server : TCP Server Socket Program Stub
TCP_IP = '0.0.0.0' 
TCP_PORT = 2005
BUFFER_SIZE = 20  # Usually 1024, but we need quick response 

def socket_server():
    tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    tcpServer.bind((TCP_IP, TCP_PORT)) 
    threads = [] 

    while True: 
        tcpServer.listen(4) 
        print ("Multithreaded Python server : Waiting for connections from TCP clients...") 
        (conn, (ip,port)) = tcpServer.accept() 
        newthread = ClientThread(ip,port,conn) 
        newthread.start() 
        threads.append(newthread) 

    for t in threads: 
        t.join() 

socket_server()

但它是有线程的并且听特定的端口。我在序列化程序文件中调用socket_server()来启动服务器。此服务器使用序列化程序文件中的方法,该方法在MongoDB中创建条目。

现在当我启动Django时,它将停止此方法调用,并且我无法使用API​​,因为服务器是中途启动的。

我需要在Django中进行哪些配置以便两者都有效?

1 个答案:

答案 0 :(得分:0)

我建议调查Django频道。

根据文件:

  

Channels是一个吸引Django并将其能力扩展到HTTP以外的项目 - 用于处理WebSockets,聊天协议,物联网协议等。

您可以像安装任何其他应用程序一样安装它并进行配置。唯一的区别是,不是创建新的视图或api调用并将它们映射到urls.py文件,而是创建新的使用者并将其映射到新的 routing.py 文件。

消费者很少负责“消费”事件(例如连接,断开连接,接收消息......)

目前可安装为:

pip install -U channels

https://channels.readthedocs.io/en/latest/installation.html

我强烈建议您按照本教程进行操作:

https://channels.readthedocs.io/en/latest/tutorial/part_1.html

以下是它的文档:

https://channels.readthedocs.io/en/latest/