如何使用Django shell与正在运行的服务器进行交互?

3
在我的一个应用程序的apps.py中,我为一些模型设置了一些类变量,这些变量无法在初始化时设置,因为它们依赖于其他应用程序和其中的模型。这很好地工作了,类变量被设置了,但是我想做的是测试这些类以查看它们是否按预期工作。我的问题是当我运行开发服务器时,类变量被设置,但我也想能够创建这些模型的新实例进行测试。我意识到可以通过构建与生产中的模型交互的前端来实现此目的,但对于简单的测试来说,这似乎过于复杂。

有没有办法在当前运行的服务器上使用Django的shell,或者我必须通过导入和运行通常由manage.py自行处理的所有内容来完成?

如果我写的不清楚,请看以下示例文件:

# example.models.py

from django.db.models import *

class ExampleModel(Model):
    class_var = None
    
    .
    .
    .


# apps.py

from django.apps import AppConfig


class ExampleConfig(AppConfig):
    name = 'example'

    def ready(self):
        from example.models import ExampleModel
        ExampleModel.class_var = 'something'
4个回答

1
当你运行python manage.py shell时,会发生与运行runserver相同的设置。特别地,将调用AppConfig中的所有ready方法。
因此,没有必要启动服务器来进行所需的测试。
你甚至可以测试这一点。只需添加print("This happens")并运行python manage.py shell。你应该会看到类似于以下内容:
(env)your-current-location % python manage.py shell
This happens       <---- Here you see it is printed 
Python 3.8.6 (default, Oct  8 2020, 14:06:32)
[Clang 12.0.0 (clang-1200.0.32.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

就算这样做,你可以同时打开一个 shell 并运行你的服务器。但是它们将是不同的进程,而在类上设置的变量将指向不同的对象。它们在代码层面上将是完全独立的。


是的,我不想同时处理两个网站实例。结果发现真正的错误其实是其他地方出了问题,但如果没有这个,我可能都没注意到,所以谢谢! - Benjamin Klybor
有没有可能在runserver中进行交互式会话?有时候我需要边测试边进行,能够在Python控制台中看到和操作创建的变量将是理想的。 - MarMar
找到一个答案:使用Pycharm调试器和运行配置,可以启动服务器,并且在浏览网站时能够交互式地测试Django变量。在这种情况下,设置适当的断点是必要的。https://dev59.com/WF4d5IYBdhLWcg3wB-uI#28256637 - MarMar

0

我在搜索关键字时找到了这里,于是我想添加一个答案。

如果读者有pycharm或另一个具有调试配置功能的IDE,那么与当前正在运行的django服务器进行交互的一种方法是创建一个配置文件,运行浏览器并在您希望测试/交互的变量处设置断点。

在pycharm中,我进入了:

  1. 在顶部菜单中选择Run
  2. 编辑配置(这应该会导致“运行/调试配置”菜单)
  • 您可以创建自己的配置文件或编辑django服务器运行文件
  1. 检查“运行浏览器”选项

这就是全部,我将Add Content Roots和Add Source Roots保持不变,并且它简单地工作了。我确实向环境变量中添加了django_settings_module=mysite.settings,但这可能并不必要。如果您看到有关未加载应用程序或模型的错误,则可能需要这样做。

参考:如何在PyCharm Community Edition中为Django项目运行Debug服务器?


0
根据你的服务器而定,但是是的,你可以在生产环境中运行Django shell。

0
终于弄明白了!
我之前的做法是在PyCharm中以调试模式运行服务器(`python manage.py runserver`),然后在另一个终端窗口中启动交互式shell(`python manage.py shell`),然后希望能从shell中运行命令时触发我的断点。由于目前只有这个项目的后端,所以无法从runserver进行测试。
但是根据@tim-mccurrach上面的答案: > 就像你说的,你可以同时打开一个shell和运行服务器。但是它们将是不同的进程,并且在类上设置的变量将指向不同的东西。在代码层面上,它们是完全独立的。
我理解这实际上就像启动了两个服务器一样...这就是为什么断点从未被触发的原因。而且我确认了即使服务器尚未启动,shell仍然可以正常工作。
相反,我所需要做的只是直接在shell中运行PyCharm调试器(`python manage.py shell`),然后一切都按预期工作!但要注意的是,调试器在每次错误后会退出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接