面试题答案
一键面试用户注册步骤
- 创建用户模型:在
models.py
中定义用户模型,继承AbstractUser
或AbstractBaseUser
,添加额外字段,如手机号、邮箱等。例如:
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=15, blank=True)
email = models.EmailField(unique=True)
- 创建注册视图:在
views.py
中编写注册视图函数,处理用户注册表单的提交。使用UserCreationForm
(或自定义表单)验证和保存用户数据。示例:
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from.models import CustomUser
def register(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return redirect('login')
else:
form = UserCreationForm()
return render(request,'register.html', {'form': form})
- 创建注册模板:在
templates
目录下创建register.html
模板,包含注册表单。
<!DOCTYPE html>
<html>
<head>
<title>Register</title>
</head>
<body>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Register</button>
</form>
</body>
</html>
- 配置URL:在
urls.py
中配置注册URL,将其映射到注册视图。
from django.urls import path
from. import views
urlpatterns = [
path('register/', views.register, name='register'),
]
用户登录步骤
- 创建登录视图:在
views.py
中编写登录视图函数,处理用户登录表单的提交。使用AuthenticationForm
验证用户登录信息,并使用login
函数登录用户。示例:
from django.shortcuts import render, redirect
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login, logout
def user_login(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
user = form.get_user()
login(request, user)
return redirect('home')
else:
form = AuthenticationForm()
return render(request, 'login.html', {'form': form})
- 创建登录模板:在
templates
目录下创建login.html
模板,包含登录表单。
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Login</button>
</form>
</body>
</html>
- 配置URL:在
urls.py
中配置登录URL,将其映射到登录视图。
from django.urls import path
from. import views
urlpatterns = [
path('login/', views.user_login, name='login'),
]
基于用户角色分配权限
- 定义用户角色:在用户模型中添加角色字段,如
role = models.CharField(max_length=20, choices=[('admin', 'Admin'), ('user', 'User')])
。 - 权限分配:
- 基于视图函数:在视图函数中,根据用户角色判断是否有权限执行操作。例如:
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
@login_required
def restricted_view(request):
if request.user.role == 'admin':
# 执行增删改操作
return render(request,'restricted.html')
else:
return redirect('home')
- **基于中间件**:创建自定义中间件,在请求处理前检查用户角色和权限。示例:
class RoleBasedMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.user.is_authenticated and request.user.role!= 'admin' and request.path.startswith('/admin_only/'):
return redirect('home')
response = self.get_response(request)
return response
在`settings.py`中添加中间件:`MIDDLEWARE = [
...
'your_app.middleware.RoleBasedMiddleware',
...
]`
3. 模板中权限控制:在模板中,根据用户角色显示或隐藏特定内容。例如:
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
</head>
<body>
{% if user.role == 'admin' %}
<a href="{% url 'create' %}">Create</a>
<a href="{% url 'delete' %}">Delete</a>
{% endif %}
</body>
</html>
主要模块和方法
django.contrib.auth
模块:提供用户认证和权限管理的核心功能。AbstractUser
和AbstractBaseUser
:用于创建自定义用户模型。UserCreationForm
:用于用户注册表单。AuthenticationForm
:用于用户登录表单。login
和logout
:用于用户登录和注销。
django.contrib.auth.decorators
模块:提供装饰器,如login_required
,用于限制未登录用户访问特定视图。- 自定义中间件:用于在请求处理过程中进行全局的权限检查。
- 模板标签:如
if
标签,在模板中根据用户角色控制内容显示。