有没有办法在 Django 应用程序 mod_wsgi 服务器启动期间传递选项值

Is there a way to pass options values during mod_wsgi server start up in Django app

我正在使用 mod_wsgi 到 运行 我的 Django 应用程序。由于有很多选项可以定义何时触发服务器 运行 命令,我试图创建某种 python 脚本来传递选项及其预设值。

例如:

而不是使用:

$python3 manage.py runmodwsgi --processes 3 --threads 1

我正在尝试使用 python 脚本并将其用作:

$python3 runme.py

其中 runme.py 是我试图用来启动服务器的脚本文件。

到目前为止我做了什么?

创建脚本文件:

import os
from django.core.management import execute_from_command_line

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<proj>.settings')
myargs = 'runmodwsgi'
list_of_args = ['', myargs]
execute_from_command_line(list_of_args)

正如预期的那样,服务器以预设选项启动,例如:

现在我想要实现的是某些选项的传递值,例如:

--processes 3 --threads 1

等等。

有什么方法可以传递预设值(因为我可以在我的脚本文件 runme.py 中定义),比如添加到参数列表:

list_of_args = ['', myargs, addl_args]

除了 python 站点上提供的帮助之外,我一直在检查发布的 SO 查询,但无法解决问题。

我尝试了以下方法,但不是很有用:

import os
import argparse # New import
from django.core.management import execute_from_command_line

# Addition of new code lines
parser = argparse.ArgumentParser()

group = parser.add_mutually_exclusive_group()
group.add_argument("-p", "--processes", action="store_true")
group.add_argument("-t", "--threads", action="store_true")
parser.add_argument("pint", type=int, help="no. of processes")
parser.add_argument("tint", type=int, help="no. of threads")

args = parser.parse_args()
# End of new code

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<proj>.settings')
myargs = 'runmodwsgi'

# At this line if I add ", args" (like shown below:])
list_of_args = ['', myargs, args] 
execute_from_command_line(list_of_args)

和运行命令,出现错误:

TypeError: 'Namespace' object does not support indexing

如果我只是 运行: python3 runme.py,我会得到以下错误:

usage: runme.py [-h] [-p | -t] pint tint
runme.py: error: the following arguments are required: pint, tint

然而,使用

python3 runme.py 3 1

启动服务器,但选项整数“3”和“1”没有任何效果(正如预期的进程和线程数)。

如果我使用:

python3 runme.py --processes 3 --threads 1

我收到以下错误:

usage: runme.py [-h] [-p | -t] pint tint
runme.py: error: argument -t/--threads: not allowed with argument -p/--processes

尝试使用单个参数,例如:

python3 runme.py --processes 3 1

服务器此时启动但选项value/s不受影响。

如何定义选项值并将这些选项的预设值传递给运行命令?

看起来你只是 misunderstanding/misusing argparse。

import os
import sys
import argparse

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<proj>.settings')
parser = argparse.ArgumentParser()
parser.add_argument("-p", "--processes", type=int, default=1)
parser.add_argument("-t", "--threads", type=int, default=1)
args = parser.parse_args()
from django.core.management import execute_from_command_line

command = [sys.argv[0], 'runmodwsgi', '--processes', str(args.processes), '--threads', str(args.threads)]
execute_from_command_line(command)

可能更接近你想要的;它将默认进程和线程都为 1。