gpt4 book ai didi

python - 动态调用方法(如果 Django 中存在)

转载 作者:行者123 更新时间:2023-11-30 23:54:29 24 4
gpt4 key购买 nike

我正在创建基于Django的网站(我知道它是纯Python,所以也许熟悉Python的人也可以回答),我需要动态调用一些方法。

例如,我的网站中几乎没有使用views.py 中的“do_search()”方法的应用程序(模块)。然后我有一个名为“search”的模块,我想要一个能够调用其他应用程序中所有现有“do_search()”的操作。当然我不喜欢将每个应用程序都添加到导入中,然后直接调用。我需要一些更好的方法来动态地执行此操作。

我可以从设置中读取 INSTALLED_APPS 变量,并以某种方式运行所有已安装的应用程序并查找特定方法?一段代码在这里会有很大帮助:)

提前致谢!伊格纳斯

最佳答案

我不确定我是否真正理解这个问题,但如果我不在,请在评论中澄清我的答案。

# search.py
searchables = []

def search(search_string):
return [s.do_search(search_string) for s in searchables]

def register_search_engine(searchable):
if hasattr(searchable, 'do_search'):
# you want to see if this is callable also
searchables.append(searchable)
else:
# raise some error perhaps


# views.py
def do_search(search_string):
# search somehow, and return result

# models.py

# you need to ensure this method runs before any attempt at searching can begin
# like in models.py if this app is within installed_apps. the reason being that
# this module may not have been imported before the call to search.
import search
from views import do_search
search.register_search_engine(do_search)

至于在哪里注册搜索引擎,django 的信号文档中有一些与此相关的有用文档。

You can put signal handling and registration code anywhere you like. However, you'll need to make sure that the module it's in gets imported early on so that the signal handling gets registered before any signals need to be sent. This makes your app's models.py a good place to put registration of signal handlers.

因此,您的 models.py 文件应该是注册搜索引擎的好地方。

我刚刚想到的替代答案:

在您的settings.py中,您可以有一个声明所有搜索功能的设置。就像这样:

# settings.py
SEARCH_ENGINES = ('app1.views.do_search', 'app2.views.do_search')

# search.py
from django.conf import settings
from django.utils import importlib

def search(search_string):
search_results = []
for engine in settings.SEARCH_ENGINES
i = engine.rfind('.')
module, attr = engine[:i], engine[i+1:]
mod = importlib.import_module(module)
do_search = getattr(mod, attr)
search_results.append(do_search(search_string))
return search_results

这与注册 MIDDLEWARE_CLASSES 和 TEMPLATE_CONTEXT_PROCESSORS 有点相似。上面都是未经测试的代码,但是如果您查看 django 源代码,您应该能够充实它并删除任何错误。

关于python - 动态调用方法(如果 Django 中存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5132134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com