美文网首页
django-apscheduler执行定时任务

django-apscheduler执行定时任务

作者: TTTRX | 来源:发表于2019-08-01 11:28 被阅读0次

    提出问题

    我想使用django-apscheduler实现定时爬取数据并存储到数据库中,代码如下:

    from apscheduler.schedulers.background import BackgroundScheduler
    from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
    # 实例化调度器
    scheduler = BackgroundScheduler()
    # 调度器使用默认的DjangoJobStore()
    scheduler.add_jobstore(DjangoJobStore(), 'default')
    
    # 每隔半个小时执行这个任务
    @register_job(scheduler, 'interval', id='saveOfficialPriceToSql', minutes=5)
    def saveOfficialPriceToSql(request):
        print("现在时间是:",timezone.now())
        #userName = request.session.get('user_name', None)
        # 一共有ShoesId,size,date,price四个字段要存储
        # 读取相应用户所需要爬取的商品id
        userName="fgx"
        shoes=Shoes.objects.all()
        print(type(shoes))
        for shoe in shoes:
            id=shoe.ShoesId
            result=getOfficial.getSizePrice(id)
            sizes=result["sizes"]
            price=result["price"]
            for i in range(len(sizes)):
                officialSoldPrice.objects.create(ShoesId=id,size=sizes[i],date=timezone.now(),price=price[i])
        # return render(request,"home.html")
    
    # 注册定时任务并开始
    register_events(scheduler)
    scheduler.start()
    

    然后报出如下错误:

    django.core.exceptions.ImproperlyConfigured: The included URLconf 'get.urls' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import.

    错误在于这个函数的参数saveOfficialPriceToSql(request),下面详解一下request参数:

    request参数详解

    django的urls函数格式是这样的:url(r^/account/$', views.index, name=index),它可以接收四个参数,分别是两个必选参数:regex、view和两个可选参数:kwargs、name。
    regex代表一个正则表达式,不再细说。
    Django匹配正则表达式成功后,就会找到相应的视图函数,Django始终用HttpRequest对象作为第一个参数传递给视图函数,也就我们这里用来承接的request。

    错误原因说明

    django在匹配正则表达式成功后,会发送HttpRequest对象。但是我们这里想要的是做一个定时任务,其在运行服务器python manage.py runserver时就已经在开始执行该函数了,没有urls也就没有HttpRequest对象,所以我们根本不需要参数。

    正确做法

    from apscheduler.schedulers.background import BackgroundScheduler
    from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
    # 实例化调度器
    scheduler = BackgroundScheduler()
    # 调度器使用默认的DjangoJobStore()
    scheduler.add_jobstore(DjangoJobStore(), 'default')
    
    # 每隔半个小时执行这个任务
    @register_job(scheduler, 'interval', id='saveOfficialPriceToSql', minutes=5)
    def saveOfficialPriceToSql():
        print("现在时间是:",timezone.now())
        #userName = request.session.get('user_name', None)
        # 一共有ShoesId,size,date,price四个字段要存储
        # 读取相应用户所需要爬取的商品id
        userName="fgx"
        shoes=Shoes.objects.all()
        print(type(shoes))
        for shoe in shoes:
            id=shoe.ShoesId
            result=getOfficial.getSizePrice(id)
            sizes=result["sizes"]
            price=result["price"]
            for i in range(len(sizes)):
                officialSoldPrice.objects.create(ShoesId=id,size=sizes[i],date=timezone.now(),price=price[i])
        # return render(request,"home.html")
    
    # 注册定时任务并开始
    register_events(scheduler)
    scheduler.start()
    

    参考链接

    Django中使用django-apscheduler执行定时任务
    Django url()函数详解

    支付宝红包码,你领红包我赚赏金;土豪请任意收钱码打赏

    相关文章

      网友评论

          本文标题:django-apscheduler执行定时任务

          本文链接:https://www.haomeiwen.com/subject/optxdctx.html