問題一:如何在Django服務開始時啟動定時任務
在Django中準備使用APscheduler,最開始在wsgi子產品裡面開始一個
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
讓Django在服務啟動的時候就能産生scheduler這個服務。。
可是後來在業務子產品已經寫好了要調用的定時的api和scheduler.start()後,沒有什麼反應。直到後來,在urls.py這個子產品裡面要導入業務子產品
才實作定時任務!
總結以往經驗來猜想一下:Django服務啟動第一步就是去加載wsgi這個子產品,之後就開始去加載urls這個子產品了。至于是否正确,隻能以後再去研究,官網上也沒有好好找!
——–分割線——–
好像urls.py子產品也不行。我是在Django1.8的環境下弄得。今天又重新跑到wsgi子產品去了
———分割線——
今天我在Mac試了下,使用python manage.py runserver這種指令居然在urls和wsgi都能實作。奇葩!
問題二:如何添加apscheduler的job到資料庫裡
最開始在配置的時候,我以為不能用msyql存儲任務,後來發現 jobstores 中的SQLAlchemyJobStore 就可以實作,不僅僅是mysql,sqlite3也是共用這一套,
而且在配置的時候要注意怎麼配(源碼裡面有詳情):
'default':SQLAlchemyJobStore(url='mysql://root:[email protected]:3306/djangomysql'
因為要用apscheduler,是以裝飾器肯定也要用:
找到兩個網站的例子:
https://segmentfault.com/a/1190000004238416
http://python.jobbole.com/82344/
沒有參數或者傳回值
def deco(func):
def _deco():
print 'before invoked'
func()
print 'after invoked'
return _deco
@deco
def f():
print 'f is invoked'
如果被裝飾的函數f帶參數且有傳回值
def deco(func):
def _deco(*args, **kwargs):
print 'before invoked'
ret = func(*args, **kwargs)
print 'after invoded'
return ret
return _deco
@deco
def f(a):
print 'f is invoked'
return a + 1
如果裝飾器帶有參數,需要多包一層,把參數調用包進去
def deco(*args):
def _deco(func):
def __deco(*args, **kwargs):
print 'decorator args is', args
print 'before invoked'
ret = func(*args, **kwargs)
print 'after invoded'
return ret
return __deco
return _deco
@deco('test')
def f(a):
print 'f is invoked'
return a + 1