前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django中实现动态读取配置参数

Django中实现动态读取配置参数

原创
作者头像
保持热爱奔赴山海
发布2024-02-26 21:51:11
1090
发布2024-02-26 21:51:11

django-environ这种方式在启动前比较适用,在django运行起来后,就无法修改配置了。

因此我们会考虑把一些后运行的代码的配置项写到动态配置里。

常见的有:

1、基于数据库的动态配置(例如MySQL等)

2、基于配置中心的动态配置(例如consul、nacos等)

下面的例子中,演示的是第一种,基于数据库的动态配置。

假设我们这个django项目的配置信息如下:

project为 demo, app为app01

app01/models.py 添加如下

代码语言:python
复制
from django.contrib.contenttypes.models import ContentType
from django.db import models

class Configuration(models.Model):
    key = models.CharField(max_length=255, null=False, unique=True, blank=False)
    value = models.CharField(max_length=255, null=False, blank=False)
    status = models.CharField(max_length=16, default="ON", null=False, blank=False)
    update_time = models.DateField(auto_now=True, null=True, blank=True)

    @classmethod
    def get(cls, key, status, default=None):
        try:
            configuration = cls.objects.get(key=key, status=status)
            return configuration.value
        except Configuration.DoesNotExist:
            return default

    @classmethod
    def set(cls, key, status, value):
        try:
            configuration = cls.objects.get(key=key, status=status)
            configuration.value = value
            configuration.save()
        except Configuration.DoesNotExist:
            configuration = cls(key=key, value=value, status=status)
            configuration.save()

    class Meta:
        db_table = "configuration"
        verbose_name = "动态配置表"
        verbose_name_plural = "动态配置表"

app01/views.py 添加如下

代码语言:python
复制
import json
from django.conf import settings
import demo.settings

# 基于数据库的动态参数配置DEMO
def test_dynamic_setting(request):
    # 只关注状态为ON的配置项,出现异常抛出错误,便于排查
    try:
        json.loads(Configuration.get("es_reader_rules", status="ON"))
    except Exception as e:
        print(str(e))
        return JsonResponse({"reason": "es_reader_rules 配置项格式错误"}, status=500)

    try:
        json.loads(Configuration.get("es_writer_rules", status="ON"))
    except Exception as e:
        print(str(e))
        return JsonResponse({"reason": "es_writer_rules 配置项格式错误"}, status=500)

    return JsonResponse(
        {
            "code": 0,
            "msg": "test",
            "es_reader_rules": json.loads(
                Configuration.get("es_reader_rules", status="ON")
            ),
            "es_writer_rules": json.loads(
                Configuration.get("es_writer_rules", status="ON")
            ),
        }
    )

app01/urls.py 添加如下:

代码语言:javascript
复制
urlpatterns = [
    re_path(
        "test_dynamic_setting",
        views.test_dynamic_setting,
        name="test_dynamic_setting",
    ),
    # 下面其它的原先内容省略
    ]

demo/urls.py 添加如下:

代码语言:python
复制
urlpatterns = [
    path("app01/", include("app01.urls")),
    # 下面其它的原先内容省略
]

将表结构应用到数据库,并启动django程序

代码语言:python
复制
python.exe manage.py makemigrations app01
python.exe manage.py migrate
python.exe manage.py runserver

访问 http://127.0.0.1:8000/app01/test_dynamic_setting

未配置或者错误配置规则示例
未配置或者错误配置规则示例

然后在数据库插入2条测试数据:

代码语言:sql
复制
INSERT INTO configuration 
( `key`, `value`,`status`,`update_user`,`update_time` ) 
VALUES 
( 'es_reader_rules', '{"index_1":"es01:index_1","index_2":"es01:index_22"}','ON','SYSTEM',now() );

INSERT INTO configuration 
( `key`, `value`,`status`,`update_user` ,`update_time` ) 
VALUES 
( 'es_writer_rules', '{"index_1":"es01:index_new_1","index_2":"es02:index_2"}','ON', 'SYSTEM',now()  );

再次访问 http://127.0.0.1:8000/app01/test_dynamic_setting

可以看到结果正确加载出来了

正确配置的示例
正确配置的示例

更深入的用法,待实践。

参考 https://geek-docs.com/django/django-questions/86_django_dynamic_settingspy.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档