第十九章 用户账户与数据管理
19.1 用户输入数据处理
19.1.1 添加新主题
操作步骤:
- 在models.py中定义Topic模型(需关联用户):
python
from django.contrib.auth.models import User
class Topic(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
语法说明:
-
ForeignKey建立用户与主题的一对多关系
-
on_delete=models.CASCADE表示用户删除时级联删除关联数据
- 在视图函数中限制访问:
python
from django.contrib.auth.decorators import login_required
@login_required
def new_topic(request):
if request.method == 'POST':
form = TopicForm(request.POST)
if form.is_valid():
new_topic = form.save(commit=False)
new_topic.owner = request.user # 关联当前用户
new_topic.save()
return redirect('learning_logs:index')
else:
form = TopicForm()
return render(request, 'new_topic.html', {'form': form})
用法解析:
-
@login_required装饰器限制未登录用户访问
-
commit=False暂不提交数据库,允许添加额外字段
19.2 创建用户认证系统
19.2.1 创建users应用
执行命令:
python
python manage.py startapp users
19.2.2 配置settings.py
在INSTALLED_APPS添加:
python
'users.apps.UsersConfig'
在文件末尾添加:
LOGIN_URL = 'users:login' # 指定登录页面路径
19.2.3 用户登录实现
登录视图示例:
python
from django.contrib.auth import authenticate, login
def user_login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('learning_logs:index')
else:
return HttpResponse('Invalid login')
return render(request, 'registration/login.html')
核心方法说明:
-
authenticate()验证用户凭证
-
login()创建用户会话
19.3 数据权限控制
19.3.1 查询过滤
在视图中限制数据访问:
python
def topic(request, topic_id):
topic = Topic.objects.get(id=topic_id)
if topic.owner != request.user:
raise Http404 # 非所有者触发404错误
entries = topic.entry_set.order_by('-date_added')
return render(request, 'topic.html', {'topic':topic, 'entries':entries})
第二十章 样式设置与部署
20.1 使用Bootstrap美化界面
20.1.1 安装django-bootstrap4
执行:
python
pip install django-bootstrap4
python
INSTALLED_APPS += ['bootstrap4']
20.1.2 修改base模板
在templates/base.html中添加:
html
{% load bootstrap4 %}
<head>
{% bootstrap_css %}
{% bootstrap_javascript jquery='full' %}
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<!-- 导航栏内容 -->
</nav>
<div class="container">
{% block content %}{% endblock %}
</div>
</body>
功能说明:
-
bootstrap4模板标签自动加载静态资源
-
container类实现响应式布局
20.2 部署到Heroku
20.2.1 准备部署文件
创建Procfile(无扩展名):
web: gunicorn learning_log.wsgi --log-file -
创建requirements.txt:
pip freeze > requirements.txt
20.2.2 修改settings.py
添加配置:
python
import django_heroku
DEBUG = False
ALLOWED_HOSTS = ['learning-log.herokuapp.com']
django_heroku.settings(locals())
关键参数说明:
-
DEBUG=False关闭调试模式
-
django_heroku自动配置数据库等环境变量
20.2.3 Heroku命令行操作
- 登录Heroku:
heroku login
- 创建应用:
heroku create learning-log
- 设置环境变量:
heroku config:set SECRET_KEY='your_secret_key_123'
- 部署代码:
git push heroku main
- 迁移数据库:
heroku run python manage.py migrate
20.3 安全强化措施
20.3.1 密钥保护
在环境变量中设置SECRET_KEY:
python
import os
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
20.3.2 HTTPS配置
在settings.py中强制HTTPS:
python
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
关键流程总结:
- 用户系统实现流程:
创建应用 -> 定义模型 -> 编写认证视图 -> 配置URL -> 模板集成
- 部署流程:
安装依赖 -> 配置适配文件 -> Heroku CLI操作 -> 数据库迁移 -> 安全设置
常见问题处理:
-
部署后静态文件丢失:需配置whitenoise中间件
-
Heroku数据库连接失败:检查DATABASE_URL环境变量
-
模板继承失效:确保模板目录在settings.py的TEMPLATES中正确定义