我应该在Django应用程序中使用芹菜/Redis吗?

2022-09-28 20:40:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django应用程序,它被设计为体育书籍或DFS站点的配套工具。我基本上是自学成才的,所以我一直在采用一种更为“随机应变”的方法,然后随着我学习更好的方法来创建应用程序,我会重新修改我的方法

我有几个CSV格式的数据表,这些数据是我用shell脚本导入数据库的。例如,一个表格用于首发阵容,另一个表格用于球员统计。然后,我在models.py中设置了一些方法,以获取导入的数据并将其转换为我想要使用的数据

我很快发现,试图调用一大组对象及其方法函数中的值根本没有效率。我通过这些方法获得所需的数据,因为很多数据都是基于多个表中的数据(例如,我可能希望从球员对象的起始阵容表中获得游戏的开始时间。)

我目前的解决方案是使用线程每隔几分钟运行一个函数来计算播放器对象的每个方法的结果,然后将其存储为变量中的字典列表,并将该变量导入相关视图(而不是将变量设置为对象本身)我敢肯定这是个坏主意。我还在学习

我听说过一些关于芹菜和Redis的事情,我认为它们可以用来做我正在做的事情(当然是正确的方式)。我走对了吗?如果是这样的话,您发现在使用芹菜/Redis时有什么有用的资源吗

谢谢你抽出时间来帮助我


Tags: 数据对象django方法函数redis应用程序时间事情表格芹菜书籍球员dfs阵容
1条回答
网友
1楼 ·

Redis和芹菜的优势在于,它们允许在后台运行任务,同时让您的Django应用程序继续运行

例如,假设我想创建1000个新的随机用户(这个主意不好,但这只是概念上的)。如果我正常运行,我的应用程序将不得不等待函数结束,然后再执行以下行,这意味着用户将不得不等待

但是芹菜呢

tasks.py

@shared_task
def create_random_user_accounts(total):
    for i in range(total):
        username = 'user_{}'.format(
            get_random_string(10, string.ascii_letters))
        email = "{}@example.com".format(username)
        password = get_random_string(50)
        User.objects.create_user(
            username=username, email=email, password=password)
    return "{} random users created with sucess!".format(total)

随机视图.py

class GenerateRandomUserView(FormView):
    template_name = 'generate_random_users.html'
    form_class = GenerateRandomUserForm

    def form_valid(self, form):
        total = form.cleaned_data.get('total')
        create_random_user_accounts.delay(total)
        messages.success(
            self.request, "We are generating your users! Wait a moment and refresh")
        return redirect('users_list')

在本例中,我的用户将被重定向到用户列表,在每次刷新时,他们将能够看到正在创建的新用户,而无需等待所有用户都被创建

TLDR: 在处理可能影响用户难处理性的计算方法时,我建议使用芹菜和redis

不过,您还需要两台服务器。一个运行redis,另一个运行芹菜,当然还有一个运行Django应用程序