天天看點

Django開發基于terraform管理騰訊雲資源的CMDB系統:使用者子產品

使用者模型設計

定義一個名為UserProfile的使用者模型,包含以下字段:

  • username: 使用者名
  • password: 密碼
  • email: 郵箱
  • phone: 手機号
  • is_active: 是否激活
  • is_superuser: 是否超級管理者
  • is_staff: 是否職員
  • date_joined: 注冊日期
  • last_login: 最後登入日期
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class UserManager(BaseUserManager):
    def create_user(self, username, password=None, **extra_fields):
        if not username:
            raise ValueError('The username must be set')
        user = self.model(username=username, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        return self.create_user(username, password, **extra_fields)

class UserProfile(AbstractBaseUser):
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(max_length=254, null=True, blank=True)
    phone = models.CharField(max_length=11, null=True, blank=True)
    is_active = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(auto_now=True)

    USERNAME_FIELD = 'username'

    objects = UserManager()

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_admin(self):
        return self.is_staff and self.is_superuser

    @property
    def is_staff(self):
        return self.is_staff

    class Meta:
        db_table = 'user_profile'
        verbose_name = '使用者'
        verbose_name_plural = verbose_name           

注冊和登入視圖

定義注冊和登入視圖,包括注冊和登入表單、表單驗證、重定向等功能,實作使用者的注冊和登入功能。

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from .forms import UserRegisterForm

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Account created for {username}!')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

def user_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('index')
        else:
            messages.error(request, '使用者名或密碼錯誤')
    return render(request, 'users/login.html')           

base.html模闆代碼:

<!DOCTYPE html>
<html>
  <head>
    <title>{% block title %}{% endblock %}</title>
  </head>
  <body>
    <nav>
      <ul>
        <li><a href="/">Home</a></li>
        {% if user.is_authenticated %}
          <li><a href="/profile/">Profile</a></li>
          <li><a href="/logout/">Logout</a></li>
        {% else %}
          <li><a href="/login/">Login</a></li>
          <li><a href="/signup/">Signup</a></li>
        {% endif %}
      </ul>
    </nav>
    {% block content %}
    {% endblock %}
  </body>
</html>
           

以上代碼定義了一個基本的HTML模闆,包含了一個導航欄和一個content塊。導航欄包含了幾個連結,根據使用者是否已認證來顯示不同的連結。如果使用者已認證,則顯示Profile和Logout連結,否則顯示Login和Signup連結。

在content塊中,子模闆可以定義自己的内容,例如登入表單、系統資料庫單、個人資料頁面等等。

注冊頁

{% extends "base.html" %}

{% block title %}Signup{% endblock %}

{% block content %}
  <h2>Signup</h2>
  <form method="post">
    {% csrf_token %}
    <label for="email">Email</label>
    <input type="email" id="email" name="email" required>
    <br><br>
    <label for="password1">Password</label>
    <input type="password" id="password1" name="password1" required>
    <br><br>
    <label for="password2">Confirm Password</label>
    <input type="password" id="password2" name="password2" required>
    <br><br>
    <button type="submit">Signup</button>
  </form>
{% endblock %}           

以上代碼使用了Django模闆語言,繼承了base.html模闆,并在content塊中定義了一個簡單的系統資料庫單。表單使用POST方法送出,并包含了一個csrf_token字段,用于防止跨站請求僞造攻擊。

系統資料庫單包含了三個必填字段:email、password1和password2。其中,password1和password2用于輸入密碼和确認密碼,確定使用者輸入的密碼正确無誤。注冊按鈕使用了預設的樣式,可以根據需要進行自定義樣式。

登陸頁

{% extends "base.html" %}

{% block content %}
  <h2>Login</h2>
  <form method="post">
    {% csrf_token %}
    <label for="email">Email</label>
    <input type="email" id="email" name="email" required>
    <br><br>
    <label for="password">Password</label>
    <input type="password" id="password" name="password" required>
    <br><br>
    <button type="submit">Login</button>
  </form>
{% endblock %}           

以上代碼使用了Django模闆語言,繼承了base.html模闆,并在content塊中定義了一個簡單的登入表單。表單使用POST方法送出,并包含了一個csrf_token字段,用于防止跨站請求僞造攻擊。

登入表單包含了兩個必填字段:email和password,使用者需要輸入正确的郵箱和密碼才能登入。登入按鈕使用了預設的樣式,可以根據需要進行自定義樣式。

使用者資訊視圖

定義使用者資訊視圖,包括顯示使用者資訊、修改使用者資訊等功能,實作使用者資訊的管理和維護。

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .forms import UserUpdateForm

@login_required
def profile(request):
    if request.method == 'POST':
        form = UserUpdateForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')
    else:
        form = UserUpdateForm(instance=request.user)
    return render(request, 'users/profile.html', {'form': form})           

使用者資訊頁

{% extends "base.html" %}

{% block title %}Profile{% endblock %}

{% block content %}
  <h2>Profile</h2>
  <p><strong>Email:</strong> {{ user.email }}</p>
  <p><strong>Username:</strong> {{ user.username }}</p>
  <p><strong>First Name:</strong> {{ user.first_name }}</p>
  <p><strong>Last Name:</strong> {{ user.last_name }}</p>
{% endblock %}           

以上代碼使用了Django模闆語言,繼承了base.html模闆,并在content塊中定義了一個簡單的個人資料頁面。頁面顯示了目前使用者的基本資訊,包括郵箱、使用者名、名字和姓氏等。

在模闆中,可以通過user變量通路目前登入的使用者對象。可以根據需要修改和完善個人資料頁面,例如添加使用者頭像、修改密碼、編輯個人資料等。

使用者權限控制

不同的使用者擁有不同的權限,管理者可以對使用者的權限進行控制和管理。是以需要定義使用者權限控制子產品,包括角色管理、權限管理等功能。

from django.contrib.auth.models import Permission, Group

# 定義角色
class Role(models.Model):
    name = models.CharField(max_length=50, unique=True)
    permissions = models.ManyToManyField(Permission)

    class Meta:
        db_table = 'role'

# 定義使用者組
class Group(models.Model):
    name = models.CharField(max_length=50, unique=True)
    roles = models.ManyToManyField(Role)

    class Meta:
        db_table = 'group'
        verbose_name = '使用者組'
        verbose_name_plural = verbose_name

# 定義權限控制視圖
from django.contrib.auth.decorators import permission_required

@permission_required('auth.view_permission')
def permission_list(request):
    permissions = Permission.objects.all()
    return render(request, 'users/permission_list.html', {'permissions': permissions})

@permission_required('auth.add_permission')
def permission_create(request):
    if request.method == 'POST':
        form = PermissionForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, f'Permission created successfully!')
            return redirect('permission_list')
    else:
        form = PermissionForm()
    return render(request, 'users/permission_create.html', {'form': form})           

內建Terraform騰訊雲資源管理

通常需要管理和維護各種雲資源,如Terraform騰訊雲資源等。可以使用騰訊雲SDK和Terraform API實作對Terraform騰訊雲資源的管理和維護。

import json
import requests

# 調用Terraform API擷取騰訊雲資源清單
def get_tencent_cloud_resources():
    url = 'https://api.terraform.io/v1/organizations/{organization}/workspaces/{workspace}/runs'
    headers = {
        'Authorization': 'Bearer {token}',
        'Content-Type': 'application/vnd.api+json'
    }
    payload = {
        'filter': {
            'status': ['applied']
        }
    }
    r = requests.get(url, headers=headers, params=payload)
    data = json.loads(r.text)
    resources = []
    for item in data['data']:
        if item['attributes'].get('target-addresses'):
            resources.append(item['attributes']['target-addresses'])
    return resources

# 在CMDB系統中顯示騰訊雲資源清單
@login_required
def tencent_cloud_resources(request):
    resources = get_tencent_cloud_resources()
    return render(request, 'users/tencent_cloud_resources.html', {'resources': resources})           

使用者資源頁

{% extends "base.html" %}

{% block title %}Tencent Cloud Resources{% endblock %}

{% block content %}
  <h2>Tencent Cloud Resources</h2>
  <ul>
    {% for resource in resources %}
      <li>{{ resource.name }} - {{ resource.type }}</li>
    {% empty %}
      <li>No resources found.</li>
    {% endfor %}
  </ul>
{% endblock %}
           

以上代碼使用了Django模闆語言,繼承了base.html模闆,并在content塊中定義了一個簡單的騰訊雲資源清單頁面。頁面顯示了目前使用者的騰訊雲資源清單,包括資源名稱和類型等。

在模闆中,可以通過resources變量通路目前使用者擁有的騰訊雲資源對象清單。可以根據需要修改和完善騰訊雲資源清單頁面,例如添加篩選、排序、分頁等功能。