我正在尝试在 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
答案 0 :(得分:2)
设置文件用于定义常量,您不应该尝试改变常量(即它是不可变的)。
您无法在加载后更改设置。所以努力做
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 对象的实例。