为什么80%的码农都做不了架构师?>>>   

文章及代码比较基础,适合初、中级人员,高手略过

阅读此篇文章你可以:

  • 获取一个Django实现增删改查的案例源码
  • 了解数据加密的使用场景和方法以及如何在Python3中使用

背景介绍

DBA需要维护一张密码表,主要记录数据库中创建的账号密码信息,大概如下:

目前的维护方式还是最传统的Excel,一个人更新给多个人同步,Excel设置密码以保证安全性,原始且效率低下,既然我们已经上线了overmind数据库运维系统,何不在系统里边集成这个功能呢?

技术实现

简单分析就可以知道,我们要实现的功能如下:

1.最基础的表单增删改查

2.涉及到密码存储需要加密

update_or_create

表单增删改查大家应该都比较熟悉了,实现方式有很多,我们采用了最简单的view方法来实现,详细内容查看源代码。

代码中用到了Django的一个QuerySet API可能部分人没有用过update_or_create,这里详细介绍下

update_or_create(defaults=None, **kwargs)

看到方法的命名大概也能猜出来这个方法的主要作用就是更新或者创建model数据,那么究竟什么情况下更新?什么情况下创建呢?主要根据传入的**kwargs来判断,defaults为要更新的数据。一句话概括为filter kwargs,create/update defaults

例如对于一张用户表我们要判断username为devops,且email为 devops@ops-coffee.cn 的用户是否存在,如果不存在则创建这个用户,且设置用户的site为 https://ops-coffee.cn ,如果存在则更新这个用户的site为 https://ops-coffee.cn ,则可以这样写

object, created = User.objects.update_or_create(username='devops',email='devops@ops-coffee.cn',defaults={'username':'devops','email':'devops@ops-coffee.cn','site':'https://ops-coffee.cn'}
)

额,上边的例子是不是有点复杂了,拿我们项目里边的实例为例,就是判断id是否存在,如果存在则更新,如果不存在则创建

object, created = Table.objects.update_or_create(id=postdata.get('id'),defaults=postdata
)

update_or_create方法返回结果为一个元组(object, created),object为新建或者更新的对象,created为一个布尔值,表示是新建还是更新,True为新建

密码加密

对于密码加密,我们知道加密算法有很多,究竟哪种适合我们呢?

看一下我们的需求,存储的时候要加密存储,但也要能对加密后的数据进行解密以获取原始密码,那么就要求加密算法既支持加密,也支持解密,对于md5这种只支持加密的单向算法就不能选择了,在支持加解密的算法中应用最为广泛的当属RSA了,我们最终也选择了RSA,其实单单对于这个场景来说用3DES之类的对称加密就够了,速度也会快很多,但是考虑到系统里边有其他的加密需求选择RSA能满足更多情景。

RSA加密算法非常复杂,感兴趣的可以查询专业资料,RSA需要一对秘钥称为公钥和私钥,公钥可以对字符串进行加密生成加密字符串,拿私钥可以将加密字符串还原。

python3中RSA的使用

生成RSA秘钥对代码

from Cryptodome.PublicKey import RSAdef create_rsa_key():'''生成RSA秘钥对'''try:# 选择秘钥位数,位数越高越安全,同时加密速度也越慢key = RSA.generate(2048)encrypted_key = key.exportKey(pkcs=8)public_key = key.publickey().exportKey().decode('utf-8')private_key = encrypted_key.decode('utf-8')return {'state': 1, 'message': {'public_key': public_key, 'private_key': private_key}}except Exception as err:return {'state': 0, 'message': str(err)}if __name__ == '__main__':print(create_rsa_key())

执行脚本生成RSA秘钥对,将RSA秘钥对配置在加解密的代码中

RSA加密解密代码

import binascii
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_v1_5class RsaCrypto():'''RSA 加解密'''def __init__(self):self.private_key = '''-----BEGIN PRIVATE KEY-----MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDLetN9MfsVWZj2K+i1vPQqeDKb8Fe52pHKvRtQggTF+x3YRCyk7UNQ27VupohM8t+Qzi2Zm3GnZY5XH7W8UGLnI1X1ykpWOWVueP3KCA7DCtswDp5hkJgHzPPZC/DlFh0uCpAmUkgHP7WUXRZoR9mmcVOdWN9c+NWS0JA6cwHSI+J78Edb1lfef5YOwseL2GiOmBiJ7THYfjrwFwGQaZVjhsp3Pkt7Yt/Huc5NU234wA9j+TFFnubpOrE9mFT8qCkhFhWIEcNsuTqDDDI9BX0lLaEEn+vg9cnEZ97VgdQQG2D6Ozw4Gldpfoq1XB6BqXg+YsCvyD/h/4QDLpejZy/VAgMBAAECggEADJkoj6omNevb459Tri+VHS1fUiEEXXZ3QQqKWWa4wu/0U2030mek8P8EHGYP2avOmcRE4IDWUvCfv9cvxQljxj8oKwABBZZSKGUyBBiRnr6E/v8OC/5hhgIeNZm0ADW+osN2qgNoKu1lNwVjG3EaEbXB4TkdGJWI1lPhdNelYjby7/4vnXO7yplSFlDLiqjmEV9Vva3Jf3N3vf92ZfUJg6NHklYDlP+L4unNtS++HKtvC3TWSz0esVrK67t4Vut+RdKrSQzzWkPAqNwktUavQq6Nb+KMrf9tsQujPZaXkEUnLUwtVNwhT3BiyPswHN1ycjlP3lN391rnawDQc751dQKBgQDZSFBq1JaGm4zK2YHmBbxCJ++6l1Qmu9yhk/zic1M/oGoFRdzkeWrYsxhLupp+4PjcCPEiZqivSeJXsFVOdiSjWsBkfO51HRuEzRE2Z/tiTRzJsGAcrBsWwBYNZR/PADG7MEYhIYH0p6Jp3jrqpNs0f5Gz8XToPi2TQXmRyAltFwKBgQDvvOFlJFfx1ld2wLuZ0w1yMpUoyFYCWSh+ylREFETod8ufbQxRzvvSA3gFO+xwYZoA+Wq/TyGrfVnN9m4R1goPsQjsuUYQeAIiMBKmG5znTAmu8dQ5wLKtb10CV0MuFGOSv8xvlccKepY7IDtxOaO410o4PFEjAziU90b8RiRV8wKBgHDsUD71NTXH6agS2pu9J1YKg2Cp/SYURFoFG0xlO0K6D9+lq2NiZtEwYtQYqup96VgRnaCPUeOntmZ0UiFw7SGorIyNETD0a7TdDrED4XX5NZjsfUbpezqbodpcT+e45h+uuwPE8lFAPfxfbqc7/mCOXB70whlhFzaMtK27FIsJAoGAVtTJqnF8bPpeWYO7Lx7TOu55Ofk9tcIHOc0csj/JKY3iMY80rBjU+p8JBJRMsfOX7QxpjnshzdQsB75e5ZTptf9AJUWBzAs7cpiI2KMdtGTFCRlL7dMOpGS2gleK3JDD8+4GJNBR9EisSyQEg6EF3LgViMLH/G95OfNKQatCE+MCgYEAhRIuEMaL2idD9NKOVdgCfuSbiP5G69IBVD4uoDYFPQJjxqVOg3pORa8+cJTe+ZFaCkTGV3112eM5Vtm4Vd9QpOh7VgJP1l3puZnUoSWGoWansx6aKok5FwuUrZWPjqr/Zrre8XXJyaiR520tuf0iStMfNAsijJgi2pq2PTMovhE=-----END PRIVATE KEY-----'''self.public_key = '''-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy3rTfTH7FVmY9ivotbz0Kngym/BXudqRyr0bUIIExfsd2EQspO1DUNu1bqaITPLfkM4tmZtxp2WOVx+1vFBi5yNV9cpKVjllbnj9yggOwwrbMA6eYZCYB8zz2Qvw5RYdLgqQJlJIBz+1lF0WaEfZpnFTnVjfXPjVktCQOnMB0iPie/BHW9ZX3n+WDsLHi9hojpgYie0x2H468BcBkGmVY4bKdz5Le2Lfx7nOTVNt+MAPY/kxRZ7m6TqxPZhU/KgpIRYViBHDbLk6gwwyPQV9JS2hBJ/r4PXJxGfe1YHUEBtg+js8OBpXaX6KtVwegal4PmLAr8g/4f+EAy6Xo2cv1QIDAQAB-----END PUBLIC KEY-----'''def encrypt(self, plaintext):'''加密方法'''try:recipient_key = RSA.import_key(self.public_key)cipher_rsa = PKCS1_v1_5.new(recipient_key)en_data = cipher_rsa.encrypt(plaintext.encode('utf-8'))hex_data = binascii.hexlify(en_data).decode('utf-8')return {'state': 1, 'message': hex_data}except Exception as err:return {'state': 0, 'message': str(err)}def decrypt(self, hex_data):'''解密方法'''try:private_key = RSA.import_key(self.private_key)cipher_rsa = PKCS1_v1_5.new(private_key)en_data = binascii.unhexlify(hex_data.encode('utf-8'))data = cipher_rsa.decrypt(en_data, None).decode('utf-8')return {'state': 1, 'message': data}except Exception as err:return {'state': 0, 'message': str(err)}if __name__ == '__main__':print(RsaCrypto().encrypt())

对原始密码加密

>>> _t = RsaCrypto().encrypt('ops_coffee.cn')
>>> print(_t)
{'state': 1, 'message': 'ae3e52eede23a7c9dd348244f0ae90b06c6773e9fecb2383f8195c50e6032742fb793423d75082db9a325b091d3e02351cd04157c68a64a5c130c0eaf7de1396d8993f0d649d1f3c1004119aa221daefca52215a235fb316af313ef64479957264012be20a1d54987386a3f29ae2fe80e147e7eeb770803045cab0d979aa6d5b88c39058f8fba7f6bf06bc436be59a19ccb72ac2813d809132203a64020bbe3c0c3df74befa8b18fb4782e34daff8f6e33e4b45cbe1b2db2be2c3e38a1c9e0e314178ed36a53960017fd9af5f27d99c5e5e0a8d384ac83156598788334248507ac1498fe44b1fb7e3b43e44a8bf3fc189076b16efef2c0f0a86d7faa0
53bbe24'}

获取加密后的字符串

>>> hex_data = _t.get('message')
>>> print(hex_data)
ae3e52eede23a7c9dd348244f0ae90b06c6773e9fecb2383f8195c50e6032742fb793423d75082db9a325b091d3e02351cd04157c68a64a5c130c0eaf7de1396d8993f0d649d1f3c1004119aa221daefca52215a235fb316af313ef64479957264012be20a1d54987386a3f29ae2fe80e147e7eeb770803045cab0d979aa6d5b88c39058f8fba7f6bf06bc436be59a19ccb72ac2813d809132203a64020bbe3c0c3df74befa8b18fb4782e34daff8f6e33e4b45cbe1b2db2be2c3e38a1c9e0e314178ed36a53960017fd9af5f27d99c5e5e0a8d384ac83156598788334248507ac1498fe44b1fb7e3b43e44a8bf3fc189076b16efef2c0f0a86d7faa053bbe24

对加密后的字符串进行解密

>>> _x = RsaCrypto().decrypt(hex_data)
>>> print(_x)
{'state': 1, 'message': 'ops_coffee.cn'}

页面展示

列表页:列表页使用了datatables插件方便展示,且使用了Django的模板引擎直接渲染

添加:一个简单的功能,这里就在当前页面弹出model弹出框的方式来展现

编辑:添加、编辑、删除都采用前后端分离,ajax异步json数据交互

查看原始密码:实际上是有权限管理的,并非所有用户都能查看原始密码

源码地址

aHR0cHM6Ly9naXRodWIuY29tL29wcy1jb2ZmZWUvZGVtby90cmVlL21hc3Rlci9wYXNzd29yZA==

上边为“加密”后的源码地址,有没有想尝试破解一下的冲动?关注公众号【运维咖啡吧】回复"01"获取加密方式及源码地址,期待你的到来


如果你觉得文章对你有帮助,请转发分享给更多的人。如果你觉得读的不尽兴,推荐阅读以下文章:

  • Django+Echarts画图实例
  • Django model转字典的几种方法

转载于:https://my.oschina.net/37Y37/blog/2980735

Django开发密码管理表实例【附源码】相关推荐

  1. Python + Django开发在线考试管理系统(附源码)

    本文最终实现一个Web在线考试管理系统,可作为Python Web,Django的练手项目,也可以作为计算机毕业设计参考项目. 文章目录 系统功能需求分析 系统设计及实现思路 源码分享&系统实 ...

  2. python 开发视频播放网站_python开发微电影视频网站教程附源码

    做为一个合格的Pythoner,只掌握一个框架是不够,如果你有过其它Python框架(例如django)的使用经验,对比不同框架的特性来学习,你将收获更多 当前信息若含有黄赌毒等违法违规不良内容,请点 ...

  3. java计算机毕业设计高校学生资助管理信息系统(附源码、数据库)

    java计算机毕业设计高校学生资助管理信息系统(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecli ...

  4. 用ionic快速开发hybird App(已附源码,在下面+总结见解)

    用ionic快速开发hybird App(已附源码,在下面+总结见解) 1.ionic简介 ionic 是用于敏捷开发APP的解决方案.核心思路是:利用成熟的前端开发技术,来写UI和业务逻辑.也就是说 ...

  5. 基于C++开发的仓库管理系统(附源码)

    基于C++开发的仓库管理系统(附源码) 一.简介 1.开始菜单 2.登录后的菜单 二.C++代码 main.cpp   一.简介   仓库管理系统的功能有登录.注册.查询功能.入库功能.出库功能.添加 ...

  6. Flask+VUE 实现页面增删改查显示开发+测试(图文教程附源码)

    目录 一.新建项目并初始化 二.安装依赖 axios.elementUI 三.Vue代码 四.进行接口联调 五.后端接口优化 六.web页面功能测试 七.总结 八.展望 九.附录(截止发文时的代码) ...

  7. C#共享内存实例 附源码

    原文 C#共享内存实例 附源码 网上有C#共享内存类,不过功能太简单了,并且写内存每次都从开头写.故对此进行了改进,并做了个小例子,供需要的人参考. 主要改进点: 通过利用共享内存的一部分空间(以下称 ...

  8. arcgis开发 多版本之间如何兼容_arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)...

    你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...

  9. flink sql 知其所以然(二)| 自定义 redis 数据维表(附源码)

    感谢您的关注  +  点赞 + 再看,对博主的肯定,会督促博主持续的输出更多的优质实战内容!!! 1.序篇-本文结构 背景篇-为啥需要 redis 维表 目标篇-做 redis 维表的预期效果是什么 ...

最新文章

  1. 开发log4j配置_Spring 使用 Log4J 记录日志
  2. 用机器学习神器sklearn做特征工程!
  3. JSON 对象和字符串对象的互转
  4. TZOJ 3030 Courses(二分图匹配)
  5. 全国计算机等级考试题库二级C操作题100套(第26套)
  6. 数据库优化:SQL 查找是否存在,别再 count 了,很耗费时间的!
  7. mangouDB和mysql的区别_谈谈mongodb,mysql的区别和具体应用场景
  8. imp库,python进入import内部
  9. Spring Boot系列教程八: Mybatis使用分页插件PageHelper
  10. 光线跟踪是什么? 光能传递(radiosity lighting)是什么?
  11. 算法进阶之Leetcode刷题记录
  12. 拓端tecdat|R语言 PCA(主成分分析),CA(对应分析)夫妻职业差异和马赛克图可视化
  13. idea安装svn插件
  14. sas 分析家模块 安装,SAS9.3/9.4统计分析安装使用教程自学资料完整模块最新SID
  15. 人人商城V3配置添加对接威信小程序直播,前后端教程。
  16. 商品分页查询 ego-prc 实现-easyui
  17. HMTL中隐藏域(type=hidden)
  18. win10桌面记事本便签有哪款
  19. 伤害世界怎么自建服务器,《伤害世界Hurtworld》服务器架设方法图文详解 怎么开服?...
  20. 点云 3D 目标检测 - PointPillars(CVPR 2019)

热门文章

  1. centos7 无法启动,停留在开机页面,报错 A start job is running for /etc/rc.d/rc.local compatibility 解决办法
  2. Kubernetes之配置与自定义DNS服务
  3. 当遭遇TCP洪水(SYN Flood)后的的诊断思路和处理过程
  4. xftp无法链接Linux
  5. 关于·nowrap与width
  6. 酷派手机android版本,酷派大神F2的手机系统是什么?能升级安卓4.3吗?
  7. C语言小于n的素数,关于求N以内素数的一点小问题(N小于一亿)
  8. 解决Tomcat catalina.out 不断成长导致档案过大的问题
  9. 【原】IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
  10. 【linux-command not find解决方法 】