使用者模型設計
定義一個名為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變量通路目前使用者擁有的騰訊雲資源對象清單。可以根據需要修改和完善騰訊雲資源清單頁面,例如添加篩選、排序、分頁等功能。