专栏首页DBA随笔Django中的request.POST重构

Django中的request.POST重构

request.POST的重构

request.POST重构

最近在写MHA部署的平台化操作页面,先简单说下MHA平台化的主要步骤,大概如下(以一主一从为例进行分析):

1.部署两台MySQL环境,搭建主从关系

2.开通主从两台环境和MHA manager节点之间的防火墙

3.创建主从节点和MHA manager节点的SSH信任关系

4.跑脚本生成线上环境规定的目录形式

5.启动MHA

6.检测MHA的运行状态

我遇到的问题,发生在第二步,主从两台环境和MHA manager之间开通防火墙的问题,之前处理的情景都是一对多的防火墙开通情况,也花时间写了相应的API,但是处理的情况仅限一对多的防火墙开通方式,而今天这个需求是要开通多对多的防火墙关系,为了提高效率,我不想重新写相关的API,还想调用之前的API,所以需要在之前的基础上做一些改进。

防火墙开通的界面如下,系统权限也就是防火墙权限,其中需要填写的信息是ansible用户名,需要开通的防火墙实例IP信息,实例端口信息,目标客户端的实例IP以及相应的说明信息和用户信息。其中,每个信息在request.POST中的key值如右侧的标签所示:

而高可用部署模块的前端页面如下,图中所示每个节点都需要对其他三个节点开通对应的防火墙关系。

可以看到,此时的需求是多对多开通防火墙,需要借助已有的防火墙开通方法,拆解为四个一对多的防火墙开通步骤。

整体的设计思路如下:

所以这个问题的重点就集中在了,怎么把前端发过来的request.POST请求进行拼接重构,然后再用拼接好的request.POST值作为api的参数,去调用防火墙开通的api,开通防火墙的api的参数格式和调用方法如下:

调用方法:

目前,前端传回来的request.POST请求的内容如下:

<QueryDict: 
{u'slave_ip1': [u''],
 u'slave_ip0': [u'10.XX.XXX.128'],
 u'app_code': [u'app35'],
 u'mha_manager0': [u'10.XX.XXX.251'],
 u'mha_manager1': [u'10.XX.XXX.252'],
 u'master_ip': [u'10.XX.XXX.68'],
 u'slave_port0': [u'4306'],
 u'slave_port1': [u''],
 u'master_port': [u'4306'],
 u'csrfmiddlewaretoken': [u'09XXXXXXXXXXXXXXX57aR5hjb']
}
>

细心的朋友可能已经注意到了,返回的值是一个QueryDict对象,所以这就要求我们进行重构的时候,也要将request.POST重构成一个QueryDict对象,这样才能实现替代和拼接,这里我们先给出QueryDict的实例化方法:

#在HttpRequest对象中,属性 GET 和 POST 得到的都是 django.http.QueryDict 所创建的实例。
#这是一个 django 自定义的类似字典的类,用来处理同一个键带多个值的情况。
>>> QueryDict('a=1&a=2&c=3')
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>

具体的重构代码如下:

from django.http import QueryDict
#前端的request.POST解析
master_ip = request.POST.get('master_ip')
master_port=request.POST.get('master_port')
slave_ip0  = request.POST.get('slave_ip0')
slave_port0 = request.POST.get('slave_port0')
mha_manager0 = request.POST.get('mha_manager0')
mha_manager1 = request.POST.get('mha_manager1')

#第一次拼接---主节点对其他的节点
dest_ip_list = slave_ip0+','+mha_manager0+','+mha_manager1
tmpstr='ansible_user=dba_mysql&src_ip='+master_ip+
       '&dest_ip_list='+dest_ip_list+
       '&open_port_list='+master_port+
       '&description=MHA_iptables&controler=yeyz&dest_user=MHA'
tmp = QueryDict(tmpstr)
#拼接好的request.POST内容
request.POST=tmp

url = LOCAL_SERVER_URL + '/api/iptables_add/'
result = api_access(url, 'POST', request.user.id, request.POST)

#第二次拼接---从节点对其他的节点
dest_ip_list1 = master_ip + ',' + mha_manager0 + ',' + mha_manager1
tmpstr1 = 'ansible_user=dba_mysql&src_ip=' + slave_ip0 +
          '&dest_ip_list='+dest_ip_list1+
          '&open_port_list='+slave_port0+
          '&description=MHA_iptables&controler=yeyz&dest_user=MHA'
tmp1 = QueryDict(tmpstr1)
#拼接好的request.POST内容
request.POST=tmp1

url = LOCAL_SERVER_URL + '/api/iptables_add/'
result = api_access(url, 'POST', request.user.id, request.POST)

可以看到,在进行重构之前,必须导入QueryDict相应的包,也就是django.http包,我们首先把request.POST中的内容拿到,存到一个个变量里面,然后把这些变量拼接在字符串中,最后通过接口的方法去调用这些参数,实现request,POST请求重构,从而循环调用一对多的防火墙开通api,实现防火墙的多对多功能。

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447),作者:AsiaYe

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL之source命令

    今天上班的时候,开发的同事拿过来一个.zip的压缩包文件,说是要把里面的数据倒入到数据库里面,本来想着是成型的SQL,只需要复制粘贴一下,倒入到数据库中就可以...

    AsiaYe
  • 聊聊MySQL中的事务

    一致性就是说事务符合某些约束,比如我给你转账,你的账户多了10块钱,我的账户就会少10块钱。

    AsiaYe
  • MySQL的双主复制介绍

    今天搭建了一套双主复制的架构,这种架构包含两台服务器,每一台都被配置成对方的主库和备库,是一种特殊的主从,架构图如下:

    AsiaYe
  • shiro实战之常见问题整理

    在调用subject.login时会调用UserRealm的doGetAuthenticationInfo方法。

    开发架构二三事
  • Spring Boot + Vue + Shiro 实现前后端分离、权限控制

    原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的M...

    良月柒
  • Spring Boot + Vue + Shiro 实现前后端分离、权限控制

    前端从后端剥离,形成一个前端工程,前端只利用Json来和后端进行交互,后端不返回页面,只返回Json数据。前后端之间完全通过public API约定。

    好好学java
  • Spring Boot + Vue + Shiro 实现前后端分离、权限控制

    本文总结自实习中对项目的重构。原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返...

    芋道源码
  • Springboot + Vue + shiro 实现前后端分离、权限控制

    前端从后端剥离,形成一个前端工程,前端只利用Json来和后端进行交互,后端不返回页面,只返回Json数据。前后端之间完全通过public API约定。

    Java团长
  • 白话http2的多路复用

    上篇文章介绍了http1.1相对于http2的一些不足,本篇文章来聊一聊http2的一些优点,但是http2的优点比较多,并且需要结合源码展示,所以关于htt2...

    挥刀北上
  • C#测试web服务是否可用

    转载:http://www.cnblogs.com/xienb/p/3443282.html

    跟着阿笨一起玩NET

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动