原来公司开发团队人员众多,有专门对接运维需求的开发人员,现在想要实现些功能可(只)以(能)自己写了-_- |   周末在家无事,用django搞个简单的功能练练手

django安装,配置

  1. sudo pip3 install dgango
  2. django-admin startproject mysite
  3. django-admin startapp ssh
  4. #models配置
  5.  
  6. class user(models.Model):
  7. user = models.CharField(max_length=64)
  8. passwd = models.CharField(max_length=64)
  9.  
  10. #setting配置
  11.  
  12. INSTALLED_APPS = [
  13. 'django.contrib.admin',
  14. 'django.contrib.auth',
  15. 'django.contrib.contenttypes',
  16. 'django.contrib.sessions',
  17. 'django.contrib.messages',
  18. 'django.contrib.staticfiles',
  19. 'ssh'
  20. ]
  21.  
  22. import os
  23. TEMPLATES = [
  24. {
  25. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  26. 'DIRS': [os.path.join(BASE_DIR,'templates')],
  27. 'APP_DIRS': True,
  28. 'OPTIONS': {
  29. 'context_processors': [
  30. 'django.template.context_processors.debug',
  31. 'django.template.context_processors.request',
  32. 'django.contrib.auth.context_processors.auth',
  33. 'django.contrib.messages.context_processors.messages',
  34. ],
  35. },
  36. },
  37. ]
  38.  
  39. STATIC_URL = '/static/'
  40.  
  41. STATICFILES_DIRS = (
  42. os.path.join(BASE_DIR,"statics"),
  43. )

前端页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>backup</title>
  8. <style>
  9. *{margin: 0;}
  10. .top{background-color: whitesmoke; height: 52px;}
  11. .top-left{width: 402px;height: 53px;float: left;}
  12. .top-right{background-color: rgb(83, 83, 236);height: 53px;position:absolute;left:402px ;right: 0;}
  13. .left{background-color: whitesmoke;height: 800px;position:absolute;top: 53px; left: 1px;width: 400px;border: 1px solid;border-color: teal;}
  14. .right{background-color: whitesmoke;position:absolute;left: 403px;right: 0; top: 53px;white-space: pre;height: 800px;overflow: auto;}
  15. .devices{margin-top: 7px;}
  16. .devices:hover{cursor: pointer;}
  17. .back:hover{background-color: teal; cursor: pointer;}
  18. .pop{margin-left: 50px;margin-top: 10px;}
  19. .pop:hover{cursor: pointer;}
  20. .hidden{display: none;}
  21. .site{margin-left: 10px;}
  22. .img{ display: block;height:50px; width:50px; float: right;margin-right: 8px;color: white;border-radius: 30px;text-align: center;line-height: 53px;}
  23. </style>
  24. <script src="/static/jquery-3.6.0.js"></script>
  25.  
  26. </head>
  27. <body>
  28. <div class="top">
  29. <div class="top-left">
  30. <h3 style="text-align: center; line-height: 52px;">配置备份</h3>
  31. </div>
  32. <div class="top-right">
  33. <p class='img'>dark</p>
  34. <img class='img' src="/static/dark.jpg">
  35. </div>
  36. </div>
  37. <div class="left">
  38.  
  39. <div class="zz pop" >
  40. <p class="button">郑州pop</p>
  41. <form class="hidden site" action="/backup/" method="POST">
  42. <p><input type="checkbox" value="1-10.0.3.101" name="host">juniper </p>
  43. <p><input type="checkbox" value="2-10.0.3.102" name="host1">cisco</p>
  44. <input class="back" type='submit' value="submit">
  45. {%csrf_token%}
  46. </form>
  47. </div>
  48. <div class="FS pop" >
  49. <p class="button">广州pop</p>
  50. <form class="hidden site" action="/backup/" method="POST">
  51. <p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
  52. <p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
  53. <input class="back" type='submit' value="submit">
  54. {%csrf_token%}
  55. </form>
  56. </div>
  57. <div class="FS pop" >
  58. <p class="button">北京pop</p>
  59. <form class="hidden site" action="/backup/" method="POST">
  60. <p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
  61. <p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
  62. <input class="back" type='submit' value="submit">
  63. {%csrf_token%}
  64. </form>
  65. </div>
  66. <div class="FS pop" >
  67. <p class="button">上海pop</p>
  68. <form class="hidden site" action="/backup/" method="POST">
  69. <p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
  70. <p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
  71. <input class="back" type='submit' value="submit">
  72. {%csrf_token%}
  73. </form>
  74. </div>
  75. <div class="FS pop" >
  76. <p class="button">深圳pop</p>
  77. <form class="hidden site" action="/backup/" method="POST">
  78. <p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
  79. <p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
  80. <input class="back" type='submit' value="submit">
  81. {%csrf_token%}
  82. </form>
  83. </div>
  84. <div class="FS pop" >
  85. <p class="button">青岛pop</p>
  86. <form class="hidden site" action="/backup/" method="POST">
  87. <p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
  88. <p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
  89. <input class="back" type='submit' value="submit">
  90. {%csrf_token%}
  91. </form>
  92. </div>
  93. <div class="FS pop" >
  94. <p class="button">海外pop</p>
  95. <form class="hidden site" action="/backup/" method="POST">
  96. <p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
  97. <p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
  98. <input class="back" type='submit' value="submit">
  99. {%csrf_token%}
  100. </form>
  101. </div>
  102. </div>
  103. </div>
  104. <div class="right">
  105. {{show}}
  106. </div>
  107.  
  108. <script>
  109. $('.pop .button').click(function(){
  110. $(this).siblings().slideToggle()
  111. })
  112.  
  113. </script>
  114.  
  115. </body>
  116. </html>

url路由

  1. urlpatterns = [
  2. path('admin/', admin.site.urls),
  3. path('menu/', menu.menu),
  4. path('backup/', menu.backup),
  5. path('login/', menu.login),
  6. ]

后端代码

  1. import paramiko,time,datetime
  2. from ssh import models
  3.  
  4. #SSH功能
  5. def Testsshcon(ip,port,username,key):
  6. try:
  7. sshcon=paramiko.SSHClient()
  8. sshcon.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  9. #判断不同设备型号,执行不同命令
  10. if ip[0]=="1":
  11. cmds=['show conf | dis set | no-more\n','\n']
  12. ip = ip[2:]
  13. if ip[0]=="2":
  14. cmds=['terminal length 0\n','show run\n']
  15. ip = ip[2:]
  16. sshcon.connect(ip,port,username,key,compress=True)
  17. conn=sshcon.invoke_shell()
  18. res = ''
  19. for cmd in cmds:
  20. time.sleep(1)
  21. conn.send(cmd)
  22. time.sleep(1.3)
  23. out=conn.recv(100000)
  24. res += out.decode('utf-8')
  25. return(res)
  26. sshcon.close()
  27. except Exception as e:
  28. return ("connet error",e)#接收前端POST内容,调用ssh函数,返回处理后页面
  29. def backup(request):
  30.   html_show = '配置文件'
  31.   if request.method == 'POST':
  32.   private_key = paramiko.RSAKey.from_private_key_file('/home/dark/.ssh/id_rsa')
  33.   host = request.POST.dict()
  34.     del host['csrfmiddlewaretoken'] 
  35.   html_show = ''
  36. #多选备份功能
  37.    for x in host:
  38.    res = Testsshcon(host[x],22,'dark2',private_key)
  39. #写入备份文件
  40.    file = '/home/dark/backup/'+ datetime.datetime.now().strftime("%Y-%m-%d")+'-'+host[x]
  41.    with open(file,'w') as a:
  42.    a.write(res)
  43.    html_show +=res
  44. return render(request,'backup.html',{'show':html_show})
  45.  
  46. #登录验证使用
  47. def login(request):
  48. tip = '用户名或密码错误'
  49. if request.method == 'POST':
  50. user = request.POST.get('username',None)
  51. user_passwd = request.POST.get('passwd',None)
  52. print(user,user_passwd)
  53. userinfo=models.user.objects.get(user=user)
  54. passwd = userinfo.passwd
  55. if user_passwd == passwd:
  56. return redirect('/backup')
  57. else:
  58. return render(request,'login.html',{'passwd':tip})
  59. return render(request,'login.html')

最终页面效果

django小项目,使用paramiko自动备份网络设备配置的更多相关文章

  1. Django小项目练习

    Django学生管理系统 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^class_list/', views.class_list ...

  2. Python之路【第十八篇】Django小项目webQQ实现

    WEBQQ的实现的几种方式 1.HTTP协议特点 首先这里要知道HTTP协议的特点:短链接.无状态! 在不考虑本地缓存的情况举例来说:咱们在连接博客园的时候,当tcp连接后,我会把我自己的http头发 ...

  3. Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点

    开发一个简单的BBS论坛 项目需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可被 ...

  4. Django小项目web聊天

    WEBQQ的实现的几种方式 1.HTTP协议特点 首先这里要知道HTTP协议的特点:短链接.无状态! 在不考虑本地缓存的情况举例来说:咱们在连接博客园的时候,当tcp连接后,我会把我自己的http头发 ...

  5. Django小项目简单BBS论坛

    开发一个简单的BBS论坛 项目需求: 1 整体参考"抽屉新热榜" + "虎嗅网" 2 实现不同论坛版块 3 帖子列表展示 4 帖子评论数.点赞数展示 5 在线用 ...

  6. 使用SecureCRT脚本备份网络设备配置的一点感悟

    https://blog.csdn.net/qq_25294171/article/details/85158458

  7. Django 小实例S1 简易学生选课管理系统 0 初步介绍与演示

    Django 小实例S1 简易学生选课管理系统 第0章--初步介绍与演示 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 初步介绍 先介绍下这个 ...

  8. Django 小实例S1 简易学生选课管理系统 2 新建项目(project)并进行设置

    Django 小实例S1 简易学生选课管理系统 第2节--新建项目(project)并进行设置 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 0 ...

  9. Django集成celery实战小项目

    上一篇已经介绍了celery的基本知识,本篇以一个小项目为例,详细说明django框架如何集成celery进行开发. 本系列文章的开发环境: window 7 + python2.7 + pychar ...

随机推荐

  1. java模板设计

  2. word中怎么加入endnote的插件

    首先,打开Microsoft Word 2010,然后点击文件菜单,在弹出的项目中点击选项. 2 弹出Word选项对话框,在左侧导航处点击"加载项"按钮,如图. 3 在右侧内容窗口 ...

  3. Linux网络配置:Nat和桥接模式详解

    Linux网络配置:Nat和桥接模式详解 一.我们首先说一下VMware的几个虚拟设备: Centos虚拟网络编辑器中的虚拟交换机: VMnet0:用于虚拟桥接网络下的虚拟交换机: VMnet1:用于 ...

  4. CEPH-4:ceph RadowGW对象存储功能详解

    ceph RadosGW对象存储使用详解 一个完整的ceph集群,可以提供块存储.文件系统和对象存储. 本节主要介绍对象存储RadosGw功能如何灵活的使用,集群背景: $ ceph -s clust ...

  5. VueJs单页应用实现微信网页授权及微信分享功能

    在实际开发中,无论是做PC端.WebApp端还是微信公众号等类型的项目的时候,或多或少都会涉及到微信相关的开发,最近公司项目要求实现微信网页授权,并获取微信用户基本信息的功能及微信分享的功能,现在总算 ...

  6. 记一次曲折的CVE-2018-1270复现分析

    前言 前两天接到朋友对某个授权目标的漏扫结果,也算是初次接触到这个漏洞,就想着顺手分析一下复现一下,因为分析这个漏洞的文章也比较少,所以刚开始比较迷,进度也比较慢. 漏洞复现 使用vulhub搭建环境 ...

  7. Android回到页面并刷新数据

    通过对Android Activity的生命周期的了解,需要在后退页面重写onResume()的方法. 建立自己更新数据的函数,并在onCreate()方法中调用. @Override protect ...

  8. apache开启图片缓存压缩

    ①-浏览器缓存图片信息 开启Apache的expires模块,重启Apache 2.在虚拟主机的配置文件里面,增加对图片信息缓存的配置,重启Apache 3.在网站目录里面填写测试代码 4.测试效果 ...

  9. spring-aop相关概念

    如果下面有疑问请看完动态代理技术的分析 Aop术语: Target(目标对象):要被增强的方法的对象 Proxy(代理对象):简单的说就是对目标对象进行增强的代理类 Joinpoint(连接点):可以 ...

  10. Problem N: 输出回字形

    这个题如果用for循环直接做的话恐怕得做上几个小时吧,加上一点小技巧,用坐标法来写这个题.就像下面这样: 坐标原点不在矩形的角上,而在矩形的中心处,这只是算是一个技巧,理解起来好理解而已.