python开发基础篇2——登陆机制

文章目录

  • 一、管理平台页面布局
  • 二、登录页面
    • 2.1 token登录
    • 2.2. kubeconfig登录
    • 2.3 添加装饰器

一、管理平台页面布局

应用名称:

  1. dashboard:存放公共

  2. k8s:

    • Node:K8s集群计算节点。
    • Namespaces:命名空间,用于隔离资源。
    • PersistentVolumes(PV):持久卷,存储数据
  3. workload:

    • Deployments:无状态应用部署控制器。
    • DaemonSets:守护进程控制器,在每个节点启动一个Pod。
    • StatefulSets:有状态应用部署控制器。
    • Pods:K8s最小部署单元
  4. loadbalancer:

    • Services:为Pod提供服务发现和负载均衡。
    • Ingresses:集群中应用统一入口,对外暴露应用
  5. storage:

    • PersistentVolumeClaims(PVC):持久卷申请,与PV绑定。
    • ConfigMaps:存储配置内容,例如应用程序配置文件。
    • Secrets:存储应用敏感数据,例如用户名密码

二、登录页面

登录认证流程:

  • AJAX提交登录认证数据 到服务端——> 验证提交数据格式合法性(编写一个登录认证检查函数)——> 确认没问题向session里写入认证信息 ——> 返回AJAX,AJAX跳转到首页。
    python开发基础篇2——登陆机制_第1张图片

2.1 token登录

  • 验证token登录验证逻辑。若输入的token是正确有效的,则会将token写入到数据库中的session保存,方便下次登录。

1.根据布局创建对象的django 应用。

python manage.py startapp dashboard
python manage.py startapp k8s
python manage.py startapp workload
python manage.py startapp loadbalancer
python manage.py startapp storage  

2.启用django默认数据库,用于保存session状态。

python manage.py makemigrations
python manage.py migrate

python开发基础篇2——登陆机制_第2张图片

3.验证代码。

##########################################################
##自定义模块。
from kubernetes import client,config
import os

#连接k8s验证输入的token或者kubeconfig是否有效。
def auth_check(auth_type,token):
    if auth_type == "token":
        configuration = client.Configuration()
        configuration.host = "https://192.168.161.120:6443"  # APISERVER地址
        # ca_file = os.path.join(os.getcwd(), "ca.crt") # K8s集群CA证书(/etc/kubernetes/pki/ca.crt)
        # configuration.ssl_ca_cert= ca_file
        configuration.verify_ssl = False
        configuration.api_key = {"authorization": "Bearer " + token}   ##固定格式。
        client.Configuration.set_default(configuration)
        apps_api = client.AppsV1Api()
        try:
            core_api = client.CoreApi()
            core_api.get_api_versions()  # 查看8s版本,由此验证是否有效的
            return True
        except Exception as e:
            print(e)
            return False
    elif auth_type == "kubeconfig":
        pass
##########################################################
##视图逻辑。
from django.shortcuts import render
from Layui import k8s  ##导入自定义模块。
from django.http import  JsonResponse

def index(request):
    return render(request,'index.html')

def login(request):
    if request.method == "GET":
        return render(request,'login.html')
    elif request.method == "POST":
        token =request.POST.get("token")
        #处理token登录。
        if token:
            if k8s.auth_check("token",token):  # 如token是有效登录成功
                request.session['is login'] = True
                request.session['auth_type'] = token  # 用于后期前端调用django,django拿这个信息去请k8s api
                request.session['token'] = token
                code = 0
                msg = "登录成功"
            else:
                code = 1
                msg = "Token无效!"
        else:
        #处理kubeconfig文件登录。
            file_obj  = request.FILES.get("file")
        result = {'code': code,'msg': msg}
        return JsonResponse(result)
##########################################################
##子模板文件。



    
    登录
    
    


{% csrf_token %}

欢迎访问Kubernetes管理平台

   

########################################################## ##母版文件。 {% block title %}{% endblock %}
{% block context%}{% endblock %}
{% block custom_js %}{% endblock %}

4.token验证,查看数据库是否保存了token信息。
python开发基础篇2——登陆机制_第3张图片
python开发基础篇2——登陆机制_第4张图片
5.验证数据库中的session保存的返回信息。
python开发基础篇2——登陆机制_第5张图片

2.2. kubeconfig登录

  • 验证使用正确的kubeconfig文件登录,则会登录到主页。

1.自定义一个类,在数据库中创建一张表,用于保存kubeconfig文件内容。

#######################################################
##生成一张数据库表,用于保存kubeconfig文件内容。dasshboard/models下定义一个类。
from django.db import models
class User(models.Model):
    auth_type = models.CharField(max_length=30)
    token = models.CharField(max_length=100)
    content = models.TextField()
    datetime = models.DateTimeField(auto_now=True)
#######################################################
##同步数据库。settings文件添加如下一行。
INSTALLED_APPS = [
     ......
    'dashboard'
]

python manage.py makemigrations
python manage.py migrate

python开发基础篇2——登陆机制_第6张图片
2.添加视图。

import requests
from django.shortcuts import render,redirect
from Layui import k8s  ##导入自定义模块。
from django.http import  JsonResponse
from  dashboard.models import User
def login(request):
    if request.method == "GET":
        return render(request,'login.html')
    elif request.method == "POST":
        token =request.POST.get("token")
        #处理token登录。
        if token:
            if k8s.auth_check("token",token):  # 如token是有效登录成功
                request.session['is_login'] = True
                request.session['auth_type'] = 'token'  # 用于后期前端调用django,django拿这个信息去请k8s api
                request.session['token'] = token
                code = 0
                msg = "登录成功"
            else:
                code = 1
                msg = "Token无效!"
        else:
           #处理kubeconfig文件登录。
            file_obj  = request.FILES.get("file")
            import random
            token_random = str(random.random()).split('.')[1]  ##生成一个随机数作为标识。
            try:
                content = file_obj.read().decode()  ##bytes ——> str
                User.objects.create(
                    auth_type="kubeconfig",
                    token=token_random,
                    content=content
                )
                code = 0
                msg = "登陆成功"
            except Exception:
                code = 1
                msg = "kubeconfig文件错误!"
            if k8s.auth_check('kubeconfig',token_random):
                request.session['is_login'] = True
                request.session['auth_type'] = 'kubeconfig'  # 用于后期前端调用django,django拿这个信息去请k8s api
                request.session['token'] = token_random
                code = 0
                msg = "登陆成功"
            else:
                User.objects.get(token=token_random).delete()
                code = 1
                msg = "kubeconfig文件无效!!!"
        result = {'code': code,'msg': msg}
        return JsonResponse(result)

3.修改自定义模块类。

from kubernetes import client,config
import os
from dashboard.models import User
import yaml

# 连接k8s验证输入的token或者kubeconfig是否有效。
def auth_check(auth_type,token=None):
    if auth_type == "token":
        configuration = client.Configuration()
        configuration.host = "https://192.168.161.120:6443"  # APISERVER地址
        # ca_file = os.path.join(os.getcwd(), "ca.crt") # K8s集群CA证书(/etc/kubernetes/pki/ca.crt)
        # configuration.ssl_ca_cert= ca_file
        configuration.verify_ssl = False
        configuration.api_key = {"authorization": "Bearer " + token}   ##固定格式。
        client.Configuration.set_default(configuration)
        apps_api = client.AppsV1Api()
        try:
            core_api = client.CoreApi()
            core_api.get_api_versions()  # 查看8s版本,由此验证是否有效的
            return True
        except Exception as e:
            print(e)
            return False
    elif auth_type == "kubeconfig":
        user = User.objects.get(token=token)
        content = user.content
        yaml_content = yaml.load(content, Loader=yaml.FullLoader) ##yaml文件转为json
        print(yaml_content)
        try:
            config.load_kube_config_from_dict(yaml_content)
            core_api = client.CoreApi()
            core_api.get_api_versions()   # 查看k8s版本,由此验证是否有效的
            return True
        except Exception as e:
            print(e)
            return False

4.使用正确的Kubeconfig文件登陆成功,其他文件登陆失败。
python开发基础篇2——登陆机制_第7张图片
python开发基础篇2——登陆机制_第8张图片

2.3 添加装饰器

  • 引用装饰器,使得访问127.0.0.1:8000也是登录页面,而不是首页。

1.在自定义模块文件中添加。

from   django.shortcuts import redirect
def self_login_required(func):
    def inner(request, *args, **kwargs):
        is_login = request.session.get('is_login', True)
        if is_login:
            return func(request, *args, **kwargs)
        else:
            return redirect("/login")
    return inner

2.首页引用装饰器。

@k8s.self_login_required
def index(request):
    return render(request,'index.html')

3.查看效果。
python开发基础篇2——登陆机制_第9张图片

你可能感兴趣的:(python开发,python,开发语言,运维开发,前端,javascript)