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  相当于两次明文的拼接 


相关推荐
一个闪现必杀技7 分钟前
Python入门--函数
开发语言·python·青少年编程·pycharm
小鹿( ﹡ˆoˆ﹡ )28 分钟前
探索IP协议的神秘面纱:Python中的网络通信
python·tcp/ip·php
卷心菜小温43 分钟前
【BUG】P-tuningv2微调ChatGLM2-6B时所踩的坑
python·深度学习·语言模型·nlp·bug
陈苏同学1 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
唐家小妹1 小时前
介绍一款开源的 Modern GUI PySide6 / PyQt6的使用
python·pyqt
羊小猪~~2 小时前
深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)
pytorch·python·rnn·深度学习·机器学习·数据分析·lstm
m0_689618282 小时前
水凝胶发生器,不对称设计妙,医电应用前景广
笔记
Ace'2 小时前
每日一题&&学习笔记
笔记·学习
Marst Code2 小时前
(Django)初步使用
后端·python·django
挥剑决浮云 -2 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记