为 settings.py 文件中的变量赋值

时间:2021-03-24 21:01:58

标签: python django

我正在尝试在 Django 中使用 flash text。我认为 KeyWordProcessor 应该只调用一次。所以我在 settings.py 文件中将它定义为:

settings.py

KEYWORD_PROCESSOR = None

然后我在应用程序启动时调用函数 KeywordProcessor(),如下所示:

apps.py

from django.apps import AppConfig

class MywebappConfig(AppConfig):
    name = 'mywebapp'

    def ready(self):
        import mywebapp.signals
        from flashtext import KeywordProcessor
        from django.conf import settings
        from mywebapp.utils import add_all_kewords_to_flash_text
        import threading

        settings.KEYWORD_PROCESSOR = KeywordProcessor()
        add_all_kewords_to_flash_text()

        t1 = threading.Thread(target=add_all_kewords_to_flash_text)
        t1.start()

utils.py

def add_keyword_to_flash_text(keyword_obj):

    if not settings.KEYWORD_PROCESSOR:
        raise ValueError("Flash text is None")

    added = settings.KEYWORD_PROCESSOR.add_keywords_from_dict(
        {keyword_obj.keyword: [keyword_obj.keyword]+keyword_obj.tags}
        )    


def add_all_kewords_to_flash_text():
    add_all_kewords = [add_keyword_to_flash_text(k) for k in KeyWord.objects.all()]

但我收到此错误:ValueError: Flash text is None

1 个答案:

答案 0 :(得分:2)

设置文件用于定义常量,您不应该尝试改变常量(即它是不可变的)。

您无法在加载后更改设置。所以努力做

settings.KEYWORD_PROCESSOR = KeywordProcessor()

不会工作。

仔细看看the documentation

您可能最好编写一个类来处理此问题,并在应用配置就绪方法中启动该类。

class MyKeywordProcessor:
    def __init__(self):
        self.keyword_processor = KeywordProcessor()

然后在应用配置中

class MywebappConfig(AppConfig):
    name = 'mywebapp'

    def ready(self):
        ...

        keyword_processor = MyKeywordProcessor()
        add_all_kewords_to_flash_text(keyword_processor)
        ...

如您所见,我已将关键字处理器传递给您的 add_all_kewords_to_flash_text 函数,该函数是 KeywordProcessor 对象的实例。

相关问题