我正在尝试使用RQ创建后台作业:
def create
@course = Course.find_by id: params["registration"]["course_id"]
@registration = Registration.new registration_params.merge(email: stripe_params["stripeEmail"], card_token: stripe_params["stripeToken"])
raise "Please Check Registration Errors" unless @registration.valid?
@registration.process_payment
@registration.save
redirect_to @registration, notice: 'Registration was successfully created.'
rescue Exception => e
flash[:error] = e.message
@course = Course.find_by id: params["registration"]["course_id"]
render :new
end
我不断收到这个错误,似乎我在做一些愚蠢的事情?
import django_rq
def _send_password_reset_email_async(email):
print(email)
# Django admin action to send reset password emails
def send_password_reset_email(modeladmin, request, queryset):
for user in queryset:
django_rq.enqueue(_send_password_reset_email_async, user.email)
send_password_reset_email.short_description = 'Send password reset email'
'
答案 0 :(得分:4)
添加评论,因为我也遇到了这个错误:
Django dev webserver在您更改代码时动态重新加载,但rqworker进程没有。因此,如果您添加/修改任务&立即调用它,当新代码(您的Web代码)尝试调用旧代码(RQ任务)时,您可能会遇到此错误。
停止/重启rqworker,你没事。
答案 1 :(得分:1)
因此,您实际需要做的是将模块导入到某个文件中,然后对其执行延迟。 @MrE,因此不必将其导入 init .py文件
答案 2 :(得分:0)
如何将_send_password_reset_email_async
括在reset_email函数中 -
def send_password_reset_email(modeladmin, request, queryset):
def _send_password_reset_email_async(email):
print(email)
for user in queryset:
django_rq.enqueue(_send_password_reset_email_async, user.email)
send_password_reset_email.short_description = 'Send password reset email'
答案 3 :(得分:0)
在https://github.com/ui/django-rq/issues/125
中复制@richardbarran的评论更改代码时,Rqworker不会动态重新加载,但是 Django dev webserver如果你添加/修改任务& 立即调用它,你可能会遇到这个错误作为新代码(你的 网络代码)尝试调用旧代码(RQ任务)。
停止/重启rqworker,你没事。
答案 4 :(得分:0)
我遇到了类似的问题,并确保在应用的__init__.py
中导入模块解决了问题。
答案 5 :(得分:0)
尝试将您的函数写入另一个文件,将其作为模块导入
# in my_utility.py
def send_password_reset_email_async(email):
print(email)
然后
import django_rq
from my_utility import send_password_reset_email_async
#def _send_password_reset_email_async(email):
# print(email)
# Django admin action to send reset password emails
def send_password_reset_email(modeladmin, request, queryset):
for user in queryset:
django_rq.enqueue(send_password_reset_email_async, user.email)
send_password_reset_email.short_description = 'Send password reset email'
答案 6 :(得分:0)
就我而言,我没有将任务放在task.py文件中...
答案 7 :(得分:0)
当您从主目录或其他目录运行 rqworker 时会出现此问题。 在命令提示符中导航到您的 python 文件所在的目录,然后运行 rqworker 命令。
注意:注意你的 redis 服务器运行的端口,如果它不是默认的,即 6379,那么你将不得不在像这样运行 rqworker 时提及该端口, your_python_file_directory_path $ rqworker --url redis://localhost:port