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

django安装,配置

sudo pip3 install dgango
django-admin startproject mysite
django-admin startapp ssh
#models配置 class user(models.Model):
user = models.CharField(max_length=64)
passwd = models.CharField(max_length=64) #setting配置 INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ssh'
] import os
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
] STATIC_URL = '/static/' STATICFILES_DIRS = (
os.path.join(BASE_DIR,"statics"),
)

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>backup</title>
<style>
*{margin: 0;}
.top{background-color: whitesmoke; height: 52px;}
.top-left{width: 402px;height: 53px;float: left;}
.top-right{background-color: rgb(83, 83, 236);height: 53px;position:absolute;left:402px ;right: 0;}
.left{background-color: whitesmoke;height: 800px;position:absolute;top: 53px; left: 1px;width: 400px;border: 1px solid;border-color: teal;}
.right{background-color: whitesmoke;position:absolute;left: 403px;right: 0; top: 53px;white-space: pre;height: 800px;overflow: auto;}
.devices{margin-top: 7px;}
.devices:hover{cursor: pointer;}
.back:hover{background-color: teal; cursor: pointer;}
.pop{margin-left: 50px;margin-top: 10px;}
.pop:hover{cursor: pointer;}
.hidden{display: none;}
.site{margin-left: 10px;}
.img{ display: block;height:50px; width:50px; float: right;margin-right: 8px;color: white;border-radius: 30px;text-align: center;line-height: 53px;}
</style>
<script src="/static/jquery-3.6.0.js"></script> </head>
<body>
<div class="top">
<div class="top-left">
<h3 style="text-align: center; line-height: 52px;">配置备份</h3>
</div>
<div class="top-right">
<p class='img'>dark</p>
<img class='img' src="/static/dark.jpg">
</div>
</div>
<div class="left"> <div class="zz pop" >
<p class="button">郑州pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="1-10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="2-10.0.3.102" name="host1">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">广州pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">北京pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">上海pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">深圳pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">青岛pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
<div class="FS pop" >
<p class="button">海外pop</p>
<form class="hidden site" action="/backup/" method="POST">
<p><input type="checkbox" value="10.0.3.101" name="host">juniper </p>
<p><input type="checkbox" value="10.0.3.102" name="host">cisco</p>
<input class="back" type='submit' value="submit">
{%csrf_token%}
</form>
</div>
</div>
</div>
<div class="right">
{{show}}
</div> <script>
$('.pop .button').click(function(){
$(this).siblings().slideToggle()
}) </script> </body>
</html>

url路由

urlpatterns = [
path('admin/', admin.site.urls),
path('menu/', menu.menu),
path('backup/', menu.backup),
path('login/', menu.login),
]

后端代码

import paramiko,time,datetime
from ssh import models #SSH功能
def Testsshcon(ip,port,username,key):
try:
sshcon=paramiko.SSHClient()
sshcon.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#判断不同设备型号,执行不同命令
if ip[0]=="1":
cmds=['show conf | dis set | no-more\n','\n']
ip = ip[2:]
if ip[0]=="2":
cmds=['terminal length 0\n','show run\n']
ip = ip[2:]
sshcon.connect(ip,port,username,key,compress=True)
conn=sshcon.invoke_shell()
res = ''
for cmd in cmds:
time.sleep(1)
conn.send(cmd)
time.sleep(1.3)
out=conn.recv(100000)
res += out.decode('utf-8')
return(res)
sshcon.close()
except Exception as e:
return ("connet error",e)#接收前端POST内容,调用ssh函数,返回处理后页面
def backup(request):
  html_show = '配置文件'
  if request.method == 'POST':
  private_key = paramiko.RSAKey.from_private_key_file('/home/dark/.ssh/id_rsa')
  host = request.POST.dict()
    del host['csrfmiddlewaretoken'] 
  html_show = ''
#多选备份功能
   for x in host:
   res = Testsshcon(host[x],22,'dark2',private_key)
#写入备份文件
   file = '/home/dark/backup/'+ datetime.datetime.now().strftime("%Y-%m-%d")+'-'+host[x]
   with open(file,'w') as a:
   a.write(res)
   html_show +=res
return render(request,'backup.html',{'show':html_show}) #登录验证使用
def login(request):
tip = '用户名或密码错误'
if request.method == 'POST':
user = request.POST.get('username',None)
user_passwd = request.POST.get('passwd',None)
print(user,user_passwd)
userinfo=models.user.objects.get(user=user)
passwd = userinfo.passwd
if user_passwd == passwd:
return redirect('/backup')
else:
return render(request,'login.html',{'passwd':tip})
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. Spring Mvc 源代码之我见 一

    spring mvc 是一个web框架,包括controller.model.view 三大块.其中,核心在于model这个模块,用于处理请求的request. 和之前的博客一样,关键的代码,我会标注 ...

  2. flash的TotalFrames显示undefined

    通过js来操作flash的时候,获取到总帧数的是属性.TotalFrames,而不是属性TotalFrames().在asp.net中,js放在最后可以在一定程度上避免当前flash没有加载完,导致获 ...

  3. 百度移动统计调用api教程,少进坑(82001错误)

    相信很多小伙伴使用了百度统计,来查看自己应用使用的情况,但是会发现百度移动统计在官网没有api调用取数据的接口, 现在我就以自己成功调用api并且成功拿到数据,将这个步骤给大家参考,(末尾有调用移动统 ...

  4. git和github学习笔记

    1. 了解Git和Github 2. 使用Github 3. Git安装和使用 4. Git基本工作流程 5. Git初始化及仓库创建和操作 6. Git管理远程仓库 7. Github Pages ...

  5. Python中的numpy库介绍!

    转自:https://blog.csdn.net/codedz/article/details/82869370 机器学习算法中大部分都是调用Numpy库来完成基础数值计算的.安装方法: pip3 i ...

  6. Cadence 错误合集

    1.原理图DRC出现如下错误"Duplicate Pin Name "GND" found on Packag" 解决方案:原因是元件引脚重复定义,可以进行重新 ...

  7. Blog Ideas

    Blog Ideas How-to Post Case Studies Product + Service Updates Product Reviews Content Survey Current ...

  8. GoLang数组切片

    1. 数组1.1 如何定义数组同java数组一样,数组是一组内存连续且类型相同的数据组成 //不初始化初始值默认为0 var arr1 = [5]int{} var arr2 = [5]int{1,2 ...

  9. React-简单通用的抛物线动画

    一个简单通用的 React 抛物线动画demo Usage import { parabola } from "./parabola" ... onAnimate = () =&g ...

  10. dotnet new 命令笔记

    让dotnet new使用平台特定的目标,例如net6.0-windows10.0.19041.0 dotnet new console --name CallWinRTConsole --frame ...