Django应用安装脚本 - 如何将应用添加到INSTALLED_APPS设置中?

6 投票
2 回答
9838 浏览
提问于 2025-04-17 01:35

我写了一个Django应用,现在我想让它在多个服务器上部署变得简单。

基本的安装步骤是:

  1. 把应用文件夹复制到Django项目文件夹里
  2. settings.py文件的INSTALLED_APPS里添加这个应用
  3. 运行./manage.py collectstatic命令

这个应用不需要用到数据库,但如果需要的话,我会用south工具并运行./manage.py migrate,不过那是另一个话题。

我现在遇到的问题是第二步。我不想每次都手动编辑这个文件。有没有简单又可靠的方法来更新它呢?

我在想可以用inspect模块来找到这个变量,然后以某种方式把它添加进去,但我没有成功。inspect.getsourcelines找不到变量。

2 个回答

2

以下是我认为这样做不对的原因:

  • 这样会增加代码的复杂性,但其实并没有太大的必要。每次在设置中添加一行代码并不是很麻烦,尤其是如果你已经在做第1步和第3步的时候。
  • 这样会让你的项目使用了哪些应用变得不明确。当其他开发者来处理你的项目时,他们可能不知道你的应用已经安装了。
  • 你应该在代码版本管理系统中完成第1步和第2步,测试整个系统,然后再提交更改,最后再进行部署。

如果你在寻找这样的“优化”,那么我觉得你的开发/部署流程可能有些问题。我认为使用 INSTALLED_APPS 会更简单、更好。

如果你是在为公众使用构建一些东西,并且希望尽可能简单地添加模块,那这样做是不错的。在这种情况下,我建议将项目及其应用打包成 Python 蛋(python eggs),并利用入口点。这样你就可以像下面这样将应用部署到项目中:

pip install my-app-name

甚至不需要第1步和第3步!第1步会由 pip 完成,第2步和第3步会通过你项目中定义的设置钩子来完成。

Paste script 是一个很好的入口点使用示例:

# Install paste script:
pip install pastescript

# install django templates for pastescript:
pip install fez.djangoskel

# now paste script knows about fez.djangoskel because of entry-points

# start a new django project from fez's templates:
paste create -t django_buildout

这里是来自 fez.djangoskel 包的 setup.py 的一部分:

...
entry_points="""
[paste.paster_create_template]
django_buildout=fez.djangoskel.pastertemplates:DjangoBuildoutTemplate
django_app=fez.djangoskel.pastertemplates:DjangoAppTemplate
...

zc.buildout 是另一个很棒的工具,可以让你的部署变得更简单。Python 蛋与 buildout 的配合非常好。

3

你可以通过bash来修改你的settings.py文件。

#set $SETTINGS_FILE variable to full path of the your django project settings.py file
SETTINGS_FILE="/path/to/your/django/project/settings.py"
# checks that app $1 is in the django project settings file
is_app_in_django_settings() {
    # checking that django project settings file exists
    if [ ! -f $SETTINGS_FILE ]; then
        echo "Error: The django project settings file '$SETTINGS_FILE' does not exist"
        exit 1
    fi
    cat $SETTINGS_FILE | grep -Pzo "INSTALLED_APPS\s?=\s?\[[\s\w\.,']*$1[\s\w\.,']*\]\n?" > /dev/null 2>&1
    # now $?=0 if app is in settings file
    # $? not 0 otherwise
}

# adds app $1 to the django project settings
add_app2django_settings() {
    is_app_in_django_settings $1
    if [ $? -ne 0 ]; then
        echo "Info. The app '$1' is not in the django project settings file '$SETTINGS_FILE'. Adding."
        sed -i -e '1h;2,$H;$!d;g' -re "s/(INSTALLED_APPS\s?=\s?\[[\n '._a-zA-Z,]*)/\1    '$1',\n/g" $SETTINGS_FILE
        # checking that app $1 successfully added to django project settings file
        is_app_in_django_settings $1
        if [ $? -ne 0 ]; then
            echo "Error. Could not add the app '$1' to the django project settings file '$SETTINGS_FILE'. Add it manually, then run this script again."
            exit 1
        else
            echo "Info. The app '$1' was successfully added to the django settings file '$SETTINGS_FILE'."
        fi
    else
        echo "Info. The app '$1' is already in the django project settings file '$SETTINGS_FILE'"
    fi
}

使用:

add_app2django_settings "my_app"

撰写回答