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文件的显示
标签:web,get,self,request,nacos,Django,content,config From: https://www.cnblogs.com/weiweirui/p/17589896.html