Django web框架实现修改【单个】nacos配置

发布时间 2023-07-29 15:30:16作者: 九尾cat

Django web框架实现修改【单个】nacos配置

基于上一个博客的Django 的项目环境继续添加一些高级的功能——修改nacos配置。

简单回顾一下,上面添加的功能: 博客网站文章上传、发布,redis key删除接口。

1. 首先安装Python Nacos客户端库

pip install nacos-sdk-python

 

2. 创建nacos_settings.py文件

在Django项目中创建一个nacos_settings.py文件,用于获取和修改Nacos配置。

这个类使用NacosClient连接到指定的Nacos服务器和命名空间,并提供了获取和修改配置信息的方法。

### ### mysite/myweb1/nacos_settings.py

NACOS_SERVERS = '172.17.48.10:8848'  # Nacos服务器地址
NAMESPACE = '7b2a25ba-66dc-4317-9204-52d9aefdb252'  # 命名空间
DATA_ID = 'nacos.yaml'  # 配置文件ID
GROUP = 'DEFAULT_GROUP'  # 配置文件所属分组


# 获取和修改Nacos配置。
# 这个类使用NacosClient连接到指定的Nacos服务器和命名空间,并提供了获取和修改配置信息的方法
from nacos import NacosClient

class NacosConfig:
    def __init__(self, server_addr, namespace, data_id, group):
        self.server_addr = server_addr
        self.namespace = namespace
        self.data_id = data_id
        self.group = group
        self.client = NacosClient(server_addresses=self.server_addr, namespace=self.namespace)

    def get_config(self):
        return self.client.get_config(self.data_id, self.group)

    def set_config(self, content):
        return self.client.publish_config(self.data_id, self.group, content)

 

3. 视图配置nacos配置

在Django视图中使用NacosConfig类获取和修改配置信息。

创建了两个视图函数,一个用于获取配置信息,一个用于修改配置信息。在这两个函数中,我们都使用了NacosConfig类来获取和修改配置信息。注意,为了方便测试和演示,这里使用了csrf_exempt装饰器来关闭Django的CSRF保护,请在实际项目中遵循Django的安全规范.

模板文件包含一个表单,用于提交修改后的配置信息。在Django视图中使用NacosConfig类获取和修改配置信息,并渲染set_config.html模板。

视图函数包含两个分支:如果请求方法是POST,则获取提交的content参数并使用NacosConfig类修改配置信息;否则,渲染set_config.html模板以显示表单。注意,为了方便测试和演示,这里使用了csrf_exempt装饰器来关闭Django的CSRF保护,请在实际项目中遵循Django的安全规范。

视图函数包含一个if语句,用于判断请求的方法是否为POST。如果是POST请求,就从请求参数中获取配置信息并调用NacosConfig类的set_config方法来修改配置信息,并返回修改结果。如果不是POST请求,就渲染set_config.html模板。在模板中,用户可以输入要修改的配置信息并提交表单。

### ### mysite/myweb1/views.py

# Create your views here.

import redis


def delete_redis_key(request):
    # 连接 Redis
    r = redis.Redis(host='172.31.0.8', port=6379, db=0, password='Common1qaz@WSX2020')

    id = request.GET.get('id')
    print(id)

    # 获取要删除的 Redis key
    key = request.GET.get('key', '')

    # 删除 Redis key
    r.delete(key)

    # # 获取所有符合条件的 key
    # # keys = r.keys('prefix:*') #prefix:* 表示需要删除的 key 的前缀
    # keys = r.keys('my_key*')  # 匹配所有my_key*的key,my_key* 表示需要删除的 key 的前缀
    #
    # # 批量删除 key
    # if keys:
    #     r.delete(*keys)

    # 返回结果页面,渲染模版文件
    context = {'deleted': True}
    return render(request, 'result.html', context)

# 使用NacosConfig类获取和修改配置信息
from myweb1.nacos_settings import NACOS_SERVERS, NAMESPACE, DATA_ID, GROUP
from django.http import HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from myweb1.nacos_settings import NacosConfig
import yaml

nacos_config = NacosConfig(server_addr=NACOS_SERVERS, namespace=NAMESPACE, data_id=DATA_ID, group=GROUP)

@csrf_exempt
def get_config(request):
    #显示配置文件
    content = nacos_config.get_config()
    return HttpResponse(content)

@csrf_exempt
def set_config(request):
    if request.method == 'POST':
        content = request.POST.get('content')
        if content is None or content.strip() == '':
            return HttpResponse('Error: content is empty')
        print('Received content:', content)  # 输出日志信息
        config = yaml.safe_load(nacos_config.get_config())
        config['SECRET_KEY'] = content
        success = nacos_config.set_config(yaml.dump(config))
        return HttpResponse(success)
    else:
        return render(request, 'set_config.html')

 

ⅰ. Json格式转换

只想将SECRET_KEY的值从mysecretkey修改为mynewsecretkey,您可以在视图中先获取当前的配置,然后将其解析为Python对象,并将其更新为新的值,最后将更新后的配置重新写入Nacos。

首先使用json.loads将当前配置解析为Python对象,然后更新该对象中的SECRET_KEY值为mynewsecretkey。最后,我们使用json.dumps将更新后的配置对象转换为JSON字符串,并将其传递给NacosConfig类的set_config方法。

这样,只有SECRET_KEY的值被更新为新值,而其他配置项保持不变。

@csrf_exempt
def set_config(request):
    if request.method == 'POST':
        content = request.POST.get('content')
        config = json.loads(nacos_config.get_config())
        config['SECRET_KEY'] = 'mynewsecretkey'
        success = nacos_config.set_config(json.dumps(config))
        return HttpResponse(success)

 

ⅱ. Yaml格式转换【本文使用】

Nacos配置是使用YAML格式编写的,您可以使用Python的PyYAML库来解析和序列化YAML数据。

使用yaml.safe_load将当前配置解析为Python对象,然后更新该对象中的SECRET_KEY值为mynewsecretkey。最后,我们使用yaml.dump将更新后的配置对象转换为YAML字符串,并将其传递给NacosConfig类的set_config方法。

 

这样,只有SECRET_KEY的值被更新为新值,而其他配置项保持不变。

### ### myproject/myapp/nacos_settings.py
import yaml
from nacos import NacosClient

class NacosConfig:
    def __init__(self, server_addr, namespace, data_id, group):
        self.server_addr = server_addr
        self.namespace = namespace
        self.data_id = data_id
        self.group = group
        self.client = NacosClient(server_addresses=self.server_addr, namespace=self.namespace)

    def get_config(self):
        return self.client.get_config(self.data_id, self.group)

    def set_config(self, content):
        return self.client.publish_config(self.data_id, self.group, content)

nacos_config = NacosConfig(server_addr='localhost:8848', namespace='public', data_id='example', group='DEFAULT_GROUP')

@csrf_exempt
def set_config(request):
    if request.method == 'POST':
        content = request.POST.get('content')
        config = yaml.safe_load(nacos_config.get_config())
        config['SECRET_KEY'] = 'mynewsecretkey'
        success = nacos_config.set_config(yaml.dump(config))
        return HttpResponse(success)

----------------------------------------------------
### ### 本文拆成两部分定义类  myproject/myapp/nacos_settings.py
from nacos import NacosClient

class NacosConfig:
    def __init__(self, server_addr, namespace, data_id, group):
        self.server_addr = server_addr
        self.namespace = namespace
        self.data_id = data_id
        self.group = group
        self.client = NacosClient(server_addresses=self.server_addr, namespace=self.namespace)

    def get_config(self):
        return self.client.get_config(self.data_id, self.group)

    def set_config(self, content):
        return self.client.publish_config(self.data_id, self.group, content)

### ### 定义视图 myproject/myapp/views.py

# 使用NacosConfig类获取和修改配置信息。
from myapp.nacos_settings import NACOS_SERVERS, NAMESPACE, DATA_ID, GROUP
from django.http import HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from myapp.nacos_settings import NacosConfig
import yaml

nacos_config = NacosConfig(server_addr=NACOS_SERVERS, namespace=NAMESPACE, data_id=DATA_ID, group=GROUP)

@csrf_exempt
def get_config(request):
    content = nacos_config.get_config()
    return HttpResponse(content)

@csrf_exempt
def set_config(request):
    if request.method == 'POST':
        content = request.POST.get('content')
        config = yaml.safe_load(nacos_config.get_config())
        config['SECRET_KEY'] = content
        success = nacos_config.set_config(yaml.dump(config))
        return HttpResponse(success)
    else:
        return render(request, 'set_config.html')

 

ⅲ. 修改返回内容为html

@csrf_exempt
def get_config(request):
    # content = nacos_config.get_config()
    # return HttpResponse(content)

    # 显示在当前页面,不下载
    context = {'config': yaml.dump(nacos_config.get_config())}
    return render(request, 'config_success.html', context)

 

a. 创建视图模版表单

在Django项目中创建一个名为templates/set_config.html的模板文件,用于显示修改配置信息的表单。

ⅰ. set_config.html

### ### myproject/myapp/templates/set_config.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Set Config</title>
</head>
<body>
    <h1>Set Config</h1>
    <form method="post">
        {% csrf_token %}
        <label for="content">input SECRET_KEY value:</label>
        <input type="text" name="content" id="content">
        <br><br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

  

ⅱ. config_success.html

### ### mysite/myweb1/templates/config_success.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>配置已保存</title>
</head>
<body>
    <h1>配置已保存</h1>
    <p>配置已成功保存到Nacos中</p>
    <h2>更新后的配置</h2>
</body>
</html>

4. 配置访问路由

### ### mysite/myweb1/urls.py

urlpatterns = [
    path('delete/', views.delete_redis_key, name='delete_redis_key'),
    # path('contact/', views.contact, name='contact'),
    path('get_config/', views.get_config, name='get_config'),
    path('set_config/', views.set_config, name='set_config'),
]

5. 运行

 python manage.py  runserver 0.0.0.0:8080 

 

6. 访问

a. 获取查看配置

浏览器中访问http://localhost:8080/myweb1/get_config/来获取当前的配置信息

 

b. 修改配置

在浏览器中访问http://localhost:808 0/set_config/并提交一个名为content的POST参数来修改配置信息

 

 

 验证修改的配置

 

 

7. html 显示nacos配置为yaml格式

图片可以查看到相关修改的配置,但是不够直接规范显示稍乱,这边修改显示输出的格式为yaml格式。

a. 修改视图view.py

添加修改myweb1视图文件,逻辑的目的是将Nacos中的配置内容转换为YAML格式的字符串,并在网页中显示。

定义get_config函数首先使用nacos_config.get_config()获取Nacos中的配置内容。然后,它检查content是否为字节类型,如果是,则将其转换为字符串类型。接下来,它使用yaml.load函数将字符串内容解析为字典类型。最后,它使用yaml.dump函数将字典类型的内容转换回YAML格式的字符串,并将其传递给模板进行渲染。

# Create your views here.

import redis


def delete_redis_key(request):
    # 连接 Redis
    r = redis.Redis(host='172.31.0.8', port=6379, db=0, password='Common1qaz@WSX2020')

    id = request.GET.get('id')
    print(id)

    # 获取要删除的 Redis key
    key = request.GET.get('key', '')

    # 删除 Redis key
    r.delete(key)

    # # 获取所有符合条件的 key
    # # keys = r.keys('prefix:*') #prefix:* 表示需要删除的 key 的前缀
    # keys = r.keys('my_key*')  # 匹配所有my_key*的key,my_key* 表示需要删除的 key 的前缀
    #
    # # 批量删除 key
    # if keys:
    #     r.delete(*keys)

    # 返回结果页面,渲染模版文件
    context = {'deleted': True}
    return render(request, 'result.html', context)

# 使用NacosConfig类获取和修改配置信息
from myweb1.nacos_settings import NACOS_SERVERS, NAMESPACE, DATA_ID, GROUP
from django.http import HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from myweb1.nacos_settings import NacosConfig
import yaml

nacos_config = NacosConfig(server_addr=NACOS_SERVERS, namespace=NAMESPACE, data_id=DATA_ID, group=GROUP)

@csrf_exempt
def get_config(request):
    # #显示配置文件
    # content = nacos_config.get_config()
    # return HttpResponse(content)

    # yaml格式的显示配置文件
    content = nacos_config.get_config()
    if isinstance(content, bytes):
        str_content = content.decode()
    else:
        str_content = content
    dict_content = yaml.load(str_content, Loader=yaml.FullLoader)
    yaml_content = yaml.dump(dict_content)
    return render(request, 'config.html', {'yaml_content': yaml_content})

@csrf_exempt
def set_config(request):
    if request.method == 'POST':
        content = request.POST.get('content')
        if content is None or content.strip() == '':
            return HttpResponse('Error: content is empty')
        print('Received content:', content)  # 输出日志信息
        config = yaml.safe_load(nacos_config.get_config())
        config['SECRET_KEY'] = content
        success = nacos_config.set_config(yaml.dump(config))
        return HttpResponse(success)
    else:
        return render(request, 'set_config.html')

b. 访问验证

http://localhost:8080/myweb1/get_config/ ,修改相关的配置也可以实现动态yaml文件的显示