Python学习第十九天

news/2025/3/22 2:18:13/

Django-分页

后端分页

        Django提供了Paginator类来实现后端分页。Paginator类可以将一个查询集(QuerySet)分成多个页面,每个页面包含指定数量的对象。

python">from django.shortcuts import render, redirect, get_object_or_404
from .models import User
from .forms import UserForm
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger'''用户列表
'''
def user_list(request):user_list = User.objects.all()# 处理自定义值try:# 获取用户选择的每页显示数量,默认为 10per_page = int(request.GET.get('per_page', 10))per_page = int(per_page)  # 将 per_page 转换为整数if per_page <= 0:  # 如果输入的值小于等于0,设置为默认值10per_page = 10except (ValueError, TypeError):  # 如果 per_page 不是数字,设置为默认值10per_page = 10# 分页paginator = Paginator(user_list, per_page)page_number = request.GET.get('page')try:page_obj = paginator.get_page(page_number)  # 获取当前页except PageNotAnInteger:  # 如果 page 不是整数,跳转到第一页page_obj = paginator.get_page(1)except EmptyPage:  # 如果 page 超出范围,跳转到最后一页page_obj = paginator.get_page(paginator.num_pages)# 允许的每页显示数量列表allowed_per_page = [10, 20, 50, 100, 200]return render(request, 'myapp/user_list.html', {'page_obj': page_obj,'per_page': per_page,  # 将每页显示数量传递给模板'allowed_per_page': allowed_per_page,})

前端分页

      通用前端的分页代码支持输入页码,也支持选择页码,跳转到对应页面

<nav aria-label="Page navigation" class="mt-4"><ul class="pagination justify-content-center"><!-- 首页按钮 -->{% if page_obj.has_previous %}<li class="page-item"><a class="page-link" href="?page=1&per_page={{ per_page }}" aria-label="First"><span aria-hidden="true">首页</span></a></li>{% else %}<li class="page-item disabled"><span class="page-link">首页</span></li>{% endif %}<!-- 上一页按钮 -->{% if page_obj.has_previous %}<li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}&per_page={{ per_page }}" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>{% else %}<li class="page-item disabled"><span class="page-link">上一页</span></li>{% endif %}<!-- 当前页码信息 --><li class="page-item active"><span class="page-link">第 {{ page_obj.number }} 页,共 {{ page_obj.paginator.num_pages }} 页</span></li><!-- 下一页按钮 -->{% if page_obj.has_next %}<li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}&per_page={{ per_page }}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>{% else %}<li class="page-item disabled"><span class="page-link">下一页</span></li>{% endif %}<!-- 末页按钮 -->{% if page_obj.has_next %}<li class="page-item"><a class="page-link" href="?page={{ page_obj.paginator.num_pages }}&per_page={{ per_page }}" aria-label="Last"><span aria-hidden="true">末页</span></a></li>{% else %}<li class="page-item disabled"><span class="page-link">末页</span></li>{% endif %}</ul><!-- 输入页码跳转和选择每页显示数量 --><div class="d-flex justify-content-center mt-3"><!-- 输入页码跳转 --><form method="get" action="" class="form-inline mr-3"><div class="input-group"><input type="number" name="page" class="form-control" min="1" max="{{ page_obj.paginator.num_pages }}"placeholder="页码" aria-label="页码" required><input type="hidden" name="per_page" value="{{ per_page }}"><div class="input-group-append"><button type="submit" class="btn btn-outline-primary">跳转</button></div></div></form><!-- 选择每页显示数量 --><form method="get" action="" class="form-inline"><div class="input-group"><select name="per_page" class="form-control" aria-label="每页显示数量" onchange="this.form.submit()"><option value="10" {% if per_page == 10 %}selected{% endif %}>10 条/页</option><option value="20" {% if per_page == 20 %}selected{% endif %}>20 条/页</option><option value="50" {% if per_page == 50 %}selected{% endif %}>50 条/页</option><option value="100" {% if per_page == 100 %}selected{% endif %}>100 条/页</option><option value="200" {% if per_page == 200 %}selected{% endif %}>200 条/页</option><option value="1" {% if per_page != 10 and per_page != 20 and per_page != 50 and per_page != 100 and per_page != 200 %}selected{% endif %}>自定义</option></select>{% if per_page != 10 and per_page != 20 and per_page != 50 and per_page != 100 and per_page != 200 %}<input type="number" name="per_page" class="form-control ml-2" min="1"value="{{ per_page }}" placeholder="自定义" aria-label="自定义" required>{% endif %}</div></form></div>
</nav>

静态资源配置

使用

在前端中需要引入背景图或者其他的静态资源

配置settings.py

# 静态资源
STATIC_URL = 'static/'
import os
# 静态文件目录
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),           # 全局静态文件目录os.path.join(BASE_DIR, 'user/static'),     # user app 的静态文件目录
]

目录以及加载使用

html中使用

<!-- 加载静态文件 -->
{% load static %}
<!-- 全局静态文件 -->
<!--<body style="background-image: url('{% static '02.png' %}');">-->
<!-- 引入app下的的静态文件 --><body style="background-image: url('{% static 'user/images/backgroud_image.png' %}');">

防止多次加载

        在 Django 模板中,使用 {% block %} 来定义可覆盖的区域,避免在多个模板中重复加载相同的静态资源。(主要是使用这个其他通过继承这部分内容 有点像是iframe标签 引入了部分代码块)

# 在main.html中使用{% block content %}{% endblock %}<!-- 加载静态文件 -->
{# main.html注释哈 #}
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}首页{% endblock %}</title>
</head>
<!-- 全局静态文件 -->
<!--<body style="background-image: url('{% static '02.png' %}');">-->
<!-- 引入app下的的静态文件 比如使用app下的静态资源不需要重复引入 -->
<body style="background-image: url('{% static 'user/images/backgroud_image.png' %}');">
<a href="{% url 'main' %}">首页</a>
<a href="{% url 'register' %}">注册</a>
<a href="{% url 'login' %}">登录</a>
{# 主要是使用这个其他通过继承这部分内容 有点像是iframe标签 引入了部分代码块 #}
{% block content %}{% endblock %}
</body>
</html>

子类通过继承{% extends 'main.html' %} 以及主类中的{% block 名称%}

{# login.html的模版 继承main的静态资源只需要写自己的相关代码块即可 #}
{% extends 'main.html' %}{% block content %}
用户名:<input name="username" value ="" placeholder="请输入用户名"/>
密码:<input name="password" value ="" placeholder="请输入密码"/>
{% endblock%}

加密

hashlib 

hashlib 是 Python 标准库中的一个模块,支持多种哈希算法(如 SHA-256、MD5 等)。哈希是单向加密,通常用于存储密码。

使用

python">import hashlibdef hash_password_sha256(password):# 使用 SHA-256 哈希算法hashed_password = hashlib.sha256(password.encode()).hexdigest()return hashed_passworddef hash_password_md5(password):"""使用 MD5 哈希算法对密码进行加密:param password: 原始密码(字符串):return: 哈希后的密码(16进制字符串)"""# 创建 MD5 哈希对象md5_hash = hashlib.md5()# 更新哈希对象,需要将密码编码为字节md5_hash.update(password.encode('utf-8'))# 获取哈希值(16进制字符串)hashed_password = md5_hash.hexdigest()return hashed_password
password = "123456"
hashed = hash_password_md5(password)
print("Hashed Password:", hashed)

bcrypt

bcrypt 是一个专门用于密码哈希的库,安全性更高,因为它会自动加盐(salt)并支持慢哈希(防止暴力破解)。

安装

pip install bcrypt

使用

python">import bcryptdef hash_password(password):# 生成盐并哈希密码salt = bcrypt.gensalt()hashed_password = bcrypt.hashpw(password.encode(), salt)return hashed_passworddef check_password(password, hashed_password):# 验证密码是否匹配return bcrypt.checkpw(password.encode(), hashed_password)password = "123456"
hashed = hash_password(password)
print("Hashed Password:", hashed)# 验证密码
is_valid = check_password("123456", hashed)
print("Password is valid:", is_valid)

cryptography

如果需要双向加密(即可以解密),可以使用 cryptography 库。

安装

pip install cryptography

使用

python">from cryptography.fernet import Fernet# 生成密钥
key = Fernet.generate_key()
cipher_suite = Fernet(key)def encrypt_password(password):# 加密密码encrypted_password = cipher_suite.encrypt(password.encode())return encrypted_passworddef decrypt_password(encrypted_password):# 解密密码decrypted_password = cipher_suite.decrypt(encrypted_password).decode()return decrypted_passwordpassword = "123456"
encrypted = encrypt_password(password)
print("Encrypted Password:", encrypted)# 解密密码
decrypted = decrypt_password(encrypted)
print("Decrypted Password:", decrypted)

对比

方法库/模块加密类型特点适用场景
哈希加密hashlib单向加密使用哈希算法(如 SHA-256、MD5),不可逆,适合存储密码。密码存储、数据完整性校验
加盐哈希bcrypt单向加密自动加盐,支持慢哈希,防止彩虹表攻击,安全性高。密码存储(推荐)
对称加密cryptography双向加密使用密钥加密和解密,适合需要还原数据的场景。加密敏感数据(如配置文件)

http://www.ppmy.cn/news/1581032.html

相关文章

观察者模式详解:用 Qt 信号与槽机制深入理解

引言 你是否曾遇到这样的需求&#xff1a;一个对象的状态发生变化后&#xff0c;希望通知其他对象进行相应的更新&#xff1f;比如&#xff1a; 新闻订阅系统&#xff1a;当新闻发布后&#xff0c;所有订阅者都会收到通知。股票行情推送&#xff1a;股价变化时&#xff0c;所…

实时监控、数据分析!Web-Check构建你的网站健康检测系统实操方案

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 在数字化运维领域&#xff0c;网站稳定性保障始终是开发者和运维团队的核…

Towards Universal Soccer Video Understanding——论文学习(足球类)

一、主要内容 作为一项享誉全球的运动&#xff0c;足球吸引了世界各地球迷的广泛兴趣。本文旨在为足球视频的理解开发一个全面的多模态框架。具体来说&#xff0c;在本文中做出了以下贡献:(i)引入了SoccerReplay-1988&#xff0c;这是迄今为止最大的多模式足球数据集&#xff0…

【Linux】应用层自定义协议 + 序列化和反序列化

应用层自定义协议 序列化和反序列化 一.应用层1.再谈 "协议"2.序列化 和 反序列化 二. Jsoncpp1.序列化2.反序列化 三. Tcp全双工 面向字节流四.自定义协议 保证报文的完整性1.Makefile2.Mutex.hpp3.Cond.hpp4.Log.hpp5.Thread.hpp6.ThreadPool.hpp7.Common.hpp8.…

conda、poetry,pip相关

poetry poetry 是一个 Python 打包和依赖管理工具&#xff0c;旨在简化 Python 包的创建、发布和依赖管理。与传统的 setuptools、pip 和 requirements.txt 的组合相比&#xff0c;poetry 提供了一个统一和简化的工具和工作流程。 以下是关于 poetry 的详细介绍&#xff1a; …

Web 小项目: 网页版图书管理系统

目录 最终效果展示 代码 Gitee 地址 1. 引言 2. 留言板 [热身小练习] 2.1 准备工作 - 配置相关 2.2 创建留言表 2.3 创建 Java 类 2.4 定义 Mapper 接口 2.5 controller 2.6 service 3. 图书管理系统 3.1 准备工作 - 配置相关 3.2 创建数据库表 3.2.1 创建用户表…

ChatTTS 开源文本转语音模型本地部署 API 使用和搭建 WebUI 界面

ChatTTS&#xff08;Chat Text To Speech&#xff09;&#xff0c;专为对话场景设计的文本生成语音(TTS)模型&#xff0c;适用于大型语言模型(LLM)助手的对话任务&#xff0c;以及诸如对话式音频和视频介绍等应用。支持中文和英文&#xff0c;还可以穿插笑声、说话间的停顿、以…

使用 Hyperlane 框架的 WebSocket 功能

使用 Hyperlane 框架的 WebSocket 功能 概述 hyperlane 是一个轻量级且高性能的 Rust HTTP 服务器库&#xff0c;支持 HTTP 请求解析、响应构建、TCP 通信&#xff0c;同时也支持 WebSocket 和 SSE 等实时通信协议。hyperlane 框架内置了 WebSocket 支持&#xff0c;能够自动…