【问题标题】:Django channels and file uploadsDjango 频道和文件上传
【发布时间】: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


    【解决方案1】:

    从原始帖子编辑复制:

    线程允许我渲染页面,然后将数据传递给 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 获取文件并将其传递给脚本,而无需等待处理完成。在这种情况下,这将使整个渠道点变得毫无意义。希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-05-20
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2019-02-15
      • 2014-12-11
      • 1970-01-01
      相关资源
      最近更新 更多