首页 > 编程语言 > 详细

Python Django项目

时间:2019-09-02 19:28:04      阅读:62      评论:0      收藏:0      [点我收藏+]

1.新建一个django project项目

django-admin startproject DjangoWeb

2、新建app

python manage.py startapp webserver

3.编写models.py创建数据库模板

# -*- coding: utf8 -*-
# linyouyi
from django.db import models

# Create your models here.
class Business(models.Model):
    name = models.CharField(max_length=32)
    code = models.CharField(max_length=32)
    def __str__(self):
        return self.name
class HostGroup(models.Model):
    name = models.CharField(max_length=32, unique=True)
    def __str__(self):
        return self.name
class Host(models.Model):
    hostname = models.CharField(max_length=32, db_index=True)
    alias = models.CharField(max_length=32,default="alias")
    public_ip = models.GenericIPAddressField(protocol="ipv4", db_index=True)
    private_ip = models.GenericIPAddressField(protocol="ipv4")
    system = models.CharField(max_length=32)
    cpu_version = models.CharField(max_length=32)
    cpu_thread_num = models.SmallIntegerField(default=1)
    memory = models.IntegerField()
    hard_disk = models.IntegerField()
    admin_root = models.CharField(max_length=16)
    admin_pass = models.CharField(max_length=64)
    port = models.CharField(max_length=64)
    status_choice = ((0, downline), (1, online))
    status = models.SmallIntegerField(choices=status_choice, default=0)
    hostgroup = models.ForeignKey("HostGroup", to_field="id", on_delete=True)
    business = models.ForeignKey("Business", to_field="id", on_delete=True)
    def __str__(self):
        return self.hostname

#一个主机可以在多个组,一个组可以拥有多个主机
class HostToHostGroup(models.Model):
    host_id = models.ForeignKey("Host", to_field="id", on_delete=True)
    host_group_id = models.ForeignKey("HostGroup", to_field="id", on_delete=True)

class ExecuteLog(models.Model):
    hostip = models.GenericIPAddressField(protocol="ipv4")
    hostuser = models.CharField(max_length=32)
    # 如果密钥连接的话就不用记录远程主机的密码,因此hostpass可以为空值
    hostpass = models.CharField(max_length=64, null=True, blank=True)
    # 如果是上传操作则没有命令可记录,因此hostcmd可以为空值
    hostcmd = models.CharField(max_length=254, null=True, blank=True)
    excuteuser = models.CharField(max_length=32)
    #执行用户的ip地址
    excuteip = models.GenericIPAddressField(protocol="ipv4", null=True, blank=True)
    # 如果是执行命令的话则没有文件路径可记录,因此filepath可以为值
    filepath= models.CharField(max_length=128, null=True, blank=True)
    executetime = models.DateTimeField(auto_now_add=True)

4.生成配置文件

python manage.py makemigrations

5.开始创建数据库和表

python manage.py migrate

6.编写其他文件

1).admin.py

# -*- coding: utf8 -*-
# linyouyi

from django.contrib import admin
from .models import *
# Register your models here.

class ExecuteLogAdmin(admin.ModelAdmin):
    list_display = (id, hostip, hostuser, hostpass, hostcmd, excuteuser, excuteip, filepath, executetime)

admin.site.register(Business)
admin.site.register(HostGroup)
admin.site.register(Host)
admin.site.register(HostToHostGroup)
admin.site.register(ExecuteLog, ExecuteLogAdmin)

2).apps.py

# -*- coding: utf8 -*-
# linyouyi

from django.apps import AppConfig


class MasterConfig(AppConfig):
    name = master

3).forms.py

# -*- coding: utf8 -*-
# linyouyi

from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(label=‘‘,max_length=100,widget=forms.TextInput(
        attrs={id:username,placeholder:User}))
    password = forms.CharField(label=‘‘,widget=forms.PasswordInput(
        attrs={id:password,placeholder:Password}))

4.urls.py

# -*- coding: utf8 -*-
# linyouyi

from django.conf.urls import url
from . import views

urlpatterns = [
    url(^$, views.login),
    url(^login/$, views.login),
    url(^logout/$, views.logout),
    url(^index/$, views.index),
    url(^user/repass/$, views.changePass),
    url(^host/$, views.hostList, name="host_list"),
    url(^host/group/$, views.hostGroup, name="host_group"),
    url(^host/group/add/$, views.hostGroupAdd),
    url(^host/group/edit/$, views.hostGroupEdit),
    url(^host/group/del/(\d+)/$, views.hostGroupDel),
    url(^host/list/$, views.hostList),
    url(^host/add/$, views.hostAdd),
    url(^host/edit/(\d+)/$, views.hostEdit),
    url(^host/del/(\d+)/$, views.hostDelete),
    url(^host/execute/$, views.hostExecute),
    url(^host/pi/$, views.hostPi),
    url(^host/monitor/$, views.hostMonitor),
    url(^host/upload/$, views.hostUpload),
    url(^host/search/$, views.hostSearch),

]

5.views.py

# -*- coding: utf8 -*-
# linyouyi

from django.shortcuts import render, redirect, HttpResponseRedirect,HttpResponse
from django.contrib import auth
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.models import Group
from .forms import LoginForm
import paramiko
import json
from . import models
# Create your views here.
def login(request):
    if request.method == GET:
        #记录用户原来请求的页面存入session中,登陆成功再后跳转回原来的页面
        request.session[loginfrom] = request.GET.get(next, /master/index/)
        login_form = LoginForm()
        return render(request, login.html, {login_form: login_form})
    else:
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            username = request.POST.get(username)
            password = request.POST.get(password)
            user = auth.authenticate(username=username, password=password)
            if user is not None and user.is_active:
                auth.login(request, user)
                try:
                    # 此处预防未分组的用户登录user_group没有值会报错
                    group = Group.objects.get(user=request.user)
                    user_group = group.name
                except:
                    user_group = "未分组"
                request.session[group] = user_group
                response = HttpResponseRedirect(request.session[loginfrom])
                return response
                # return redirect(‘/master/index/‘)
            else:
                return render(request, login.html, {login_form:login_form})
        else:
            return render(request, login.html, {login_form: login_form})
def logout(request):
    auth.logout(request)
    return HttpResponseRedirect(/master/login/)

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
@login_required
def changePass(request):
    if request.method == GET:
        return render(request,changePass.html)
    elif request.method == POST:
        import json
        from django.contrib.auth.hashers import make_password
        result = {status: False, error: None, data: None}
        #username = request.user
        username = request.POST.get(username)
        oldpassword = request.POST.get(oldpassword)
        print(username,oldpassword)
        try:
            user = auth.authenticate(username=username,password=oldpassword)
            if user is not None and user.is_active:
                newpassword = request.POST.get(newpassword)
                newpassword = make_password(newpassword, None, pbkdf2_sha256)#密码加密
                user.password = newpassword
                user.save()
                return HttpResponse(OK)    #修改成功,允许特殊符号
            else:
                return HttpResponse("修改失败!")       #旧密码错误
        except Exception as e:
            result[status] = False
            result[data] = "请求出错"
        return HttpResponse(json.dumps(result, ensure_ascii=False))

@login_required
def index(request):
    host_obj = models.Host.objects.all()
    hostgroup = models.HostGroup.objects.all()
    business = models.Business.objects.all()
    return render(request, index.html,{host_obj: host_obj, hostgroup: hostgroup, business: business,})

@login_required
def hostList(request):
    host_obj = models.Host.objects.all()
    hostgroup = models.HostGroup.objects.all()
    business = models.Business.objects.all()
    return render(request, index.html, {host_obj: host_obj, hostgroup: hostgroup, business: business,})

@permission_required(master.add_host)
@login_required
def hostAdd(request):
    if request.method == GET:
        #获取status_choice有哪些选项,然后传向前端,也可以在前端写成静态的
        status_obj = models.Host.status_choice
        hostgroup = models.HostGroup.objects.all()
        business = models.Business.objects.all()
        return render(request, hostAdd.html, {hostgroup:hostgroup, business:business, status_obj:status_obj})
    elif request.method == POST:
        hostname = request.POST.get("hostname")
        public_ip = request.POST.get("public_ip")
        private_ip = request.POST.get("private_ip")
        system = request.POST.get("system")
        cpu_version = request.POST.get("cpu_version")
        cpu_thread_num = request.POST.get("cpu_thread_num")
        memory = request.POST.get("memory")
        hard_disk = request.POST.get("hard_disk")
        admin_root = request.POST.get("admin_root")
        admin_pass = request.POST.get("admin_pass")
        port = request.POST.get("port")
        host_group = request.POST.get("host_group")
        business = request.POST.get("business")
        status = request.POST.get("status")

        models.Host.objects.create(
            hostname=hostname,
            public_ip=public_ip,
            private_ip=private_ip,
            system=system,
            cpu_version=cpu_version,
            cpu_thread_num=cpu_thread_num,
            memory=memory,
            hard_disk=hard_disk,
            admin_root=admin_root,
            admin_pass=admin_pass,
            port=port,
            hostgroup_id=host_group,
            business_id=business,
            status=status,
        )
        hostgroup = models.HostGroup.objects.all()
        business = models.Business.objects.all()
        return render(request, hostAdd.html, {hostgroup: hostgroup, business: business})

@permission_required(master.change_host)
@login_required
def hostEdit(request, id):
    if request.method == GET:
        host_obj = models.Host.objects.filter(id=id).first()
        hostgroup = models.HostGroup.objects.all()
        business = models.Business.objects.all()
        return render(request,hostEdit.html,{host_obj:host_obj,hostgroup:hostgroup,business:business})
    elif request.method == POST:
        hostname = request.POST.get("hostname")
        alias = request.POST.get("alias")
        public_ip = request.POST.get("public_ip")
        private_ip = request.POST.get("private_ip")
        system = request.POST.get("system")
        cpu_version = request.POST.get("cpu_version")
        cpu_thread_num = request.POST.get("cpu_thread_num")
        memory = request.POST.get("memory")
        hard_disk = request.POST.get("hard_disk")
        admin_root = request.POST.get("admin_root")
        admin_pass = request.POST.get("admin_pass")
        port = request.POST.get("port")
        host_group = request.POST.get("host_group")
        business = request.POST.get("business")
        status = request.POST.get("status")

        models.Host.objects.filter(id=id).update(
            hostname=hostname,
            alias=alias,
            public_ip=public_ip,
            private_ip=private_ip,
            system=system,
            cpu_version=cpu_version,
            cpu_thread_num=cpu_thread_num,
            memory=memory,
            hard_disk=hard_disk,
            admin_root=admin_root,
            admin_pass=admin_pass,
            port=port,
            hostgroup_id=host_group,
            business_id=business,
            status=status,
        )
        return redirect(/master/index/)

@permission_required(master.delete_host)
@login_required
def hostDelete(request, id):
    models.Host.objects.filter(id=id).delete()
    return redirect(/master/index/)

@permission_required(master.add_hostgroup)
@login_required
def hostGroup(request):
    if request.method == GET:
        try:
            # 此处预防位分组的用户登录user_group没有值会报错
            user_group = Group.objects.get(user=request.user)
        except:
            user_group = "未分组"
        host_group = models.HostGroup.objects.all()
        return render(request,hostGroup.html,{host_group:host_group,user_group:user_group})
    elif request.method == POST:
        #host_group = request.POST.get(‘name‘)
        pass

@permission_required(master.add_hostgroup)
@login_required
def hostGroupAdd(request):
    import json
    ret = {status:False,error:None,data:None}
    try:
        name = request.GET.get(hostgroupname)
        models.HostGroup.objects.create(name=name)
        return HttpResponse(OK)
    except Exception as e:
        ret[status] = False
        ret[data] = "请求出错"
    return HttpResponse(json.dumps(ret,ensure_ascii=False))

@permission_required(master.change_hostgroup)
@login_required
def hostGroupEdit(request):
    if request.method == GET:
        host_group = models.HostGroup.objects.all()
        return render(request,hostGroup.html,{host_group:host_group})
    elif request.method == POST:
        import json
        ret = {status:False,error:None,data:None}
        try:
            id = request.POST.get(gid)
            name = request.POST.get(hostgroupname)
            print(name)
            models.HostGroup.objects.filter(id=id).update(name=name)
            return HttpResponse(OK)
        except Exception as e:
            ret[status] = False
            ret[error] = "修改失败"
        return HttpResponse(json.dump(ret,ensure_ascii=False))

@permission_required(master.delete_hostgroup)
@login_required
def hostGroupDel(request, id):
    models.HostGroup.objects.filter(id=id).delete()
    return redirect(/master/host/group/)

@permission_required(master.add_host)
@csrf_exempt
@login_required
def hostExecute(request):
    if request.method == GET:
        return render(request, execute.html)
    elif request.method == POST:
        excuteuser = request.user
        ip = request.POST.get(ipaddress)
        user = request.POST.get(remoteuser)
        pwd = request.POST.get(remotepwd)
        command = request.POST.get(command)
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(ip, 22, username=user, password=pwd, allow_agent=False, look_for_keys=False, timeout=5)
        stdin, stdout, stderr = ssh.exec_command(command, get_pty=True)
        stdout.flush()
        outmsg = stdout.read()
        outmsg = str(outmsg.decode()).replace("\\r\\n","<br>")
        ssh.close()
        #记录操作日志
        excuteip = get_client_ip(request)
        print(excuteip)
        models.ExecuteLog.objects.create(
            hostip=ip,
            hostuser=user,
            hostpass=pwd,
            hostcmd=command,
            excuteuser=excuteuser,
            excuteip=excuteip,
        )
        return HttpResponse(outmsg)

@permission_required(master.add_host)
@login_required
@csrf_exempt
def hostPi(request):
    if request.method == GET:
        hostinfo = models.Host.objects.all()
        return render(request, hostPi.html,{hostinfo:hostinfo})
    elif request.method == POST:
        excuteuser = request.user
        ip = request.POST.get(ipaddress)
        user = request.POST.get(remoteuser)
        pwd = request.POST.get(remotepwd)
        command = request.POST.get(command)
        x = ip.strip(,).split(,)
        y = user.strip(,).split(,)
        z = pwd.strip(,).split(,)
        res = zip(x,y,z)
        exc_result = ""
        for (ip,user,pwd) in res:
            try:
                ssh = paramiko.SSHClient()
                ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
                ssh.connect(ip, 22, username=user, password=pwd, allow_agent=False, look_for_keys=False, timeout=5)
                ssh.exec_command(command, get_pty=True)
                stdin, stdout, stderr = ssh.exec_command(echo $?, get_pty=True)
                stdout.flush()
                outmsg = stdout.read()
                print(outmsg)
                #outmsg = str(outmsg.decode()).replace("\\r\\n","")
                print(type(outmsg))
                if (outmsg==b0\r\n):
                    exc_result += "主机" + ip + "命令执行成功!</br>"
                    print(exc_result)
                else:
                    exc_result += "主机" + ip + "命令执行失败!</br>"
                    print(exc_result)
                ssh.close()
                #记录操作日志
                excuteip = get_client_ip(request)
                print(excuteip)
                models.ExecuteLog.objects.create(
                    hostip=ip,
                    hostuser=user,
                    hostpass=pwd,
                    hostcmd=command,
                    excuteuser=excuteuser,
                    excuteip=excuteip,
                )
            except:
                exc_result += "主机" + ip + "无法连接!</br>"
                print(exc_result)
                pass
        return HttpResponse(exc_result)

@permission_required(master.add_host)
@csrf_exempt
@login_required
def hostUpload(request):
    if request.method == GET:
        return render(request, execute.html)
    elif request.method == POST:
        excuteuser = request.user
        ip = request.POST.get(ipaddress)
        user = request.POST.get(remoteuser)
        pwd = request.POST.get(remotepwd)
        file = request.FILES.get(fileinput)
        import os
        shell_path = os.path.join(shell,file.name)
        if (os.path.exists(shell_path)):
            result = "文件已经存在,请重新命名文件再上传!"
        else:
            with open (shell_path,wb) as f:
                for item in file.chunks():    #chunks()分块,一点一点取数据(生成器,迭代器)
                    f.write(item)
            ssh = paramiko.Transport(ip, 22)
            ssh.connect(username=user, password=pwd)
            sftp = paramiko.SFTPClient.from_transport(ssh)
            localfile = shell_path
            remotefile = file.name
            try:
                sftp.put(localfile, remotefile)
                print("上传成功")
                result = "success!"
            except Exception:
                print("[-]put Error:User name or password error or uploaded file does not exist")
                result = "fail!"
            ssh.close()
            # 记录操作日志
            excuteip = get_client_ip(request)
            models.ExecuteLog.objects.create(
                hostip=ip,
                hostuser=user,
                hostpass=pwd,
                excuteuser=excuteuser,
                filepath=shell_path,
                excuteip=excuteip,
            )
        return HttpResponse(result)

# @login_required
# def hostMonitor(request):
#     if request.method == ‘GET‘:
#         status_obj = models.Host.status_choice
#         hostinfo = models.Host.objects.all()
#         hostgroup = models.HostGroup.objects.all()
        # ssh = paramiko.SSHClient()
        # ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # ssh.connect(‘121.196.192.5‘, 22, ‘lin‘, ‘Ningdeshidai-2018‘)
        # commands = [‘top -bn1 | grep Cpu | awk -F\‘ \‘ \‘{print $2}\‘‘,
        #             ‘free -h | grep Mem | awk -F\‘ \‘ \‘{print $7}\‘ | awk -F\‘G\‘ \‘{print $1}\‘‘,
        #             ‘df -hl | grep /dev/vda1 | awk -F\‘ \‘ \‘{print $5}\‘ | awk -F\‘%\‘ \‘{print $1}\‘‘,
        #             ]
        # result = []
        # redic = {}
        # for cmd in commands:
        #     stdin, stdout, stderr = ssh.exec_command(cmd)
        #     outmsg = stdout.read().decode()
        #     outmsg = outmsg.replace(‘\n‘,‘‘)
        #     result.append(outmsg)
        # print(result)
        # for i in range(len(result)):
        #     redic[‘num‘+str(i)] = result[i]
        #return render(request,‘monitor.html‘,{‘hostinfo‘:hostinfo,‘hostgroup‘:hostgroup,‘status_obj‘:status_obj,‘cpu_use‘:redic[‘num0‘],‘mem_use‘:redic[‘num1‘],‘disk_use‘:redic[‘num2‘]})
        #return render(request,‘monitor.html‘,{‘hostinfo‘:hostinfo,‘hostgroup‘:hostgroup,‘status_obj‘:status_obj,})

@permission_required(master.add_host)
@csrf_exempt
@login_required
def hostMonitor(request):
    if request.method == GET:
        status_obj = models.Host.status_choice
        hostinfo = models.Host.objects.all()
        hostgroup = models.HostGroup.objects.all()
        return render(request,monitor.html,{hostinfo:hostinfo,hostgroup:hostgroup,status_obj:status_obj})
    elif request.method == POST:
        hn = request.POST.get(hostname)
        hg = request.POST.get(hostgroup)
        st = request.POST.get(status)
        data = []
        redata = {}
        if (hn != ‘‘):
            host = models.Host.objects.filter(id=hn)
        if (hg != ‘‘):
            host = models.Host.objects.filter(hostgroup=hg)
        if (st != ‘‘):
            host = models.Host.objects.filter(status=st)
        for rhost in host:
            hname = rhost.alias
            hip = rhost.public_ip
            hroot = rhost.admin_root
            hpass = rhost.admin_pass
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(hip, 22, hroot, hpass)
            commands = [top -bn1 | grep Cpu | awk -F\‘ \‘ \‘{print $2}\‘,
                        free -h | grep Mem | awk -F\‘ \‘ \‘{print $7}\‘ | awk -F\‘G\‘ \‘{print $1}\‘,
                        df -hl | grep /dev/vda1 | awk -F\‘ \‘ \‘{print $5}\‘ | awk -F\‘%\‘ \‘{print $1}\‘,
                        ]
            result = []
            redic = {}
            for cmd in commands:
                stdin, stdout, stderr = ssh.exec_command(cmd)
                outmsg = stdout.read().decode()
                outmsg = outmsg.replace(\n, ‘‘)
                result.append(outmsg)
            #print(hip,result)
            for i in range(len(result)):
                redic[num + str(i)] = result[i]
            data.append(redic)
            for i in range(len(data)):
                redata[hname] = data[i]
        #redata={‘beida‘: {‘num0‘: ‘0.1‘, ‘num2‘: ‘19‘, ‘num1‘: ‘3.2‘}, ‘zhongyiyuan‘: {‘num0‘: ‘0.2‘, ‘num2‘: ‘19‘, ‘num1‘: ‘3.3‘}}
        print(redata)
        return HttpResponse(json.dumps(redata), content_type=application/json)

def hostSearch(request):
    hostgroup = models.HostGroup.objects.all()
    hostbusiness = models.Business.objects.all()
    line_status = request.POST.get(linestatus)
    group_host = request.POST.get(grouphost)
    business = request.POST.get(business)
    public_ip = request.POST.get(publicip)
    print(public_ip)
    private_ip = request.POST.get(privateip)
    hostname = request.POST.get(hostname)
    if (line_status != ‘‘):
        host = models.Host.objects.filter(status=line_status)
    if (group_host != ‘‘):
        host = models.Host.objects.filter(hostgroup_id=group_host)
    if (business != ‘‘):
        host = models.Host.objects.filter(business_id=business)
    if (public_ip != ‘‘):
        host = models.Host.objects.filter(public_ip=public_ip)
    if (private_ip != ‘‘):
        host = models.Host.objects.filter(private_ip=private_ip)
    if (hostname != ‘‘):
        host = models.Host.objects.filter(hostname=hostname)
    return render(request,search.html,{host_obj:host, hostgroup: hostgroup, business: hostbusiness,})

def get_client_ip(request):
    ‘‘‘nginx和fastcgi配置要加入如下,不然有可能获取不到HTTP_XFORWARED_FORREMOTE_ADDR‘‘‘
    ‘‘‘fastcgi_param REMOTE_ADDR $remote_addr;‘‘‘
    try:
        real_ip = request.META[HTTP_XFORWARED_FOR]
        reip = real_ip.split(",")[0]
    except:
        try:
            reip = request.META[REMOTE_ADDR]
        except:
            reip = ""
    return reip

 

效果

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

Python Django项目

原文:https://www.cnblogs.com/linyouyi/p/11448319.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!