gpt4 book ai didi

django - 在运行时在 Django 中修改 urlpatterns

转载 作者:行者123 更新时间:2023-12-04 19:15:45 24 4
gpt4 key购买 nike

我正在开发一个需要加载动态模块(在运行时)的 Django 应用程序。现在我可以上传(从客户端浏览器到服务器)“插件”并在数据库中注册插件模型等。但我需要一种方法来处理每个插件的 urlpatterns。目前,我已经在 webapp 的“核心”中编写了一个函数,该函数注册了一个模型,并且(理论上)通过包含它来将上传插件的 urlpatterns 添加到 webapp urls.py 中。这个功能是:

def register_plugin_model(model,codename):
# Standard syncdb expects models to be in reliable locations,
# so dynamic models need to bypass django.core.management.syncdb.
# On the plus side, this allows individual models to be installed
# without installing the entire project structure.
# On the other hand, this means that things like relationships and
# indexes will have to be handled manually.
# This installs only the basic table definition.

if model is not None:
style = color.no_style()
cursor = connection.cursor()
tables = connection.introspection.table_names()
seen_models = connection.introspection.installed_models(tables)
statements,trsh = connection.creation.sql_create_model(model, style, seen_models)
for sql in statements:
cursor.execute(sql)

# add urlpatterns
from django.conf.urls.defaults import patterns, url,include
from project.plugins.urls import urlpatterns
urlpatterns += patterns(url(r'^' + codename + '/' , include ( 'media.plugins.' + codename + '.urls' )))

插件以tgz格式上传到“media/tmp”,然后解压到“media/plugins/”,这里是插件的代号,用户上传的插件由“project.plugins”管理。

所有插件逻辑都可以正常工作,但是当我尝试将上传的插件 urls.py 文件包含到 webapp (project.plugins.urls) 中时,它不起作用。我已经打印了“project.plugins.urls.urlpatterns”的值,并且在“urlpatterns += pat....”之后没有修改。

有什么办法可以做我需要的吗?

最好的祝福

最佳答案

您面临的问题是 urlpatterns在您的项目中定义url.py文件和 urlpatterns在您的 register_plugin 中定义文件是不同的变量。它们是模块本地的。想象以下场景:

#math.py
pi = 3.14

#some_nasty_module.py
from math import pi
pi = 'for_teh_luls'

#your_module.py
from math import pi
pi * 2
>>> 'for_teh_lulsfor_teh_luls'
# wtf?

你显然不被允许这样做。您可能需要做的是询问原始 urls.py尝试在您的插件文件夹中发现 url。
# urls.py
urlpatterns += (...)

def load_plugin_urls():
for module in get_plugin_modules():
try:
from module.urls import urlpatterns as u
urlpatterns += u
except:
pass

不幸的是,网络服务器需要回收该代码才能运行的过程,因此插件的上传只有在这种情况发生后才会生效。

关于django - 在运行时在 Django 中修改 urlpatterns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9934573/

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