Python Django代码仅在开发和生产中执行

Python Django代码仅在开发和生产中执行,python,django,Python,Django,我需要执行一些内务管理代码,但只能在开发或生产环境中执行。不幸的是,所有管理命令的执行方式都与runserver类似。是否有任何干净的方法来分类什么是执行环境并有选择地运行代码 我在sys.argv中看到了一些类似“runserver”的解决方案 但它不适用于生产。而且看起来不太干净。 django是否提供了任何东西来对代码正在执行的所有这些不同场景进行分类 编辑 真正的问题是,一旦应用程序加载了一些经常访问的数据,我们就需要初始化本地缓存。一般来说,我想获取一些特定信息的数据库,并将其当前缓存

我需要执行一些内务管理代码,但只能在开发或生产环境中执行。不幸的是,所有管理命令的执行方式都与runserver类似。是否有任何干净的方法来分类什么是执行环境并有选择地运行代码

我在sys.argv中看到了一些类似“runserver”的解决方案 但它不适用于生产。而且看起来不太干净。 django是否提供了任何东西来对代码正在执行的所有这些不同场景进行分类

编辑

真正的问题是,一旦应用程序加载了一些经常访问的数据,我们就需要初始化本地缓存。一般来说,我想获取一些特定信息的数据库,并将其当前缓存在内存中。问题是,当它尝试获取数据库时,可能不会创建表,实际上可能根本不会创建迁移文件。所以,当我运行makemigrations/migrate时,它将运行试图从数据库中获取的代码,并抛出错误,表示表不存在。但是如果我不能运行makemigration/migrate,就不会有表,这是我试图避免的一种循环。这部分代码将针对所有管理命令运行,但我想将它的执行限制在应用程序实际服务请求时,即需要缓存时,而不是针对任何管理命令,包括用户定义的命令

```蟒蛇

from django.apps import AppConfig
from my_app.signals import app_created


class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        import my_app.signals
        # Code below should be executed only in actual app execution
        # And not in makemigration/migrate etc management commands
        app_created.send(sender=MyAppConfig, sent_by="MyApp")
```


Q发送应用程序创建的信号,用于应用程序执行,而不是由于makemigrations、migrate等管理命令而执行。有很多不同的方法可以做到这一点。但一般来说,当我创建一个生产服务器、临时服务器或开发服务器时,我会设置一个环境变量。并根据该环境变量动态决定要加载的设置文件

想象一下Django设置文件中的类似情况:

import os

ENVIRONMENT = os.environ.get('ENVIRONMENT', 'development')
然后你可以用

from django.conf import settings

if settings.ENVIRONMENT == 'production':
    # do something only on production

从那以后,我没有得到一个令人信服的答案,我设法找到了一个解决方案,尽管不是100%干净。我想我会分享我最终得到的解决方案

import sys
from django.conf import settings

if (settings.DEBUG and 'runserver' in sys.argv) or not settings.DEBUG:
     """your code to run only in development and production"""

其基本原理是,无论发生什么情况,如果代码未处于调试模式,则运行代码。但是,如果它处于调试模式,请检查进程执行的参数中是否包含runserver

由于这个问题目前写得有多宽泛,我不明白为什么对django的调试设置进行简单的条件检查不起作用。如果有任何这样的原因,我建议用更多信息更新问题。@FynnBecker为问题添加了一个编辑。看看它现在是否更有意义。当我用这种方法运行makemigrations时,它将有一个“开发”环境。我需要一些能够区分实际构建/运行命令和管理命令的东西。为了清晰起见,我更新了这个问题。看看它现在是否有更多信息供您回答。您必须在特殊缓存加载代码周围放置一个if语句。。。我有四个主要Django生产项目的经验,在“开发”中有一个完全迁移的数据库,可以使用该环境进行迁移和测试。“测试”环境是指不存在完全迁移的环境的环境。然后测试可能会根据需要运行迁移。