我有一个Django应用程序,它被设计成体育博彩或DFS网站的配套工具。我在很大程度上是自学成才的,所以我一直在采用一种更";遵循有效的";方法,然后在学习创建应用程序的更好方法时重新修改我的方法。
我有几个CSV格式的数据表,我用shell脚本将它们导入到我的数据库中。例如,一张表用于首发阵容,另一张表则用于球员数据。然后,我在models.py中设置了一些方法,以获取导入的数据并将其转换为我想要使用的数据。
我很快发现,试图调用一大群对象及其方法函数中的值根本没有效率。我通过这些方法获得了我需要的数据,因为很多数据都是基于多个表中的数据(例如,我可能想要一个球员对象的首发阵容表中的比赛开始时间。(
我目前的解决方案是使用线程每隔几分钟运行一个函数,计算播放器对象的每个方法的结果,然后将其存储为变量中的字典列表,并在相关视图中导入该变量(而不是将变量设置为对象本身。(我相信有很多方法这是个坏主意。我还在学习。
我听说了一些关于Celery和Redis的事情,我认为这些可以用来做我正在做的事情(当然是正确的方式。(我走在正确的轨道上了吗?如果是的话,在使用Celery/Redis时,您发现有什么有用的资源吗?
谢谢你抽出时间来帮助我!
Redis和Celery的优势在于,它们允许在后台运行任务,同时允许您的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)
randomview.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,另一个运行celeni,当然还有一个运行Django应用程序