首页 > 解决方案 > 在 django 中使用 flash 文本

问题描述

我正在尝试在 django中使用Flash 文本。我认为KeyWordProcessor应该只调用一次。所以我在 settings.py 文件中定义它是这样的:

设置.py

KEYWORD_PROCESSOR = None

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

应用程序.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()

实用程序.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

标签: pythondjango

解决方案


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

加载后无法更改设置。所以试图做

settings.KEYWORD_PROCESSOR = KeywordProcessor()

不会工作。

仔细查看文档

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

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 对象的实例。


推荐阅读