【发布时间】:2022-01-18 17:17:23
【问题描述】:
我正在快速学习 Django,所以请耐心等待。我的目标是让用户能够上传文件,服务器脚本处理它并将每次迭代的结果实时发送到客户端。
我当前的结构是:用户上传一个文件(csv),这是通过views.py读取的,然后呈现空白的html视图,html中的JS创建一个新的websocket,这就是我无法做到的地方在 consumer.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')
我先在这里渲染视图,以便在脚本运行之前显示空白页。
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 获取文件,并在页面呈现之前将其传递给脚本 无需等待处理完成。在这种情况下,这将使整个渠道点变得毫无意义。希望这对某人有所帮助。
【问题讨论】:
标签: python django django-channels django-file-upload