redis | Django小项目之Mysql数据库和Redis缓存的应用

news2024/11/15 4:17:47

Django小项目

    • 需求
    • 整体架构图
    • 技术细节
      • 环境配置
      • 各文件配置
        • settings.py
        • urls.py
        • views.py
        • user_update.html
    • 结果
    • 相关代码补充
      • r.hgetall(cacahe_key)
      • new_data= {k.decode():v.decode() for k,v in data.items()}

需求

在这里插入图片描述

整体架构图

在这里插入图片描述

技术细节

环境配置

  • django-admin startprojrct rmysite1 # 创建项目

  • cd rmysite1 # 进入项目目录

  • python manage.py startapp user # 创建应用

  • mysql 创建数据库 rmysite1 # Navivate 创建数据库 rmysite1

  • Navivate 创建数据库 rmysite1
    在这里插入图片描述

  • conda 安装 redis包
    在这里插入图片描述

各文件配置

settings.py
INSTALLED_APPS = [
    ...
    'user', # 加入应用
]


# 。。。。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'rmysite1',
        'USER':'root',
        'PASSWORD':'自己密码',
        'HOST':'127.0.0.1',
        'PORT':'3306',
    }
}


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],  #  在项目目录创建
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]


LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

urls.py

多级路由


from django.urls import path
from . import views

urlpatterns = [


    # path('user/',include('user.urls')),
    
    path('detail/<int:user_id>',views.user_detail),
    path('update',views.user_update),

]
views.py
from django.http import HttpResponse
from django.shortcuts import render
from .models import User
import redis

# 全局变量
r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')

# Create your views here.
def user_detail(request,user_id):
    # user/detail/1
    cacahe_key = 'user:%s'%(user_id)
    # 优先查看缓存
    if r.exists(cacahe_key):
        data = r.hgetall(cacahe_key)

        # {b'username':b'xxx',b'desc':b'xxx'}  字节形式
        # 转换为字符串形式
        new_data= {k.decode():v.decode() for k,v in data.items()}
        username = new_data['username']
        desc = new_data['desc']
        html = 'cache username is %s ; desc is %s'%(username,desc)
        return HttpResponse(html)

    # 没有缓存数据
    try:
        user = User.objects.get(id=user_id)
    except Exception as e:
        print('--  get user error is %s'%(e))
        return HttpResponse('-----no user!!!------')

    username = user.username
    desc = user.desc

    # 更新缓存 存储到缓存
    r.hmset(cacahe_key,{'username':username,'desc':desc})
    r.expire(cacahe_key,60) # 哈希只能整体加过期时间
    html = 'mysql username is %s ; desc is %s'%(username,desc)
    return HttpResponse(html)

def user_update(request):
    if request.method == 'GET':
        return render(request,'user_update.html')
    elif request.method == 'POST':
        username = request.POST['username']
        desc = request.POST['desc']

        try:
            user = User.objects.get(username=username)
        except Exception as e:
            print('--  update user error is %s' % (e))
            return HttpResponse('-----no user!!!------')

        # user.username = username
        user.desc = desc  # 只更改desc
        user.save()
        # 删除旧缓存
        cache_key = 'user:%s' %(user.id)
        r.delete(cache_key)

        return HttpResponse('-----update successfully!!!------')
user_update.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>更新</title>
</head>
<body>
<form action="/user/update" class="action" method="post">
    {% csrf_token %} <!--- CSRF验证机制  ---->
    <p>
        用户名:<input type="text" name="username">
    </p>
    <p>
        个人描述:<input type="text" name="desc">
    </p>
    <p>
        <input type="submit" value="更新">
    </p>
</form>
</body>
</html>

结果

  • 第一次运行结果

在这里插入图片描述

  • 第二次运行
    在这里插入图片描述

修改个人信息 返回 并从新访问
在这里插入图片描述
更新后 立即删除旧缓存数据

在这里插入图片描述
更新后的第一次访问:redis缓存没有该信息 mysql数据库查找 并将数据存入redis缓存
在这里插入图片描述
更新后的第二次访问 redis缓存数据中存在 直接访问

相关代码补充

r.hgetall(cacahe_key)

在 Redis 中,HGETALL 命令用于获取哈希表中指定键的所有字段和值。

HGETALL 返回一个列表,其中每个字段的值按字段名和值交替排列。例如,如果哈希表包含字段 field1 和 field2,其值分别为 value1 和 value2,则 HGETALL 将返回 [b'field1', b'value1', b'field2', b'value2'](在某些客户端库中返回的可能是字节字符串)

new_data= {k.decode():v.decode() for k,v in data.items()}

data.items():获取 data 字典的键值对项,返回一个迭代器,每个项是一个元组 (key, value)。

在字典推导式 {k.decode():v.decode() for k,v in data.items()} 中,对于 data.items() 返回的每个键值对 k 和 v:

k.decode():将键 k 从字节字符串解码为普通字符串。如果 k 已经是普通字符串,这个调用将引发 AttributeError。
v.decode():将值 v 从字节字符串解码为普通字符串。如果 v 已经是普通字符串,这个调用同样会引发错误。

{k.decode():v.decode() for k,v in data.items()}:创建一个新字典 new_data,其键和值都是解码后的字符串。

new_data:是解码后的新字典,可以用于需要普通字符串键和值的场合。

data = {
    b'key1': b'value1',
    b'key2': b'value2'
}

# 使用字典推导式解码所有键和值
new_data = {k.decode(): v.decode() for k, v in data.items()}

print(new_data)  # 输出: {'key1': 'value1', 'key2': 'value2'}

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

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

相关文章

WIFI 应用层代码

1.0 定义枚举类型 typedef enum {WIFI_COMM_WAIT, // AT 等待命令WIFI_COMM_OK, // AT 命令完成WIFI_COMM_FALL, // AT 命令失败 }WifiCommState_t; 注&#xff1a;该枚举类型的作用是&#xff0c;定义三个成员变量&#xff0c;分别表示AT指令等待发送&#xff0c;AT指令…

unity游戏开发——(细)深入解析 Unity 地形系统:从基础到高级应用

Unity游戏开发 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发前言深入解析 Unity 地形系统&#xff1a;从基础到高级应用一、初识 Unity 地形系统1. 地形尺寸与分辨率 二、地形编辑工具详解1…

下拉菜单 匹配搜索

操作版本&#xff1a;Excel 2010 下拉菜单 涉及到的函数&#xff1a; INDIRECT函数&#xff1a;返回由文本字符串指定的引用 原文链接 一级下拉菜单 方法一&#xff1a;手动输入 选中要制作下拉菜单的单元格区域&#xff0c;单击【数据】-【数据有效性】-【序列】&#…

15.CentOS7升级内核

升级内核 1.配置镜像源 vim /etc/yum.repos.d/elrepo.repo[elrepo] nameelrepo baseurlhttps://mirrors.aliyun.com/elrepo/archive/kernel/el7/x86_64 gpgcheck0 enabled12.备份 cd /etc/yum.repos.d/ mv local.repo repo.bak/ 3.清缓存 yum clean all 4.升级内核 yum ins…

背部筋膜炎最好的恢复办法

背部筋膜炎是由于寒冷、精神紧张、潮湿或慢性劳损等因素造成的背部肌筋膜和肌组织发生水肿、纤维变性和渗出&#xff0c;其主要症状包括&#xff1a; 1、疼痛&#xff1a;患者通常会出现背部疼痛&#xff0c;这种疼痛在着凉或劳累时可能会加重。晨起时疼痛可能尤为明显&#x…

将两对象(重复属性不替换)合并成一个对象

将这两个对象合并成一个对象 const obj1 {"configType": "all","config": {"a":1} };const obj2 {"target_cluster": "dev-0821","type": "import","config": {"connector…

攻防世界-web题型-4星难度汇总-个人wp

Confusion1 进入页面查看源代码&#xff0c;发现有两个提示 访问第一个源码里面有个 /opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt /opt/salt_b420e8cfb8862548e68459ae1d37a1d5.txt 不过我发现好像是只要访问404页面都有这两个。。。 另外这两个admin和login页面都没用…

如何把照片转换成PDF格式?分享3种好用的PDF转换方法

在数字化的时代中&#xff0c;各种格式的文件已经是我们平时办公中不可或缺的一部分&#xff0c;其中尤其是以图片、PDF这两种文件使用的最多&#xff0c;图片能够更加直观的表现内容&#xff0c;而PDF文档因其稳定性、兼容性等特性&#xff0c;也在办公中有独特的优势&#xf…

Pandas DataFrame的创建方法(Create DataFrame)

pandas是一个第三方数据分析库&#xff0c;其集成了大量的数据模型和分析工具&#xff0c;可以方便的处理和分析各类数据。其中主要对象类型有Series&#xff0c;DataFrame和Index。本文介绍DataFrame对象的基本创建方法。 关于DataFrame的基础用法&#xff0c;可以查看下面的…

随机生成n个字节os.urandom(n)

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 随机生成n个字节 os.urandom(n) [太阳]选择题 下列输出结果中正确的是? import os print("【执行】a os.urandom(2)") a os.urandom(2) print("【显示】a ", a) pri…

【Qt】输入类控件QDail

目录 输入类控件QDail 例子&#xff1a;调整窗口不透明度 输入类控件QDail 使用QDail表示一个旋钮&#xff0c;通过鼠标拖动旋钮可以完成一些相关的属性。 核心属性 属性说明 value 持有的数值. minimum 最⼩值 maximum 最⼤值 singleStep 按下⽅向键的时候改变的步⻓…

【Java数据结构】---二叉树OJ

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 相同的树另一颗树的子树翻…

与copilot 结对编程系列 - log日志重复性检测 - 第4篇 - 网页UI界面

背景 细节可以参考这篇文章: 与copilot 结对编程系列 - log日志重复性检测 - 第1篇 - 总体介绍及效果展示 本文主要将数据库中存储的数据通过网页调用并展示出来, 以下是对详细解释。 web框架选择 当前场景使用 Flask 来展示网页信息. 主要原因如下&#xff1a; 轻量级和易…

如何使用JavaScript获取HTML表单中的值?

在开发中&#xff0c;我们经常需要获取用户在表单中输入的数据&#xff0c;然后进行处理或提交到服务器。今天我们就来聊一聊&#xff0c;如何用JavaScript获取HTML表单中的值。 使用 FormData 构造函数 FormData 是一个非常方便的工具&#xff0c;它可以把表单中的所有数据打包…

C++,std::chrono 详解

文章目录 1. 概述2. 时间点&#xff08;Time Points&#xff09;3. 时间间隔&#xff08;Durations&#xff09;4. 时钟&#xff08;Clocks&#xff09;5. 时间算术6. 时间转换7. 延时参考 1. 概述 std::chrono 是 C11 引入的一个库&#xff0c;用于处理日期和时间。它提供了一…

Unsloth 教程 - 如何微调 Llama-3并导出到 Ollama

本文翻译整理自&#xff1a;&#x1f999; How to Finetune Llama-3 and Export to Ollama https://docs.unsloth.ai/tutorials/how-to-finetune-llama-3-and-export-to-ollama 文章目录 1、什么是Unsloth&#xff1f;2、什么是Ollama&#xff1f;3、安装Unsloth4、选择要微调的…

博弈论总结

公平组合游戏&#xff08;Impartial Game&#xff09;的定义如下&#xff1a; 游戏有两个人参与&#xff0c;二者轮流做出决策&#xff0c;双方均知道游戏的完整信息&#xff1b; 任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关&#xff0c;而与游戏者无关…

pytorch深度学习基础 6(简单的参数估计学习3)

上一篇博客说了如何拟合一条直线ywxb&#xff0c;今天我们现在使用PyTorch进行相同的曲线拟合 拟合y x*x -2x 3 0.1(-1到1的随机值) 曲线 给定x范围&#xff08;0&#xff0c;3&#xff09; 生成数据 import numpy as np import matplotlib.pyplot as plt import torch as t…

小程序学习day13-API Promise化、全局数据共享(状态管理)、分包

44、API Promise化 &#xff08;1&#xff09;基于回调函数的一部API的缺点&#xff1a;小程序官方提供的异步API都是基于回调函数实现的&#xff0c;容易造成回调地狱的问题&#xff0c;代码可读性、可维护性差 &#xff08;2&#xff09;API Promise化概念&#xff1a; 指…

Qt 环境搭建

sudo apt-get upadte sudo apt-get install qt4-dev-tools sudo apt-get install qtcreator sudo apt-get install qt4-doc sudo apt-get install qt4-qtconfig sudo apt-get install qt-demos编译指令 qmake -projectqmakemake实现Ubuntu20,04 与Windows之间的复制粘贴 安装o…