redis之jedis:通过redis的API与Java的集成

news2024/11/16 3:18:55

什么是jedis?

简而言之:jedis就是通过redis的API对redis的操作,通过Java类对数据库进行操作,注意:使用的命令则是redis数据库的API,jedis是一个java实现的redis客户端连接工具。常用的还有redisson,jedis跟接近于原生的操作,而redisson跟适合用于分布式,提供了分布式锁,以及其他多种数据结构。

连接redis数据库

注意:本篇文章讲解的主要为学习方法,所以使用的数据库使用的是本地环境下的数据库

环境则是windows下的redis,如果只是抱着学习为目的,可以下载redis到本地环境下

Releases · tporadowski/redis · GitHub windows环境下的redis下载

打开redis数据库

 

 可以通过客户端连接进行测试

 

返回值为pong则数据库连接成功

导入依赖:

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>4.3.2</version>
    </dependency>

实现jedis的连接

import redis.clients.jedis.Jedis;

import java.util.Set;

public class connect_Redis {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1",6379);   //127.0.0.1为本地ip,6379则是端口号
        jedis.flushAll();
        System.out.println(jedis.ping());           //测试连接,如果出现pong则连接成功


    }
}

 运行结果:连接成功

 

redis API在Java的操作:其实在redis数据库的操作命令和功能相同,不懂得可以看这篇文章

Redis之五大基本的数据类型:字符串String 散列hashes 列表 lists 集合sets 有序集合sorted sets 基础命令讲解_不想睡醒的梦的博客-CSDN博客

1:key

import redis.clients.jedis.Jedis;

import java.util.concurrent.TimeUnit;

public class test1 {
    public static void main(String[] args) {

        Jedis jedis = new Jedis("127.0.0.1",6379);
        jedis.flushDB();
        System.out.println("===========增加数据===========");
        System.out.println(jedis.set("key1", "value1"));
        System.out.println(jedis.set("key2", "value2"));
        System.out.println(jedis.set("key3", "value3"));
        System.out.println(jedis.del("key2"));                    //"删除键key2:"
        System.out.println(jedis.get("key2"));                        //"获取键key2:"
        System.out.println(jedis.set("key1", "value1Changed"));       //"修改key1:" +
        System.out.println("获取key1的值:" + jedis.get("key1"));       //获取key1值
        System.out.println(jedis.append("key3", "End"));        //在key3后面加入值
        System.out.println(jedis.get("key3"));             //key3的值:
        //"增加多个键值对:"
        System.out.println(jedis.mset("key01", "value01", "key02", "value02", "key03", "value03"));
//        "获取多个键值对"
        System.out.println( jedis.mget("key01", "key02", "key03"));
//        "获取多个键值对"
        System.out.println(jedis.mget("key01", "key02", "key03", "key04"));
//        删除多个键值对
        System.out.println(jedis.del("key01", "key02"));
//        获取多个键值对
        System.out.println(jedis.mget("key01", "key02", "key03"));
        jedis.flushDB();
        System.out.println("===========新增键值对防止覆盖原先值==============");
        System.out.println(jedis.setnx("key1", "value1"));
        System.out.println(jedis.setnx("key2", "value2"));
        System.out.println(jedis.setnx("key2", "value2-new"));
        System.out.println(jedis.get("key1"));
        System.out.println(jedis.get("key2"));
        System.out.println("===========新增键值对并设置有效时间=============");
        System.out.println(jedis.setex("key3", 2, "value3"));
        System.out.println(jedis.get("key3"));
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(jedis.get("key3"));
        System.out.println("===========获取原值,更新为新值==========");
        System.out.println(jedis.getSet("key2", "key2GetSet"));
        System.out.println(jedis.get("key2"));
        System.out.println("获得key2的值的字串:" + jedis.getrange("key2", 2, 4));
    }
}

输出运行结果

 

 

2:字符串

import redis.clients.jedis.Jedis;

import java.util.concurrent.TimeUnit;

public class test2 {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.flushDB();
        System.out.println("===========增加数据===========");
        System.out.println(jedis.set("key1", "value1"));
        System.out.println(jedis.set("key2", "value2"));
        System.out.println(jedis.set("key3", "value3"));
        System.out.println("删除键key2:" + jedis.del("key2"));
        System.out.println("获取键key2:" + jedis.get("key2"));
        System.out.println("修改key1:" + jedis.set("key1", "value1Changed"));
        System.out.println("获取key1的值:" + jedis.get("key1"));
        System.out.println("在key3后面加入值:" + jedis.append("key3", "End"));
        System.out.println("key3的值:" + jedis.get("key3"));
        System.out.println("增加多个键值对:" + jedis.mset("key01", "value01", "key02", "value02", "key03", "value03"));
        System.out.println("获取多个键值对:" + jedis.mget("key01", "key02", "key03"));
        System.out.println("获取多个键值对:" + jedis.mget("key01", "key02", "key03", "key04"));
        System.out.println("删除多个键值对:" + jedis.del("key01", "key02"));
        System.out.println("获取多个键值对:" + jedis.mget("key01", "key02", "key03"));
        jedis.flushDB();
        System.out.println("===========新增键值对防止覆盖原先值==============");
        System.out.println(jedis.setnx("key1", "value1"));
        System.out.println(jedis.setnx("key2", "value2"));
        System.out.println(jedis.setnx("key2", "value2-new"));
        System.out.println(jedis.get("key1"));
        System.out.println(jedis.get("key2"));
        System.out.println("===========新增键值对并设置有效时间=============");
        System.out.println(jedis.setex("key3", 2, "value3"));
        System.out.println(jedis.get("key3"));
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(jedis.get("key3"));
        System.out.println("===========获取原值,更新为新值==========");
        System.out.println(jedis.getSet("key2", "key2GetSet"));
        System.out.println(jedis.get("key2"));
        System.out.println("获得key2的值的字串:" + jedis.getrange("key2", 2, 4));
    }
}

3. list集合

import redis.clients.jedis.Jedis;

import java.util.concurrent.TimeUnit;

public class test3 {
    public static void main(String[] args) {

        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.flushDB();
        System.out.println("===========添加一个list===========");
        jedis.lpush("collections", "ArrayList", "Vector", "Stack", "HashMap", "WeakHashMap", "LinkedHashMap");
        jedis.lpush("collections", "HashSet");
        jedis.lpush("collections", "TreeSet");
        jedis.lpush("collections", "TreeMap");
        System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));//-1代表倒数第一个元素,-2代表倒数第二个元素,end为-1表示查询全部
        System.out.println("collections区间0-3的元素:" + jedis.lrange("collections", 0, 3));
        System.out.println("===============================");
// 删除列表指定的值 ,第二个参数为删除的个数(有重复时),后add进去的值先被删,类似于出栈
        System.out.println("删除指定元素个数:" + jedis.lrem("collections", 2, "HashMap"));
        System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));
        System.out.println("删除下表0-3区间之外的元素:" + jedis.ltrim("collections", 0, 3));
        System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));
        System.out.println("collections列表出栈(左端):" + jedis.lpop("collections"));
        System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));
        System.out.println("collections添加元素,从列表右端,与lpush相对应:" + jedis.rpush("collections", "EnumMap"));
        System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));
        System.out.println("collections列表出栈(右端):" + jedis.rpop("collections"));
        System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));
        System.out.println("修改collections指定下标1的内容:" + jedis.lset("collections", 1, "LinkedArrayList"));
        System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));
        System.out.println("===============================");
        System.out.println("collections的长度:" + jedis.llen("collections"));
        System.out.println("获取collections下标为2的元素:" + jedis.lindex("collections", 2));
        System.out.println("===============================");
        jedis.lpush("sortedList", "3", "6", "2", "0", "7", "4");
        System.out.println("sortedList排序前:" + jedis.lrange("sortedList", 0, -1));
        System.out.println(jedis.sort("sortedList"));
        System.out.println("sortedList排序后:" + jedis.lrange("sortedList", 0, -1));
    }
}

 4.set集合

import redis.clients.jedis.Jedis;

import java.util.concurrent.TimeUnit;

public class test3 {
    public static void main(String[] args) {

        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.flushDB();
        System.out.println("============向集合中添加元素(不重复)============");
        System.out.println(jedis.sadd("eleSet", "e1", "e2", "e4", "e3", "e0", "e8", "e7", "e5"));
        System.out.println(jedis.sadd("eleSet", "e6"));
        System.out.println(jedis.sadd("eleSet", "e6"));
        System.out.println("eleSet的所有元素为:" + jedis.smembers("eleSet"));
        System.out.println("删除一个元素e0:" + jedis.srem("eleSet", "e0"));
        System.out.println("eleSet的所有元素为:" + jedis.smembers("eleSet"));
        System.out.println("删除两个元素e7和e6:" + jedis.srem("eleSet", "e7", "e6"));
        System.out.println("eleSet的所有元素为:" + jedis.smembers("eleSet"));
        System.out.println("随机的移除集合中的一个元素:" + jedis.spop("eleSet"));
        System.out.println("随机的移除集合中的一个元素:" + jedis.spop("eleSet"));
        System.out.println("eleSet的所有元素为:" + jedis.smembers("eleSet"));
        System.out.println("eleSet中包含元素的个数:" + jedis.scard("eleSet"));
        System.out.println("e3是否在eleSet中:" + jedis.sismember("eleSet", "e3"));
        System.out.println("e1是否在eleSet中:" + jedis.sismember("eleSet", "e1"));
        System.out.println("e1是否在eleSet中:" + jedis.sismember("eleSet", "e5"));
        System.out.println("=================================");
        System.out.println(jedis.sadd("eleSet1", "e1", "e2", "e4", "e3", "e0", "e8", "e7", "e5"));
        System.out.println(jedis.sadd("eleSet2", "e1", "e2", "e4", "e3", "e0", "e8"));
//移到集合元素
        System.out.println("将eleSet1中删除e1并存入eleSet3中:" + jedis.smove("eleSet1", "eleSet3", "e1"));
        System.out.println("将eleSet1中删除e2并存入eleSet3中:" + jedis.smove("eleSet1", "eleSet3", "e2"));
        System.out.println("eleSet1中的元素:" + jedis.smembers("eleSet1"));
        System.out.println("eleSet3中的元素:" + jedis.smembers("eleSet3"));
        System.out.println("============集合运算=================");
        System.out.println("eleSet1中的元素:" + jedis.smembers("eleSet1"));
        System.out.println("eleSet2中的元素:" + jedis.smembers("eleSet2"));
        System.out.println("eleSet1和eleSet2的交集:" + jedis.sinter("eleSet1", "eleSet2"));
        System.out.println("eleSet1和eleSet2的并集:" + jedis.sunion("eleSet1", "eleSet2"));
//eleSet1中有,eleSet2中没有
        System.out.println("eleSet1和eleSet2的差集:" + jedis.sdiff("eleSet1", "eleSet2"));
//求交集并将交集保存到dstkey的集合
        jedis.sinterstore("eleSet4", "eleSet1", "eleSet2");
        System.out.println("eleSet4中的元素:" + jedis.smembers("eleSet4"));
    }
}

5. Hash集合

import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class test3 {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.flushDB();
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        map.put("key3", "value3");
        map.put("key4", "value4");
// 添加名称为 hash(key)的 hash 元素
        jedis.hmset("hash", map);
// 向名称为 hash 的 hash 中添加 key 为 key5,value 为 value5 元素
        jedis.hset("hash", "key5", "value5");
// return Map<String,String>
        System.out.println("散列hash的所有键值对为:" + jedis.hgetAll(" hash"));
// return Set<String>
        System.out.println("散列hash的所有键为:" + jedis.hkeys("hash"));
// return List<String>
        System.out.println("散列hash的所有值为:" + jedis.hvals("hash"));
        System.out.println("将key6保存的值加上一个整数,如果key6不存在则添加key6:" + jedis.hincrBy(" hash", " key6", 6));
        System.out.println("散列hash的所有键值对为:" + jedis.hgetAll("hash"));
        System.out.println("将key6保存的值加上一个整数,如果key6不存在则添加key6:" + jedis.hincrBy(" hash", " key6", 3));
        System.out.println("散列hash的所有键值对为:" + jedis.hgetAll("hash"));
        System.out.println("删除一个或者多个键值对:" + jedis.hdel("hash", "key2"));
        System.out.println("散列hash的所有键值对为:" + jedis.hgetAll("hash"));
        System.out.println("散列hash中键值对的个数:" + jedis.hlen("hash"));
        System.out.println("判断hash中是否存在key2:" + jedis.hexists(" hash", " key2"));
        System.out.println("判断hash中是否存在key3:" + jedis.hexists(" hash", " key3"));
        System.out.println("获取hash中的值:" + jedis.hmget("hash", "key3"));
        System.out.println("获取hash中的值:" + jedis.hmget(" hash", " key3", " key4"));
    }
}

事务操作

没有概念的可以通过这篇文章去了解Redis:事务操作以及监控(悲观锁,乐观锁)_不想睡醒的梦的博客-CSDN博客

 队列中的问题没有问题的情况下,代码正常的执行

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.JsonObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

import java.util.HashMap;
import java.util.Map;

public class connect_Redis2 {
    public static void main(String[] args)  throws Exception{
        Jedis jedis = new Jedis("127.0.0.1",6379);
        jedis.flushAll();
        JSONObject jsonObject = new JSONObject();
        Map<String,String> map = new HashMap<>();
        map.put("demo1","dmeo1");
        map.put("demo2","demo2");
        ObjectMapper mapper = new ObjectMapper();
        String s = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
        Transaction mutil  =jedis.multi();    //开启事务
        try{                                  //尝试执行,用trycatchfinally语句来实现
            mutil.set("json","json");
            mutil.set("json2",s);
            mutil.exec();
        }
        catch (Exception e){
            e.printStackTrace();
            mutil.discard();
        }
        finally {
            System.out.println(jedis.get("json"));
            System.out.println(jedis.get("json2"));
        }
    }
}

 

队列中命令出现问题时:

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.JsonObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

import java.util.HashMap;
import java.util.Map;

public class connect_Redis2 {
    public static void main(String[] args)  throws Exception{
        Jedis jedis = new Jedis("127.0.0.1",6379);
        jedis.flushAll();
        JSONObject jsonObject = new JSONObject();
        Map<String,String> map = new HashMap<>();
        map.put("demo1","dmeo1");
        map.put("demo2","demo2");
        ObjectMapper mapper = new ObjectMapper();
        String s = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
        jsonObject.put("name","myc");
        jsonObject.put("sex","man");
        Transaction mutil  =jedis.multi();
        try{
            mutil.set("json","json");
            int i = 5/0;                       //模拟问题的出现
            mutil.set("json2",s);
            mutil.exec();
        }
        catch (Exception e){
            e.printStackTrace();
            mutil.discard();
        }
        finally {
            System.out.println(jedis.get("json"));
            System.out.println(jedis.get("json2"));
        }
    }
}

事务队列中的命令没有被执行 

 

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

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

相关文章

力扣 139. 单词拆分

一、题目描述 给你一个字符串 s 和一个字符串列表 word_dict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode"…

【论文解读】Do Prompts Solve NLP Tasks Using Natural Language?

&#x1f365;关键词&#xff1a;文本分类、提示学习 &#x1f365;发表期刊&#xff1a;Arxiv 2022 &#x1f365;原始论文&#xff1a;https://arxiv.org/pdf/2203.00902 最近在做Prompted learning for text classification的工作&#xff0c;Prompted learning的核心在于设…

应急响应之进程,服务,文件排查方法

应急响应之进程,服务,文件排查方法 1.进程Windows进程排查Linux进程排查2.服务Windows服务排查Linux服务排查3.文件痕迹windows系统文件痕迹排查Linux系统文件痕迹排查1.进程 Windows进程排查 对于 Windows 系统中的进程排查,主要是找到恶意进程的 PID、程序路径, 有时还…

Elasticsearch:使用 Docker-Compose 启动单节点 Elastic Stack

首先必须指出的是&#xff0c;在我之前的文章 “Elasticsearch&#xff1a;使用 Docker compose 来一键部署 Elastic Stack 8.x”&#xff0c;我有详述根据官方文档如何创建一个带有三个节点的安全 Elasticsearch 集群。本文基于著名的 Deviatony 存储库和 Elastic 的官方说明。…

KPI考核管理:有效提升企业绩效指标

KPI考核管理是企业中常用的绩效管理方法之一&#xff0c;这种方式涉及到目标设定、绩效评估和奖惩措施等方面。在本文中&#xff0c;我们将探讨KPI考核管理的重要性、KPI管理方法以及如何应对。 一、KPI考核管理的重要性 KPI考核管理是企业实现战略目标的重要手段之一&#x…

[Mysql] MySQL索引与事务

黎明前的黑暗最难度过,但一旦坚持住,便是灿烂朝阳. 文章目录 1. 索引1.1 索引的概念1.2 索引的创建与使用 2. 事务2.1 事务的使用2.2 事务的特性与隔离机制2.2.1 隔离级别 1. 索引 1.1 索引的概念 索引是一种特殊的文件&#xff0c;可以对表中一列或多列创建索引&#xff0c;…

JZ-7Y-204 DC110V 2NO 2NC 静态中间继电器 板前接线 JOSEF约瑟

品牌&#xff1a;JOSEF约瑟名称&#xff1a;静态中间继电器型号&#xff1a;JZ-7Y-204额定电压&#xff1a;6V~220VAC/DC,380VAC触点容量&#xff1a;10A/250V10A/220VDC功率消耗&#xff1a;≤6W 1 用途 JZ-7中间继电器 板前接线用于各种保护和自动控制装置中&#xff0c;以…

PB文件定义为int64,HTTP返回为string的问题

最近开发遇见一个问题&#xff0c;pb文件中定义的一个字段类型为int64&#xff0c;而客户端拿到却是string。很奇怪&#xff0c;经过排查原来是 proto3中json映射问题 原文链接&#xff1a;https://protobuf.dev/programming-guides/proto3/#json JSON映射 Proto3 支持 JSON …

【GO 编程语言】 函数

函数 文章目录 函数一、什么是函数1.函数的声明 二、函数的声明和调用三、形参和实参四、可变参数五、值传递和引用传递六、函数中变量的作用域七、defer八、函数的本质探究九、匿名函数十、回调函数十一、闭包 一、什么是函数 函数是基本的代码块,用于执行一个任务。Go 语言最…

【手撕代码系列】JS手写实现apply方法

公众号&#xff1a;Code程序人生&#xff0c;分享前端所见所闻 在JavaScript中&#xff0c;apply()是Function对象的一个方法&#xff0c;它允许我们以指定的this值和参数列表调用函数。这个方法通常被用来在函数调用时动态地传递参数&#xff0c;或者在调用函数时绑定this值。…

chatgpt软件批量写作软件-文章改编软件

文章改编软件 文章改编软件是一种能够将原有的文本进行复制粘贴后&#xff0c;通过一定算法进行改写和改编的工具。其主要应用领域在于将一些内容复制到网站或博客等平台上时&#xff0c;避免因为重复内容而被识别为“抄袭”&#xff0c;从而提高文章的独特性和可读性。 然而…

TweenMax 源码阅读

GSAP 之 TweenMax 源码阅读&#xff08;一&#xff09; 一、背景 GreenSock &#xff08;绿袜子&#xff09; GreenSock 是一家做 专业级 JavaScript 动画的公司&#xff0c;主要产品就是其下的 GSAP (GreenSock Animation Platform)&#xff0c;配合着 GSPA 开发了很多专业的…

前端架构师-week5-egg.js+云Mongodb快速入门

目录 下载项目模版功能实现流程分析egg.js简介 egg.js 官网 初始化 云 mongodb 云 mongodb 开通 本地 mongodb 安装 mongodb 使用方法 通过 egg.js 框架添加新的API 云 mongodb 开通 本地 mongodb 调试技巧讲解 egg.js 接入 mongodb 方法 云 mongodb 如何连接公网…

mysql深分页

第一种&#xff1a;主键自增id情况&#xff1a; 未改&#xff1a; select * from wx_product_category_info where category_name_cn#{categoryNameCn} and category_type#{categoryType} order by id asclimit #{pageNum}, #{pageSize};在普通的limit条件下&#xff0c;如果…

如何通过appuploader把ipa文件上传到App Store教程步骤

​ iOS APP上架App Store其中一个步骤就是要把ipa文件上传到App Store&#xff01;​ 下面进行步骤介绍&#xff01;​ 利用Appuploader这个软件&#xff0c;可以在Windows、Linux或Mac系统中申请ios和上传IPA到App Store Connect。​ 非常的方便&#xff0c;没有Mac也可以…

回炉重造十三----Docker的运用

1、Docker和虚拟机的区别 两者的区别 虚拟化环境下每个 VM 是一台完整的计算机&#xff0c;在虚拟化硬件之上运行所有组件&#xff0c;包括其自己的操作系统。 容器之间可以共享操作系统,比起 VM 被认为是更轻量级.且与 VM 类似&#xff0c;每个容器都具有自己的文件系统、CPU…

42电机插座接线可以用PH2.0冷压端子

文章目录 42电机插座接线可以用PH2.0冷压端子概述笔记备注END 42电机插座接线可以用PH2.0冷压端子 概述 设备上的42电机在我不断调整电机安装位置时, 接线从插孔中折断了. 问厂家, 他们的线也是定制的. 另外, 他是销售, 不清楚具体插座的型号和插座要用的冷压端子是哪种. 因为…

Java 关键字之:package与import

一、package 关键字 为了更好的实现项目中类的管理&#xff0c;提供包的概念使用package声明类或者接口所属的包&#xff0c;声明在源文件的首行包&#xff0c;属于标识符&#xff0c;遵循标识符的命名规则、规范(xxxyyyzzz)、"见名知意"每“.”一次&#xff0c;就代…

windows 下安装Docker (WSL2)

测试环境&#xff1a; VMware Workstation 17 WinServer2022 docker 4.19 python3.8 第一步&#xff1a;环境准备&#xff1a; 1.开启虚拟化 2. 开启WSL、容器功能 重启服务器 第二步&#xff1a; 安装docker 桌面版&#xff1a;Get Docker | Docker Documentation 此时启动会…

Django框架之错误视图和HTTP方法装饰器

本篇主要记录如何定义视图&#xff0c;错误视图有哪些并如何实现自定义&#xff0c; HTTP方法装饰器定义及实现&#xff0c;还有csrf中间件设置位置及关闭。 定义视图 一般在views.py文件下定义 视图参数&#xff1a; 错误视图 400视图 当出现SuspiciousOperation异常并且代…