【问题标题】:How can I make my Django App *do* something when I run the server?当我运行服务器时,如何让我的 Django 应用程序*做*一些事情?
【发布时间】:2021-04-14 07:38:43
【问题描述】:

这里的第一个问题。 我是 Python 的初学者,对于我的最后一个项目,我正在 Django 中制作一个抓取应用程序。当我运行我的服务器时,我希望它启动一个BackgroundScheduler,它每 10 分钟调用一次我的抓取应用程序。现在我的调度程序在一个按钮上,但我不希望它在一个按钮上,我希望它在我运行服务器时正常工作,这可能吗?

我尝试过的:

  • 将我的逻辑写入 apps.py 然后将 appconfig 添加到设置 到 INSTALLED_APPS 但我得到:

ModuleNotFoundError:没有名为“finance_app.apps.FinanceAppConfig”的模块; “finance_app.apps”不是一个包

  • 在我的逻辑所在的地方创建一个 scheduler.py 文件并将其添加到 INSTALLED_APPS 但仍然无法正常工作

apps.py 及其逻辑

from apscheduler.schedulers.background import BackgroundScheduler
from django.apps import AppConfig

from finance_app.scraper import scrape


class FinanceAppConfig(AppConfig):
    name = 'finance_app'

    def ready(self):
        print('Initializing scheduler')
        scheduler = BackgroundScheduler()
        scheduler.add_job(scrape, 'interval', second=30)
        scheduler.start()

工作的 BackgroundScheduler:

        scheduler = BackgroundScheduler()
        scheduler.add_job(scrape, 'interval', second=30)
        scheduler.start()

我视图中调用刮板的调度器

def scraper_view(request):
    scrape()

    scheduler = BackgroundScheduler()
    scheduler.add_job(scrape, 'interval', minutes=10)
    scheduler.start()

    return redirect("../")

带有我想要删除的视图的按钮

<div style="text-align: center;"><h2 class="subtitlu">
    <a href="{% url 'scraper' %}">Scrape News</a>
</h2>
</div>

【问题讨论】:

  • 您可以使用 django celery 自动执行常规任务。参考 this 了解更多关于 celery 和任务调度的信息。
  • 我忘了说,我在 windows 上,而且 celery 与我所看到的 windows 不兼容。

标签: python django scheduler


【解决方案1】:

ModuleNotFoundError:没有名为“finance_app.apps.FinanceAppConfig”的模块

请查看发生错误的回溯。例如。

Traceback (most recent call last):
  ...
  File ".\app\urls.py", line 18, in <module>
    from app import something
ModuleNotFoundError: No module named 'app'

你可以把traceback放在这里。

如果将应用添加到 settings.py INSTALLED_APPS 后出现错误,则应检查添加方式。它应该只是'finance_app':

INSTALLED_APPS = [
    'finance_app',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

【讨论】:

  • 是的,它是这样添加的,只是finance_app,但apps.py内部的逻辑不会启动,我的应用程序运行正常,但这个计划是问题所在。
  • 如果遇到错误ModuleNotFoundError,则无法继续执行ready()函数中的代码。请问你能显示回溯吗?
  • 如果我只将 'finance_app' 放入设置中,我不会收到错误消息,我的应用程序可以工作,只有 apps.py 中的逻辑没有启动,ready() 中的代码没有开始..
  • 你使用哪个版本的 Python 和 Django?
【解决方案2】:

我终于想通了,我的爬虫文件中有 django_setup(),这就是为什么它不起作用的原因,也为将来的参考,在来自 apps.py 的 ready() 函数中,如果你有任何导入而不是 AppConfig ,将它们导入到您的 ready() 函数中,它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2012-06-18
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多