提出问题

我想使用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()

参考链接

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