django 同时运行两个视图

inkz8wg9  于 2022-12-01  发布在  Go
关注(0)|答案(2)|浏览(172)

所以正如标题所说,我试图同时运行两个视图。或者至少,这是我认为我必须做的。我有一个系统,让用户喜欢模型,如果模型喜欢计数大于3,视图应该被重定向到一个发送电子邮件消息到客户端的视图。我不想把电子邮件消息代码在同一个视图作为“喜欢”视图,因为喜欢的工作原理与Facebook上的喜欢按钮相同:它必须快速的回应给用户。2同时我希望like_exam视图在任何情况下都能完成,无论计数器是否小于3。3所以我现在有:

def like_exam(request, letnik_id, classes_id, subject_id):
    exam_id = request.GET.get('exam')
    exam = get_object_or_404(Exam, id=exam_id)
    counter = exam.exam_likes.count()
    user = request.user
    if user in exam.exam_likes.all():
        exam.exam_likes.remove(user)
        return JsonResponse({"like": "unliked"})
    else:
        exam.exam_likes.add(user)
        if counter < 3:
           html = likes_email(exam)
           return HttpResponse(html)
        # i want the json to be posted in any case:
       return JsonResponse({"like": "liked"})

def likes_email(exam):
   ....sends email...
y3bcpkx1

y3bcpkx11#

没有办法同时运行两个视图,而且这也不是你想要做的,因为“likes_email”函数不会向用户返回响应,而响应是视图契约的一部分。
运行耗时的操作的模式是将它们分散到一个单独的进程中,通常有一个任务队列。在Django中管理这些操作的最好方法是使用Celery

ewm0tg9j

ewm0tg9j2#

我不知道下面是你想要的使用线程

# "views.py"

import time
from threading import Thread
from django.http import HttpResponse

def test1():
    for _ in range(3):
        print("Test1")
        time.sleep(1)
    
def test2():
    for _ in range(3):
        print("Test2")
        time.sleep(1)

def test(request):
    thread1 = Thread(target=test1)
    thread2 = Thread(target=test2)
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()

    return HttpResponse("Test")

控制台上的结果如下:

Test1
Test2
Test1
Test2
Test1
Test2

同样,我不知道下面的内容是否是您希望使用**asyncio**获得的内容:

import asyncio
from django.http import HttpResponse

async def test1():
    for _ in range(3):
        print("Test1")
        await asyncio.sleep(1)

async def test2():
    for _ in range(3):
        print("Test2")
        await asyncio.sleep(1)

async def call_tests(request):
    loop = asyncio.get_running_loop()
    loop.create_task(test1())
    await loop.create_task(test2())

    return HttpResponse("Test")

控制台上的结果如下:

Test1
Test2
Test1
Test2
Test1
Test2

相关问题