首页 > 解决方案 > TypeError:当我在django的views.py文件中导入调度程序时,第一个参数必须是可调用的?

问题描述

我正在使用 Django 1.11。我想在我的应用程序中使用调度程序每天运行一次我的脚本。

这是我的 view.py 文件

from __future__ import print_function
from django.shortcuts import render
from django.utils import timezone
from django.http import HttpResponse
from datetime import datetime, timedelta
import requests
import schedule
import time


def republic(request):
    return HttpResponse("<h1>Success Hindustan</h1>")


def indiatv(request):
    return HttpResponse("<h1>Success Hindustan</h1>")

def ndtv(request):
    return HttpResponse("<h1>Success NDTV</h1>")


schedule.every().day.at("17:19").do(republic(requests))
schedule.every().day.at("17:19").do(indiatv(requests))
schedule.every().day.at("17:19").do(ndtv(requests))

while 1:
    schedule.run_pending()
    time.sleep(1)

当我运行服务器时,出现以下错误

 File "/home/imsaiful/PiroProject/pironews/feed/urls.py", line 2, in <module>
    from . import views
  File "/home/imsaiful/PiroProject/pironews/feed/views.py", line 230, in <module>
    schedule.every().day.at("17:19").do(republic(requests))
  File "/home/imsaiful/anaconda3/lib/python3.6/site-packages/schedule/__init__.py", line 385, in do
    self.job_func = functools.partial(job_func, *args, **kwargs)
TypeError: the first argument must be callable

但是当我删除调度程序行时,应用程序运行正常。

标签: pythondjangopython-3.xdjango-views

解决方案


Republic(requests) 将返回 HttpResponse,

所以执行将是

schedule.every().day.at("17:19").do(HttpResponse)

do方法内部你应该提到函数,而不是类实例。您可以使用以下之一

解决方案1:

schedule.every().day.at("17:19").do(lambda: republic(requests))

解决方案2。

schedule.every().day.at("17:19").do(republic, requests)

解决方案3。

import functools
schedule.every().day.at("17:19").do(functools.partial(republic, requests))

推荐阅读