允许其他IP访问:在setting中更改成
ALLOWED_HOSTS = ['*']
在根目录增加static后要在settin中写上:
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
内网其他机器可以访问:runserver 0.0.0.0:8000
主url调用其他url:
path('index/', include('index.urls')),
多文件上传:
<input multiple="multiple" type="file" name="path" id='src_file'......
multiple=”multiple” 可以保证在选择文件的时候按住ctrl进行选择多个文件。以下是ajax异步上传多个文件的代码。
该代码解决了多个问题,第一是上传多个文件,利用for循环进行多个文件添加,否则就只能传第一个。
 for(i = 0; i< $('#src_file')[0].files.length; i++)
{
    formdata.append('src_file', $('#src_file')[0].files[i]);
}
第二个就是csrf的问题。
var csrf_data=$('input[name=csrfmiddlewaretoken]').val();
formdata.append('csrfmiddlewaretoken',csrf_data);
以下是完整前端代码
    $('#submit').click(function () {
        var i= 0;
        var formdata = new FormData();
        var csrf_data=$('input[name=csrfmiddlewaretoken]').val();
        formdata.append('csrfmiddlewaretoken',csrf_data);
        for(i = 0; i< $('#src_file')[0].files.length; i++)
        {
               formdata.append('src_file', $('#src_file')[0].files[i]);
        }
        $.ajax({
            type:'post',
            url:'/index/',
            data:formdata,
            processData:false,
            contentType:false,
            success:function (arg) {
                console.log(arg);}
            });
    })
</script>
以下是python后端代码,获得多个文件的关键是getlist函数,不能用get函数。
dirlist = request.FILES.getlist("src_file")  # 获取文件列表
for file in dirlist:
position = os.path.join('./results/源文档/'+username+'/', str(file))
# 获取上传文件的文件名,并将其存储到指定位置
storage = open(position, 'wb+') # 打开存储文件
for chunk in file.chunks(): # 分块写入文件
storage.write(chunk)
storage.close() # 写入完成后关闭文件
在做django过程中,我想在界面做一个像调试窗口信息显示的部分,能显示程序运行到何处以及产生的错误。我把目光投向了django的websocket。使用了dwebsocket模块进行开发。
在setting中INSTALLED_APPS中加上“dwebsocket”。
以下是websocket的前端通信代码
{#websocket通信#}
    <script>
        window.onload =function () {
            var username = '{{ request.session.user_name }}';
            if ("WebSocket" in window) {
                document.getElementById("yunxing").value = "您的浏览器支持 WebSocket!";
                var ws = new WebSocket("ws://" + window.location.host + "/index/websocket/"+ username);
                ws.onopen = function () {
                    document.getElementById("yunxing").value += "\n成功链接服务器!";
                    ws.send($('#message').val())  };
                ws.onmessage = function (evt) {
                    var received_msg = evt.data;
                    document.getElementById("yunxing").value += "\n"+received_msg;  };
                ws.onclose = function () {
                    document.getElementById("yunxing").value += "\n链接关闭";  };
            }
            else {alert("您的浏览器不支持 WebSocket!");}
    }</script>
第一为了实现区别用户,所以创建了登录窗口,用“用户名”区分不用用户,来进行点对点的消息发送,否则使用者打开,该部分就会显示其他人运行的提示信息。所以在前端就有了获取用户名的代码 var username = ‘{{ request.session.user_name }}’;通过for message in request.websocket: 以及request.websocket.send(message)来维持通道,否则通道就会关闭。下面的websocketMsg函数就是为了应对一个账号打开多个窗口的问题,保证信息都要发到位。
clients = {} # 字典,用来存储多个用户
@accept_websocket
def websocket(request, username):
    if request.is_websocket:
        lock = threading.RLock()  # 多线程锁
        try:
            lock.acquire()
            s = {}
            if clients.get(username) is not None:
                s[str(request.websocket)] = request.websocket
                clients[username].update(s)
            else:
                #  连接信息  键 连接名  值:连接保存
                s[str(request.websocket)] = request.websocket
                # 新增 用户  连接信息
                clients[username] = s
            glo.set_value("clients", clients)
            for message in request.websocket:
                if not message:
                    break
                else:
                    if message == b'undefined':
                        message = {
                            'time': time.strftime('%Y.%m.%d %H:%M:%S', time.localtime(time.time()))
                        }
                        request.websocket.send(json.dumps(message))
                    else:
                        request.websocket.send(message)
        finally:
            clients.get(username).pop(str(request.websocket))
            lock.release()
def websocketMsg(client, message):
    for cli in client:
        'client客户端 ,msg消息'
        client[cli].send(message)
第二个问题就是如何跨app,或者说跨不同的py文件,还能调用当前websocket进行信息发送呢?!我在一个单独的py文件中做了一个全局函数,进行变量的传递,那传递的就是当前的用户名以及维持websocket的session内容。那也就是为什么上面代码有 glo.set_value(“clients”, clients),就是为了通过下面代码的py文件进行session传递,也就是提到的clients传递。
global global_dict
global_dict = {}
def set_value(key, value):
    """ 定义一个全局变量 """
    global_dict[key] = value
def get_value(key, defValue=None):
    """ 获得一个全局变量,不存在则返回默认值 """
    try:
        return global_dict[key]
    except KeyError:
        return defValue
这样,在其他py文件想要通过websocket进行发送消息的时候,只需要把clients字典,也就是正在访问web服务的所有用户的session都传递过来,然后通过username进行请求,点对点的发给所请求的username。这样就完成了跨文件的消息传递。
clients = glo.get_value('clients')
username = request.session['user_name']
views.websocketMsg(clients[username], 'Log cleared')

