Python-用户账户与应用程序样式

第十九章 用户账户与数据管理

19.1 用户输入数据处理

19.1.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表示用户删除时级联删除关联数据

  1. 在视图函数中限制访问:
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  

配置settings.py

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命令行操作

  1. 登录Heroku:

heroku login

  1. 创建应用:

heroku create learning-log

  1. 设置环境变量:

heroku config:set SECRET_KEY='your_secret_key_123'

  1. 部署代码:

git push heroku main

  1. 迁移数据库:

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  

关键流程总结:

  1. 用户系统实现流程:

创建应用 -> 定义模型 -> 编写认证视图 -> 配置URL -> 模板集成

  1. 部署流程:

安装依赖 -> 配置适配文件 -> Heroku CLI操作 -> 数据库迁移 -> 安全设置

常见问题处理:

  • 部署后静态文件丢失:需配置whitenoise中间件

  • Heroku数据库连接失败:检查DATABASE_URL环境变量

  • 模板继承失效:确保模板目录在settings.py的TEMPLATES中正确定义

相关推荐
橘猫云计算机设计1 小时前
springboot基于hadoop的酷狗音乐爬虫大数据分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·hadoop·spring boot·爬虫·python·数据分析·毕业设计
卓怡学长2 小时前
w304基于HTML5的民谣网站的设计与实现
java·前端·数据库·spring boot·spring·html5
冰^2 小时前
MySQL VS SQL Server:优缺点全解析
数据库·数据仓库·redis·sql·mysql·json·数据库开发
电商数据girl2 小时前
产品经理对于电商接口的梳理||电商接口文档梳理与接入
大数据·数据库·python·自动化·产品经理
Spring小子3 小时前
黑马点评商户查询缓存--缓存更新策略
java·数据库·redis·后端
Tech Synapse4 小时前
人脸识别考勤系统实现教程:基于Face-Recognition、OpenCV与SQLite
人工智能·opencv·sqlite
溜溜刘@♞4 小时前
数据库之mysql优化
数据库·mysql
uwvwko5 小时前
ctfhow——web入门214~218(时间盲注开始)
前端·数据库·mysql·ctf
柯3495 小时前
Redis的过期删除策略和内存淘汰策略
数据库·redis·lfu·lru
Tiger_shl5 小时前
【Python语言基础】24、并发编程
java·数据库·python