django + nginx + uwsgi + dwebsocket配置

1. django-websocket 是旧版本的,现在已经没有人维护了。dwebsocket是新版的,推荐使用dwebsocket;

整个demo:

1.项目结构:

django + nginx + uwsgi + dwebsocket配置_第1张图片

2.HelloWorld项目代码:

     urls.py代码:

from django.conf.urls import url
from django.contrib import admin
import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/(?P\w+)', views.gotoIndex),
    url(r'websocketLink/(?P\w+)', views.websocketLink)# webSocket 链接

]

views.py

# coding=utf8
from django.shortcuts import render
import threading
from models import Ad
from dwebsocket.decorators import accept_websocket
import json
# from model_admin.models import MessageLog
# 跳转到主页

def gotoIndex(request, username):
    return render(request, 'index.html', {'username': username})



# 存储连接websocket的用户
clients = {}
# 记录连接人数   其实没什么卵用  = =
count = 0


# 连接websocket  ws://localhost:8000/websocketLink/22
# 因为 websocket 是协议  所以不能用 http或https
@accept_websocket
def websocketLink(request, username):
    '连接websocket'
    global count
    # 获取连接
    if request.is_websocket:
        lock = threading.RLock()#rlock线程锁
        try:
            lock.acquire()#抢占资源
            s = {}
            #  因为同一个账号打开多个页面连接信息是不同的
            if clients.get(username) != None:
                # 连接信息  键 连接名  值:连接保存
                s[str(request.websocket)] = request.websocket
                # 已存在的连接信息继续增加
                clients[username].update(s)
            else:
                # 人数加1
                count = count + 1
                #  连接信息  键 连接名  值:连接保存
                s[str(request.websocket)] = request.websocket
                # 新增 用户  连接信息
                clients[username] = s
            print("用户人数" + str(count))

            # 监听接收客户端发送的消息 或者 客户端断开连接
            # print type(unicode(message, "utf-8"))
            # request.websocket.send(u"测试")
            # request.websocket.send(unicode(message, "utf-8"))
            sql = ("select id,code,name "
                   "from "
                   "prov_ad  order by create_date desc limit 1"
                   )

            data_list = Ad.objects.raw(sql)
            datas = []
            for item in data_list:
                datas.append({
                    'id': item.id,
                    'name': item.name,  # 区域名称
                    'code': item.code,  # 区域编码
                    'long': item.long,  # 经度
                    'lat': item.lat  # 纬度
                })
            send(username,datas)
        except Exception as e:
            print e
        finally:
                # 通过用户名找到 连接信息 再通过 连接信息 k 找到 v (k就是连接信息)
                clients.get(username).pop(str(request.websocket))
                #释放锁
                lock.release()


 # 发送消息
def websocketMsg(client, msg):
    import json
    # 因为一个账号会有多个页面打开 所以连接信息需要遍历
    for cli in client:
        'client客户端 ,msg消息'
        b1 = json.dumps(msg).encode('utf-8')
        client[cli].send(b1)


# 服务端发送消息
def send(username, data):
    'username:用户名 data:消息内容'
    try:
        if clients[username]:

            websocketMsg(clients[username], { 'data': data})
    except BaseException:
        pass
    finally:
        pass
# messageLog.save()
index.html代码:



    {% load static %}

    
    
     
    django-websocket
    
    



如果项目部署到nginx服务上,你的项目要用到dwebsocket服务

一.先部署项目到Nginx:

1.xshell进入对应的目录:新建一个新的文件夹 例如:mkdir phots 在当前目录中建立名为photos的目录 

2.svn 检出对应的项目文件 svn checkout svn://项目路径

3.查看对应项目是否包含nginx.conf和uwsgi.ini文件

如果有,修改里面对应的端口和配置目录,没有就先拷贝或新建

.conf文件里面修改Nginx的端口,uwsgi对应端口和文件所在目录

 uwsgi.ini文件修改uwsgi对应的端口的目录,uwsgi和nginx对应的端口号是不同的

重新启动Nginx 和uwsgi文件,就可以启动项目服务

二.如果项目包含dwebsocket服务,还要再启动一个dwebsocket服务,才能让ws://服务器ip:8080进行通信

1.在项目对应的setting里添加下面配置WEBSOCKET_FACTORY_CLASS="dwebsocket.backends.uwsgi.factory.uWsgiWebSocketFactory"

2.重新复制一个uwsgi文件,重新命名,配置如下:重新命名为helloworld_uwsgi_8080

[uwsgi]
# uwsgi 使用配置文件启动
http = :8080
# 项目目录
chdir = xshell上的项目路径
# 指定项目的application
module =项目名称.wsgi
# 指定sock的文件路径
socket =xshell上的项目路径/uwsgi_8080.sock
# 启动uwsgi的用户名和用户组
uid = root
gid = root
# 进程数
workers = 1
# 接受的最大请求数
max-requests = 1000
pidfile=xshell上的项目路径/uwsgi_8080.pid
# 启动主进程
master=true
# 自动移除 unix socket和pid 文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启动线程
enable-threads=true
# 设置自中断时间
harakiri=100
# 设置缓冲
post-buffering=65535
# 不设置会导致上传大文件失败
buffer-size=65535
# 设置日志目录
daemonize= /mnt/logs/项目名称/uwsgi_8080.log
DJANGO_SETTINGS_MODULE=项目名称.settings

#这一句也是主要要加的参数
~                      

启动新加的这个uwsgi文件

3.项目里添加的dwebsocket服务就开启了

正如图中所示:django + nginx + uwsgi + dwebsocket配置_第2张图片

运行效果入下:

django + nginx + uwsgi + dwebsocket配置_第3张图片django + nginx + uwsgi + dwebsocket配置_第4张图片

 

 

你可能感兴趣的:(django)