python - 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
但是当我删除调度程序行时,应用程序运行正常。
解决方案
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))
推荐阅读
- c++ - 结构化绑定声明示例中的 if-with-initializer 格式不正确?
- python-3.x - Python:测试哥德巴赫猜想的第 10000 个数字的代码
- laravel - 如何在 Laravel 中验证这个数组?
- sql - SQL Server 间隔和 ::
- kubernetes - 在一个部署中挂载两个持久卷声明会导致错误
- php - 在 laravel 中使用 sendmail 驱动程序成功发送邮件但未收到邮件
- java - Spring Cloud git配置——将存储库放在直接包含类路径的文件夹中?
- mysql - PhpMyAdmin 触发器未创建错误:1064
- spring - 如何使用 th:each 将对象绑定到表单 (th:object) 以获取带有 Thymleaf 的对象列表
- android - 如何从 WebVR/A-Frame 在 YoutubeVR 应用程序中打开 360 度 Youtube 视频