当前位置: 首页 > 面试题库 >

如何通过“ manage.py shell”使用交互式解释器重新加载Django模型模块?

时同
2023-03-14
问题内容

我知道如何在常规Python解释器会话中重新加载常规Python模块。这个问题记录了如何做得很好:

如何卸载(重新加载)Python模块?

由于某种原因,我在Django的“ manage.py shell”解释器会话中很难做到这一点。要重现我的问题,请在此处启动基本的Django教程

编写第一个Django应用程序,第1部分

创建“ polls”应用程序和“ Poll”类后,通过“ manage.py shell”启动解释器,然后将“ polls”应用程序导入其中。

import polls.models as pm

创建一个新的“ Poll”对象:

p = pm.Poll()

到目前为止一切都很好。现在回到你的源代码并添加任何任意方法或属性。例如,我添加了:

def x(self):
    return 2+2

现在回到解释器并“重新加载”模块:

reload(pm)

现在尝试使用你的新方法或属性:

p1 = pm.Poll()
p1.x()

你会收到以下消息:

'Poll' object has no attribute 'x'

是什么赋予了?我还尝试过重新运行import命令,使用不同的语法导入模块,删除对任何“ Poll”对象或“ Poll”类的所有引用。我还使用IPython解释器和普通的Python(v2.6)解释器进行了尝试。似乎没有任何作用。

在常规的解释器会话中将相同的技术与任意Python模块配合使用非常有效。我似乎无法在Django的“ shell”会话中使用它。

顺便说一下,如果有什么不同,我将在Ubuntu 9.04机器上执行此操作。


问题答案:

好吧,我想我必须回答这个问题。问题在于Django将其模型缓存在称为AppCache的单例(类似于单例的结构)中。基本上,要重新加载Django模型,您需要首先重新加载并重新导入存储在AppCache中的所有模型模块。然后,您需要清除AppCache。这是它的代码:

import os
from django.db.models.loading import AppCache
cache = AppCache()

curdir = os.getcwd()

for app in cache.get_apps():
f = app.file
if f.startswith(curdir) and f.endswith(‘.pyc’):
os.remove(f)
import(app.name)
reload(app)

from django.utils.datastructures import SortedDict
cache.app_store = SortedDict()
cache.app_models = SortedDict()
cache.app_errors = {}
cache.handled = {}
cache.loaded = False
我将所有这些都放在Django站点根目录中的一个名为reloadmodels.py的单独文件中。使用IPython,我可以通过运行以下命令重新加载所有内容:

%run ~/mysite/reloadmodels.py



 类似资料:
  • 稳定性: 2 - 稳定的 repl 模块提供了一种 读取-求值-输出 循环(REPL)的实现,它可作为一个独立的程序或嵌入到其他应用中。 可以通过以下方式使用它: const repl = require('repl'); 设计与特性 repl 模块导出了 repl.REPLServer 类。 当 repl.REPLServer 实例运行时,它接收用户输入的每一行,根据用户定义的解释函数解释这些

  • 读取(Read)-运算(Eval)-输出(Print)-循环(Loop) (REPL) 是一个简单的, 交互式的计算机编程环境,它采用单个用户输入(即单个表达式),运算并返回结果给用户。 主进程 Electron 通过 --interactive 命令行参数将 Node.js repl 模块暴露出去。 假设你已将 electron 安装为本地项目依赖,则应能够使用下面的命令访问 REPL: ./n

  • Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。 Node 自带了交互式解释器,可以执行以下任务: 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。 执行 - 执行输入的数据结构 打印 - 输出结果

  • 问题内容: 我有一台运行时间较长的Python服务器,并且希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么? 问题答案: 你可以使用reload内置函数重新加载已导入的模块: 在Python 3中,已移至imp模块。在3.4中,不推荐使用importlib,而在中添加了。当定位到3或更高版本时,在调用reload或导入时参考相应的模块。 我认为这就是你想要的。诸如Django开发服务器

  • 问题内容: 我有一个运行时间较长的Python服务器,并且希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么? 问题答案: 您可以使用reload内置函数(仅适用于Python 3.4+)重新导入已导入的模块: 在Python 3中,已移至模块。在3.4中,imp不推荐使用,而reload在中添加了。当定位到3或更高版本时,在调用reload或导入时参考相应的模块。 我认为这就是您想要的

  • 主要内容:介绍,实现,Expression.java,TerminalExpression.java,OrExpression.java,AndExpression.java,InterpreterPatternDemo.java解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 介绍 意图:给定一个语言,定义它的文法表示,并定义一个解释