Django 通道和文件上传

Django channels and file uploads

我正在学习 Django,请多多包涵。我的目标是让用户能够上传文件,服务器脚本对其进行处理,并将每次迭代的结果实时发送给客户端。

我目前的结构是:用户上传一个文件(csv),这是通过views.py读取然后呈现空白html视图,html中的JS创建一个新的websocket ,这就是我无法在 consumers.py 之外传递数据或处理数据的地方。

我也不确定视图 > JS 脚本 > 消费者 > 的结构?是处理文件的最佳途径,但我没有找到太多关于文件上传和通道的文档。

views.py

from django.shortcuts import render
import pandas as pd

def someFunc(request):
    if request.method == "POST":
        global csvUpload
        csvUpload = pd.read_csv(request.FILES['filename'])
        return render(request, 'app/appPost.html')

我先在此处渲染视图,以便在脚本 运行ning 之前显示空白页面。

appPost.html JS脚本

var socket = new WebSocket('ws://localhost:8000/ws/app_ws/')
socket.onmessage = function(event){
    var data = JSON.parse(event.data);
    console.log(data);
            
    var para = document.createElement("P");
    para.innerText = data.message;
    document.body.appendChild(para);
}

consumers.py

from channels.generic.websocket import WebsocketConsumer
from asgiref.sync import async_to_sync

class WSConsumer(WebsocketConsumer):
def connect(self):
    self.accept()
    self.render()
    async_to_sync(self.add_group)('appDel_updates_group')

最后我想将这个警报文件中的内容传递给 websocket 连接。

app_alarm.py

from requests.api import request
import pandas as pd
import requests as r

def app_process(csvUpload):

    csvUpload=pd.read_csv(request.FILES['filename'])
    csvFile = pd.DataFrame(csvUpload)
    colUsernames = csvFile.usernames
    for user in colUsernames:
        req = r.get('https://reqres.in/api/users/2')
        t = req.json()
        data = t['data']['email']
        
    message = user + " " + data
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)(
        'appDel_updates_group',
        {'type': 'render', 'message': message}
    )

How do you do something after you render the view? (Django)

这似乎有点相关,我将了解如何创建一个线程来 运行 只有在视图中完成渲染后才处理文件。

编辑:线程允许我呈现页面,然后将数据传递给 alarm.py 文件进行处理。这已经通过将以下代码添加到 views.py:

中解决了我遇到的问题
x = threading.Thread(target=app_alarm.sub_process, args=[csvUpload])
x.setDaemon(False)
x.start()
return render(request, 'efax/appPost.html')

这允许视图使用 request.FILES 抓取文件并在呈现页面之前将其传递给脚本 而无需 等待处理完成。在这种情况下,这会使整个渠道变得毫无意义。希望这对某人有所帮助。

从原文复制post编辑:

线程允许我呈现页面,然后将数据传递给 alarm.py 文件进行处理。这已经通过将以下代码添加到 views.py:

中解决了我遇到的问题
x = threading.Thread(target=app_alarm.sub_process, args=[csvUpload])
x.setDaemon(False)
x.start()
return render(request, 'efax/appPost.html')

这允许视图使用 request.FILES 抓取文件并在页面呈现之前将其传递给脚本,而无需等待处理完成。在这种情况下,这会使整个渠道变得毫无意义。希望这对某人有所帮助。