Есть ли способ передать значения опций во время запуска сервера mod_wsgi в приложении Django
Я использую 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]
Я проверил SO запросы, размещенные в дополнение к помощи, доступной на сайте python, но не смог разобраться с проблемой.
Я попробовал следующее, что, однако, не очень помогло:
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
Сервер запускается в это время, но на значение опций/ов это не влияет.
Как определить значения опций и передать эти заданные значения опций команде run?
Похоже, что вы просто неправильно понимаете/неправильно используете 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.
