如何将Django自定义命令中的值传递至视图?
解决Django自定义命令传值到视图的方案
方法1:使用环境变量(推荐)
这种方式简单可靠,适配开发与生产环境,因为启动的服务进程会继承当前环境变量,无需额外配置。
修改自定义命令文件(gda_start.py)
在启动服务前设置环境变量:
import os from django.core.management.base import BaseCommand from django.core.management import call_command class Command(BaseCommand): help = 'Starts the GDA app with API key for typesense search engine' def add_arguments(self, parser): parser.add_argument('api_key', type=str) def handle(self, *args, **options): try: # 将api_key存入环境变量 os.environ['TYPESENSE_API_KEY'] = options['api_key'] call_command("runserver", "0.0.0.0:8000") except Exception as e: self.stdout.write(self.style.ERROR('ERROR: ' + str(e)))
修改视图文件(views.py)
在视图中读取环境变量:
import os from django.views.decorators.csrf import csrf_protect from django.shortcuts import redirect @csrf_protect def parsing_triggered(request): frontendTracker = FrontendTracker() if request.method == "POST" and not frontendTracker.parsingStarted: # 获取API KEY api_key = os.environ.get('TYPESENSE_API_KEY') if api_key: # 在这里编写使用api_key的业务逻辑 pass return redirect("index")
方法2:使用全局模块变量
适合开发环境快速验证,需注意自动重载的影响。
第一步:创建全局变量模块
在GDA_datatables目录下新建globals.py:
# 用于存储API_KEY的全局变量 TYPESENSE_API_KEY = None
修改自定义命令文件(gda_start.py)
导入全局变量并赋值:
from django.core.management.base import BaseCommand from django.core.management import call_command from GDA_datatables.globals import TYPESENSE_API_KEY class Command(BaseCommand): help = 'Starts the GDA app with API key for typesense search engine' def add_arguments(self, parser): parser.add_argument('api_key', type=str) def handle(self, *args, **options): try: # 给全局变量赋值 global TYPESENSE_API_KEY TYPESENSE_API_KEY = options['api_key'] # 若开启自动重载,服务重启后变量会重置,建议添加noreload=True禁用重载 # call_command("runserver", "0.0.0.0:8000", noreload=True) call_command("runserver", "0.0.0.0:8000") except Exception as e: self.stdout.write(self.style.ERROR('ERROR: ' + str(e)))
修改视图文件(views.py)
导入全局变量使用:
from django.views.decorators.csrf import csrf_protect from django.shortcuts import redirect from GDA_datatables.globals import TYPESENSE_API_KEY @csrf_protect def parsing_triggered(request): frontendTracker = FrontendTracker() if request.method == "POST" and not frontendTracker.parsingStarted: # 获取API KEY api_key = TYPESENSE_API_KEY if api_key: # 在这里编写使用api_key的业务逻辑 pass return redirect("index")
方法3:动态修改Django配置
将API_KEY存入Django配置,视图直接从配置读取。
修改自定义命令文件(gda_start.py)
from django.core.management.base import BaseCommand from django.core.management import call_command from django.conf import settings class Command(BaseCommand): help = 'Starts the GDA app with API key for typesense search engine' def add_arguments(self, parser): parser.add_argument('api_key', type=str) def handle(self, *args, **options): try: # 动态添加配置项 setattr(settings, 'TYPESENSE_API_KEY', options['api_key']) call_command("runserver", "0.0.0.0:8000") except Exception as e: self.stdout.write(self.style.ERROR('ERROR: ' + str(e)))
修改视图文件(views.py)
from django.views.decorators.csrf import csrf_protect from django.shortcuts import redirect from django.conf import settings @csrf_protect def parsing_triggered(request): frontendTracker = FrontendTracker() if request.method == "POST" and not frontendTracker.parsingStarted: # 获取API KEY api_key = getattr(settings, 'TYPESENSE_API_KEY', None) if api_key: # 在这里编写使用api_key的业务逻辑 pass return redirect("index")
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

