RQ属性错误:'模块'对象没有属性

时间:2015-09-23 07:52:57

标签: python django python-rq django-rq

我正在尝试使用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'

'

8 个答案:

答案 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