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
抓取文件并在页面呈现之前将其传递给脚本,而无需等待处理完成。在这种情况下,这会使整个渠道变得毫无意义。希望这对某人有所帮助。
我正在学习 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
抓取文件并在页面呈现之前将其传递给脚本,而无需等待处理完成。在这种情况下,这会使整个渠道变得毫无意义。希望这对某人有所帮助。