Django Project | 云笔记练习项目

news2025/2/28 23:22:51

文章目录

    • 功能
    • 整体架构流程
    • 搭建平台环境
    • 子功能
      • 先创建用户表 并同步到数据库
      • 1.用户注册
        • 密码存储 -- 哈希算法
        • 唯一索引引发的重复问题 try
        • 登陆状态保持 -- 详细看用户登录状态
      • 2. 用户登录
        • 会话状态时间 + cookie
        • 用户登录状态校验
      • 3. 网站首页
      • 4.退出登录
      • 5.笔记模块 列表页
        • 添加笔记
    • 补充
      • 哈希算法

功能

Django搭建的在线云笔记项目 支持如下功能:

  1. 用户登录、注册
  2. 登录用户的笔记创建、展示
  3. 页面登录状态检测
  4. 登陆状态【免登录】设置
  5. 扩展-- 删除、更改【没写】

源码:GitHub云笔记小项目

资源:Django框架练习之云笔记项目

建议大家多使用git练习从GitHub上下载资源

整体架构流程

在这里插入图片描述

搭建平台环境

  • 基于pycharm社区版本搭建

有的可能命令行使用python3y语句有效果 我的是python 看个人

# 命令行创建
1. 创建项目	django-admin startproject tedu_note
2. 创建应用  python manage.py startapp user # 【注意 python3 manage.py startapp user 可能没有效果】
3. 创建数据库tedu_note  # [Navicat直接登录手动创建]

在这里插入图片描述
4. 配置settings.py
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5. 启动项目

python manage.py runserver 【注意 python3 manage.py runserver没有效果】

在这里插入图片描述

子功能

先创建用户表 并同步到数据库

在这里插入图片描述

  1. 创建用户表
class User(models.Model):
    username = models.CharField(verbose_name="用户名",max_length=30,unique=True)

    password = models.CharField('密码',max_length=32)

    created_time = models.DateTimeField('创建时间',auto_now_add = True) # 第一次被创建时自动设置为当前日期和时间

    updated_time = models.DateTimeField('更新时间',auto_now = True) # 在模型的任何 save() 操作时自动设置为当前日期和时间

    def __str__(self): # 影响输出格式
        return 'username %s' % (self.username)
  • 同步数据库 使用的是python 不是python3

python manage.py makemigrations
python manage.py migrate

在这里插入图片描述

1.用户注册

在这里插入图片描述

  • views.py
# views.py文件中的视图函数
def reg_view(request):
    #注册
    if request.method == 'GET':
        # GET 返回页面
        return render(request,'user/register.html')
    elif request.method == 'POST':
        username = request.POST['username']
        pass1 = request.POST['password_1']
        pass2 = request.POST['password_2']


        # POST 处理提交数据

        #  1. 密码一致
        if pass1 != pass2:
            return HttpResponse('两次输入密码不一致!!!')
        #  2.当前用户名是否可用  检查是否注册
        old_user = User.objects.filter(username=username)
        if old_user:
            return HttpResponse('用户名已注册!!!')
        # 插入数据 【明文处理】
        User.objects.create(username=username,password = pass1)
        return HttpResponse('注册成功!')
  • 上述代码问题
    ​ 明文密码如何处理?
    ​ 多用户同时并行插入问题?
    ​ 产品经理要求注册则免登陆一天,这功能怎么做?
密码存储 – 哈希算法

直接使用明文密码的潜在风险 需要加密

def reg_view(request):
    #注册
    if request.method == 'GET':
        # GET 返回页面
        return render(request,'user/register.html')
    elif request.method == 'POST':
        username = request.POST['username']
        pass1 = request.POST['password_1']
        pass2 = request.POST['password_2']

        # POST 处理提交数据
        #  1. 密码一致
        if pass1 != pass2:
            return HttpResponse('两次输入密码不一致!!!')

        # 哈希算法 - 给定明文  计算出一段定长的  不可逆的值  md5  sha-256
        # 特点
        # 1. 定长输出 : 不管明文输入长度多少  哈希值定长  md5 - 32位 16进制  【解释密码设置32】
        # 2. 不可逆 :无法反向计算出 对应 的 明文
        # 3. 雪崩效应 输入改变 输出改变
        # 场景 : 1.密码处理    2.文件的完整性校验
        # 如何使用 方法调用
        m = hashlib.md5()
        m.update(pass1.encode())  # encode()变成字节串
        pass1_hash = m.hexdigest()  # 生成哈希值

        #  2.当前用户名是否可用  检查是否注册
        old_user = User.objects.filter(username=username)
        if old_user:
            return HttpResponse('用户名已注册!!!')
        # 插入数据 【明文处理】
        User.objects.create(username=username,password=pass1_hash)
        return HttpResponse('注册成功!')

在这里插入图片描述

唯一索引引发的重复问题 try

请求量大 User.objects.create 会报错 在username该字段 因为是唯一字段 可能由于并发注册问题 发生重复写入问题 对于这类问题 善于用try解决

在这里插入图片描述

try :
    User.objects.create(username=username,password=pass1_hash)
except Exception as e:
    # 由于唯一索引 报错 重复插入 【唯一索引注意并发写入问题】
    print('--create user error %s' % (e))
    return HttpResponse('用户名已注册')
登陆状态保持 – 详细看用户登录状态
# 免登录一天 session  用户名  主键  存入 session
request.session['username'] = username
request.session['uid'] = user.id
# TODO 修改session存储时间为1天   settings.py
# SESSION_COOKIE_AGE  =  86400  # 1天 = 24小时 * 60分钟 * 60秒 = 86400秒
  • settings.py设置一天时间
    在这里插入图片描述

2. 用户登录

在这里插入图片描述

def login_view(request):
    if request.method == 'GET':
        # GET 返回页面
        return render(request,'user/login.html')
    elif request.method == 'POST':
        # 获得数据
        username = request.POST['username']
        password = request.POST['password']

        # 查询  是否有此人
        # username 是唯一索引
        try:
            user = User.objects.get(username=username) # 找不到 肯定没有
        except Exception as e:
            print('--login user error %s' % (e))
            return HttpResponse('用户名或者密码错误!!!')

        # 比对密码  因为哈希不可逆 所以从新生成哈希  用哈希数值进行比对
        m = hashlib.md5()
        m.update(password.encode())
        if m.hexdigest() != user.password:
            return HttpResponse('用户名或密码错误')

        # 记录会话状态
        # 免登录一天 session  用户名  主键  存入 session
        request.POST['username'] = username
        request.POST['uid'] = user.id

        return HttpResponse('登录成功!!!')
会话状态时间 + cookie

在这里插入图片描述
1 记住用户名 免登录三天

# 判断有没有✔  通过检查浏览器响应分析 checkbox的状态 remember=on
# #点选了->Cookies存储username,uid时间3天
resp = HttpResponse('--------success---------')
if 'remember' in request.POST:
    resp.set_cookie('username', username, 3600 * 24 * 3)
    resp.set_cookie('uid', user.id, 3600 * 24 * 3)

return resp

13号写的程序
在这里插入图片描述
2. 不记住 一天 就是session
在这里插入图片描述

用户登录状态校验

在这里插入图片描述
在这里插入图片描述

3. 网站首页

在这里插入图片描述

4.退出登录

在这里插入图片描述

5.笔记模块 列表页

在这里插入图片描述

添加笔记

在这里插入图片描述

补充

哈希算法

import hashlib
m = hashlib.md5()
m.update(b'明文')  # 必须字节b串
m.hexdigest()  # hexdigest 理解为16紧进制摘要


# 若要想要计算新的数值
# 从新这样生成
m = hashlib.md5()
m.update(b'明文')  # 必须字节b串
m.hexdigest()  # hexdigest 理解为16紧进制摘要

# 若是直接update  相当于两次明文的拼接 

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2040229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AFSim 仿真系统----脚本

概述 脚本为用户提供了一种在模拟中基于发生的事件执行复杂指令集的方式。该语言类似于 C# 和 Java,对于具备基本编程技能的人来说应该会很熟悉。它采用块结构,包含熟悉的声明、赋值和控制流语句,允许用户检查和操作模拟环境。 脚本本质上是由…

【Linux】sersync 实时同步

原理 rsync 是不支持实时同步的,通常我们借助于 inotify 这个软件来实时监控文件变化,一旦inotify 监控到文件变化,则立即调用 rsync 进行同步,推送到 rsync 服务端。 环境准备 步骤1:获取数据包 获取 sersync 的包…

UE5学习笔记12-为角色添加蹲下的动作

一、一点说明 1.蹲下使用了ACharacter类中Crouch();函数,函数功能是先检查是否存在运动组件,将bool类型的变量变为true,该变量代表是想要蹲下。 2.通过源码可知存在是否蹲下的bool变量bIsCrouched如图,如果对:1有疑问请搜索C位域 …

C++ | C++中的继承和组合:代码复用的艺术和应用

目录 一、继承:代码复用的艺术 1、继承概念 代码说明1:继承方式和访问控制 代码说明2:作用域与成员访问 代码说明3:构造函数和析构函数 2、基类和派生类对象赋值转换 派生类对象到基类对象的转换(向上转型): 基…

Jmeter+Influxdb+Grafana平台监控性能测试过程(三种方式)

一、Jmeter自带插件监控 下载地址:Install :: JMeter-Plugins.org 安装:下载后文件为jmeter-plugins-manager-1.3.jar,将其放入jmeter安装目录下的lib/ext目录,然后重启jmeter,即可。 启动Jmeter,测试计…

python-opencv卷积计算代码

目录 # 尝试不同的卷积核 卷积图片如下: 卷积调用类如下: 当我们在图像上应用卷积时,我们在两个维度上执行卷积——水平和竖直方向。我们混合两桶信息:第一桶是输入的图像,由三个矩阵构成——RGB 三通道&#xff0c…

Cobalt—超简单下载器!!【送源码】

我们每天都在网上冲浪,遇到喜欢的视频、音频总想保存下来慢慢回味。很多平台并不直接提供下载功能,或者下载过程繁琐还伴有各种广告。之前了不起给大家介绍过不少开源的下载工具,如Gopeed、lux、Hitomi-Downloader,各有各的特色。…

机械学习—零基础学习日志(如何理解线性代数2)

零基础为了学人工智能,正在快乐学习,每天都长脑子 引言 在平面中,直线的定义可以理解为,任意缩放同一个平面向量得到所有点的集合。 所以要得到一个三维空间中的直线,只需要将这个向量改成三维向量即可。 什么是线…

Python | Leetcode Python题解之第337题打家劫舍III

题目: 题解: # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val x # self.left None # self.right Noneclass Solution:def rob(self, root: TreeNode) -> int:def _rob…

数字图像处理(Matlab实践篇)专栏介绍

专栏导读 数字图像处理技术是计算机视觉、医学成像、遥感探测等领域的基石。Matlab,以其强大的数学计算能力和丰富的图像处理工具箱,成为学习和实践数字图像处理的理想选择。本专栏将带领读者从基础概念出发,逐步深入到高级技术,…

Redis:缓存击穿

缓存击穿 在某些 Key 属于极端热点数据,且并发量很大的情况下,如果这个 Key 过期,可能会在某个瞬间出现大量的并发请求同时回源,相当于大量的并发请求直接打到了数据库。这种情况,就是我们常说的缓存击穿或缓存并发问…

小试牛刀-区块链Solana多签账户

目录 1.什么是多签账户 2.多签账户的特点 2.1 多个签名者 2.2 最小签名要求 2.3 常见应用场景 3.多签账户实现 3.1 账户的创建 3.1.1 创建新账户 3.1.2 获取创建和初始账户事务 3.1.3 账户的签名 3.2 代币转移操作 Welcome to Code Blocks blog 本篇文章主要介绍了 …

第八节AWK报告生成器(1)

第八节AWK报告生成器 一,AWK简介 其名称得自于它的创始人阿尔佛雷德•艾侯(Alfred Aho)、彼得•温伯格(Peter Weinberger) 和布莱恩柯林(Brian Kernighan)姓氏的首个字母 AWK是一个文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一 现在默认li…

「C++系列」输入/输出

文章目录 一、输入/输出1. 包含iostream库2. 使用std命名空间3. 输出到控制台4. 从控制台读取输入5. 注意事项 二、库头文件三、标准输出流(cout)1. 基本用法2. 格式化输出3. 缓冲4. 错误处理5. 注意事项 四、标准输入流(cin)1. 基…

X-Recon:一款针对Web安全的XSS安全扫描检测工具

关于X-Recon X-Recon是一款功能强大的Web安全扫描与检测工具,该工具能够帮助广大研究人员识别网页端输入数据,并执行XSS扫描任务。 功能介绍 1、子域名发现:检索目标网站的相关子域名并将其整合到白名单中。这些子域名可在抓取过程中使用&am…

重启人生计划-积蓄星火

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 如果你觉得这个【重启人生…

MySQL数据分析进阶(十二)设计数据库——PART4

;※食用指南:文章内容为‘CodeWithMosh’SQL进阶教程系列学习笔记,笔记整理比较粗糙,主要目的自存为主,记录完整的学习过程。(图片超级多,慎看!) 【中字】SQL进阶教程 |…

基于SpringBoot+VUE的员工绩效考核管理系统(源码+文档+部署)

主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等 业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写…

二级分发域名-子比比

二级分发域名全开源链接 二级分发域名

大数据技术——实战项目:广告数仓(第四部分)

目录 第7章 数据仓库环境准备 7.1 数据仓库运行环境 7.1.1 Hive环境搭建 7.1.2 Yarn环境配置 7.2 数据仓库开发环境 第8章 广告数仓ODS层 8.1 广告信息表 8.2 推广平台表 8.3 产品表 8.4 广告投放表 8.5 日志服务器列表 8.6 广告监测日志表 8.7 数据装载脚本 第7章…