首页 > 其他分享 >Django web框架实现修改【单个】nacos配置

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

时间:2023-07-29 15:33:57浏览次数:35  
标签:web get self request nacos Django content config

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

相关文章

  • ASP.NET Core WebAPI如何获得远程文件返回文件流给前端?
     一、根据网络路径把文件保存成byte[]返回给前端项目采用的是前后端分离的模式,后端使用ASP.NETCoreWebAPI方式,将文件流返回给前端。///<summary>///根据网络路径把文件保存成byte[]///</summary>///<paramname="filePath"></param>publicbyte[]UrlToByte(string......
  • WEB漏洞—反序列化之php&java(上)
    PHP反序列化原理:---未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。---其实跟文件解析差不多,都是由于传递的恶意参数被执行(序列化和反序列化相当于加解密过程)---在反序列化的过程中自动触发了某些魔术方......
  • Web开发者不容错过的10个HTML5工具
    HTML5已经成为当今世界的一个必然组成部分。由于WorldWideWeb万维网是使用超文本标记语言来架构和呈现的,于是HTML5成为了最流行的编程语言之一。随着网络的不断扩张,Web开发人员非常有必要拥有最新的HTML5工具,用于创建动态和交互式的Web应用程序和网页。下面这些就是你不应该错过......
  • Django Form源码分析(2)
    1前置知识点1.1render函数 可以看到render函数先拿到模板,再进行模板渲染那么form函数是如何自动生成表单里的input标签呢,应该是在form里已经渲染好一遍生成了input标签放进了{"form":form}的集合render函数再进行渲染2Form函数2.1Form源码分析2.1.1Form初始化......
  • ESP32连接云服务器【WebSocket】
    ESP32连接云服务器【ESP32+宝塔面板】......
  • CTFer成长记录——CTF之Web专题·攻防世界—fileinclude·好多文件呀
    一、题目链接https://adworld.xctf.org.cn/challenges/list二、解法步骤  WRONGWAY!<?phpinclude("flag.php");highlight_file(__FILE__);if(isset($_GET["file1"])&&isset($_GET["file2"])){$file1=$_GET["file1"......
  • CTFer成长记录——CTF之Web专题·攻防世界—easyupload
    一、题目链接https://adworld.xctf.org.cn/challenges/list二、解法步骤  这题一道文件上传题,本题考的是利用.user.ini文件的特性,实现任意命令执行。在测试该文件上传是白名单还是黑名单,我们可以随便上传一个文件后缀,只要不通过就是白名单检测。.user.ini。它比.htacces......
  • asp.net core 2.0 web api基于JWT自定义策略授权
    原文通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端验证通过即可能获取想要访问的资源。关于JWT的技术,可参考网络上文章,这里不作详细说明,这篇博文,主要说明在asp.netcore2.0中,基于jwt的webapi的权限设置,即在asp.netcore中怎么用JWT,再次......
  • Java Web|
    1.Spring1.1SpringMVC参数的封装1.传统的URLlocalhost:8080?id=1&name=tom2.基于RESTful风格的URLlocalhost:8080/1/tom前后端分离的开发一般是基于RESTfull,具体规则是4中请求分别表示不同的业务GET查询POST添加PUT修改DELETE删除每个语言使用的时候都一样,是一种规......
  • Django 之前端动态数据展示
    一、结合前端页面实现ORM对数据的增删改查1、修改和删除功能的逻辑'''修改功能的逻辑'''1、确定修改哪条记录,怎么确定?通过主键id确定唯一一条记录2、点击修改的按钮,应该跳转到一个修改的页面3、应该通过id查询到原来的数据,并且把这个记录的数据展示到修改的页面4、开始......