Django Project | 云笔记练习项目

文章目录

功能

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

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

源码:GitHub云笔记小项目

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

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

整体架构流程

搭建平台环境

  • 基于pycharm社区版本搭建

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

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


  2. 启动项目

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

子功能

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

  1. 创建用户表
python 复制代码
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.用户注册

python 复制代码
# 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('注册成功!')
  • 上述代码问题
    明文密码如何处理?
    多用户同时并行插入问题?
    产品经理要求注册则免登陆一天,这功能怎么做?
密码存储 -- 哈希算法

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

python 复制代码
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解决

python 复制代码
try :
    User.objects.create(username=username,password=pass1_hash)
except Exception as e:
    # 由于唯一索引 报错 重复插入 【唯一索引注意并发写入问题】
    print('--create user error %s' % (e))
    return HttpResponse('用户名已注册')
登陆状态保持 -- 详细看用户登录状态
python 复制代码
# 免登录一天 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. 用户登录

python 复制代码
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('登录成功!!!')

1 记住用户名 免登录三天

python 复制代码
# 判断有没有✔  通过检查浏览器响应分析 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号写的程序

  1. 不记住 一天 就是session
用户登录状态校验


3. 网站首页

4.退出登录

5.笔记模块 列表页

添加笔记

补充

哈希算法

python 复制代码
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  相当于两次明文的拼接 


相关推荐
咚咚王者11 分钟前
人工智能之编程基础 Python 入门:第三章 基础语法
人工智能·python
9ilk34 分钟前
【仿RabbitMQ的发布订阅式消息队列】--- 模块设计与划分
c++·笔记·分布式·后端·中间件·rabbitmq
小白黑科技测评1 小时前
2025 年编程工具实测:零基础学习平台适配性全面解析!
java·开发语言·python
ejinxian1 小时前
Python 3.14 发布
java·开发语言·python
摇滚侠1 小时前
Spring Boot3零基础教程,JVM 编译原理,笔记87
jvm·spring boot·笔记
摇滚侠2 小时前
Spring Boot3零基础教程,配置 GraalVM 环境,笔记88
java·spring boot·笔记
北诺南兮2 小时前
大模型算法面试笔记——多头潜在注意力(MLA)
笔记·深度学习·算法
gfdgd xi2 小时前
GXDE For deepin 25:deepin25 能用上 GXDE 了!
linux·运维·python·ubuntu·架构·bug·deepin
小Pawn爷2 小时前
构建Django的Web镜像
前端·python·docker·django
dont worry about it3 小时前
使用亮数据爬虫API零门槛快速爬取Tiktok数据
开发语言·爬虫·python