luffy项目之后台项目搭建、目录调整、封装日志、全局异常、Response、数据库连接
luffy后台项目创建
- 在虚拟环境中创建luffy项目
- 安装django:
pip install django==3.1.12
- 命令创建项目
django-admin startproject luffy_api
- 也可以pycharm创建项目,创建项目时选则已经创建好的虚拟环境即可
luffy项目目录调整
"""
├── luffy_api├── logs/ # 项目运行时/开发时日志目录 - 包├── manage.py # 脚本文件├── luffy_api/ # 项目主应用,开发时的代码保存 - 包├── apps/ # 开发者的代码保存目录,以模块[子应用]为目录保存 - 包├── libs/ # 第三方类库的保存目录[第三方组件、模块] - 包├── settings/ # 配置目录 - 包├── dev.py # 项目开发时的本地配置└── prod.py # 项目上线时的运行配置├── urls.py # 总路由└── utils/ # 多个模块[子应用]的公共函数类库[自己开发的组件]└── scripts/ # 保存项目运营时的脚本文件 - 文件夹
"""
运行报错
- django项目运行,要先加载
settings.py(dev.py)
- 运行时,执行的是
python manage.py runserver
解决报错
- 修改manage.py 中
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.dev')
- 配置文件中,找到django,指定配置文件,手动设置配置文件
创建app
python manage.py startapp home
, 在哪执行,app就创建在哪里
注册app
在INSTALLED_APPS 直接写app的名字,会报错,报模块找不到的错误
No module named 'home'
- 模块就是没有
- 不在环境变量中
- 自己写了一个,跟它同名
只需要把apps路径加入到环境变量即可
封装logger
django 默认使用 python原生的日志模块,咱们选择它
也可以使用第三方的logru
-
在设置中配置日志格式
LOGGING = {'version': 1,'disable_existing_loggers': False,'formatters': {'verbose': {'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'},'simple': {'format': '%(levelname)s %(module)s %(lineno)d %(message)s'},},'filters': {'require_debug_true': {'()': 'django.utils.log.RequireDebugTrue',},},'handlers': {'console': {# 实际开发建议使用WARNING'level': 'DEBUG','filters': ['require_debug_true'],'class': 'logging.StreamHandler','formatter': 'simple'},'file': {# 实际开发建议使用ERROR'level': 'INFO','class': 'logging.handlers.RotatingFileHandler',# 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR代表的是小luffyapi'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),# 日志文件的最大值,这里我们设置300M'maxBytes': 300 * 1024 * 1024,# 日志文件的数量,设置最大日志数量为10'backupCount': 10,# 日志格式:详细格式'formatter': 'verbose',# 文件内容编码'encoding': 'utf-8'},},# 日志对象'loggers': {'django': {'handlers': ['console', 'file'],'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统},} }
-
在utils下新建
common_logger.py
import logging logger = logging.getLogger('django')
- 使用日志
在视图函数中使用from utils.common_logger import logger class LoggerView(APIView):def get(self, request):logger.info('info级别')logger.warn('warn级别')logger.warning('warning级别')logger.error('error级别')logger.critical('critical级别')logger.debug('debug级别')return Response('看到我了')
封装全局异常
-
在utils中创建一个
.py
文件来写异常函数,并在其中定制报错日志from rest_framework.views import exception_handler from rest_framework.response import Response from luffy01.utils.loggers import loggerdef common_exception_handler(exc, context):res = exception_handler(exc, context)if res:err = res.data.get('detail') or res.data or '未知错误请联系管理员'response = Response({'code': 200, 'msg': '请求异常-drf:%s' % err})else:response = Response({'code': 201, 'msg': '请求异常-其他异常:%s' % str(exc)})request = context.get('request')# 获取请求地址path = request.get_full_path()method = request.methodip = request.META.get('REMOTE_ADDR')user_id = request.user.pk or '未登录用户'err = str(exc)view = str(context.get('view'))logger.error('请求错误:请求地址是:%s,请求方式是:%s,请求用户ip地址是:%s,用户id是:%s,错误是:%s,执行的视图函数是:%s'% (path, method, ip, user_id, err, view))return response
-
在设置文件
dev
中配置设置REST_FRAMEWORK = {'EXCEPTION_HANDLER': 'luffy01.utils.excepiton.common_exception_handler' }
封装Response
使用drf的Response,我们需要自己构造返回字典
封装Response以更简介
-
在utils中创建一个
.py
文件来写封装Response类=from rest_framework.response import Responseclass APIResponse(Response):def __init__(self, code=100, msg='成功', status=None, template_name=None, headers=None,exception=False, content_type=None, **kwargs):data = {'code': code, 'msg': msg}if kwargs:data.update(kwargs)super().__init__(data=data, status=status, headers=headers, template_name=template_name, exception=exception,content_type=content_type)
-
在视图类中直接调用即可,就像原来的Response用法相似
后台数据库连接
mysql在win上安装步骤
https://zhuanlan.zhihu.com/p/571585588
在MySQL中创建权限用户
创建一个用户连接mysql时只有部分权限的库,后续使用代码操作数据库,不使用root用户,新建一个用户 luffy
- 如果使用root用户,一旦密码泄露,所有库都不安全了
- 如果新建一个luffy用户,只授予luffy库的权限,即便泄露了密码,只是这个库不安全了
创建luffy用户
- 以root用户进入mysql
mysql - u root -p
- 查看用户:
- 5.7以前版本:
select user,host,password from mysql.user;
- 5.7以前版本:
select user,host,authentication_string from mysql.user;
- 5.7以前版本:
- 创建用户:
将某个库权限授予用户- 远程登录权限:
grant all privileges on 库名.* to '用户名'@'%' identified by '密码';
- 本地登录权限:
grant all privileges on 库名.* to '用户名'@'localhost' identified by '密码';
- 远程登录权限:
- 刷新权限:
flush privileges;
在django中设置连接mysql
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'luffy','HOST': '127.0.0.1','PORT': 3306,'USER': 'luffy','PASSWORD': 'luffy123?'}}
相关文章:
luffy项目之后台项目搭建、目录调整、封装日志、全局异常、Response、数据库连接
luffy后台项目创建 在虚拟环境中创建luffy项目安装django:pip install django3.1.12命令创建项目django-admin startproject luffy_api也可以pycharm创建项目,创建项目时选则已经创建好的虚拟环境即可 luffy项目目录调整 """ ├── …...

C++标准模板(STL)- 类型支持 (数值极限,min_exponent10,max_exponent,max_exponent10)
数值极限 std::numeric_limits 定义于头文件 <limits> 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式(例如 int 类型的最大可能值是 std::numeric_limits&l…...

linux 服务器类型Apache配置https访问
一:查看服务器类型,下载相应的SSL证书 命令:netstat -anp | grep :80 httpd是Apache超文本传输协议(HTTP)服务器的主程序,所以下载Apache证书 二:将证书解压后复制到服务器上 三个文件:xxx.key xxx_publ…...

langchain 加载各种格式文件读取方法
参考:https://python.langchain.com/docs/modules/data_connection/document_loaders/ https://github.com/thomas-yanxin/LangChain-ChatGLM-Webui/blob/master/app.py 代码 可以支持pdf、md、doc、txt等格式 from langchain.document_loaders import Unstruct…...

飞花令游戏(Python)
飞花令是古时候人们经常玩一种“行酒令”的游戏,是中国古代酒令之一,属雅令。“飞花”一词则出自唐代诗人韩翃《寒食》中 春城无处不飞花 一句。行飞花令时选用诗和词,也可用曲,但选择的句子一般不超过7个字。 在《中国诗词大会》…...

解决“413 Request Entity Too Large”错误 代表请求包太大,服务器拒绝响应
解决办法: 在nginx的配置文件nginx.conf中,添加这么一句client_max_body_size 1024m; 意思是最大请求是1024m。这个配置可以放到 http段 或者 server段 或者 location段。...

MoeCTF2023web
01http 打开题目环境 可以看到要求完成所有任务,这里用burp抓个包 按照要求修改可以得到flag moectf{basic_http_knowledge_HJbg427uFuznTqiJdtS1xhZNwpdsOnKU} 02 Web入门指北 直接找到结尾发现乱码,去解码 编码可以试试url编码和base64到16 这里用…...

C语言编写简易图书管理系统
这篇文章介绍了一个基本的图书管理系统的实现,它允许用户添加、插入、删除、修改、显示和查询图书的功能。该系统通过使用二进制文件将图书信息保存到磁盘,并且在程序启动时能够加载已保存的图书信息。 介绍 在计算机科学中,图书管理系统是…...

C++入门 第一篇(C++关键字, 命名空间,C++输入输出)
目录 1. C关键字 2. 命名空间 2.1 命名空间定义 2.2命名空间的使用 命名空间的使用有三种方式: 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 3. C输入&输出 4.缺省函数 4.1 缺省参…...
python股票波动性分析
一、简介 我们都经历过这样的情况——盯着股票图表,试图理解那些疯狂的价格上涨,或者只是想知道为什么突然平静。在这些波动中,有一个一致的因素常常脱颖而出:波动性。了解波动性为衡量任何特定点的市场情绪和情绪提供了一个视角。通过剖析波动性的细微差别,我们不仅可以更…...

53 打家劫舍
打家劫舍 题解1 DP1题解2 DP2 !经典DP! 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果 两间相邻的房屋在同一晚上被小偷闯入…...

CentOS 7 基于C 连接ZooKeeper 客户端
前提条件:CentOS 7 编译ZooKeeper 客户端,请参考:CentOS 7 编译ZooKeeper 客户端 1、Docker 安装ZooKeeper # docker 获取zookeeper 最新版本 docker pull zookeeper# docker 容器包含镜像查看 docker iamges# 准备zookeeper 镜像文件挂载对…...

2023-2024-1 for循环-1(15-38)
7-15 输出闰年 输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。 输入格式: 输入在一行中给出21世纪的某个截止年份。 输出格式: 逐行输出满足条件的所有闰年年份,即每个年…...

初级问题 程序中的变量是指什么?中级问题 把若干个数据沿直线排列起来的数据结构叫作什么?高级问题 栈和队列的区别是什么?
目录 1.深刻主题 2.描写复杂人物 初级问题 程序中的变量是指什么? 中级问题 把若干个数据沿直线排列起来的数据结构叫作什么? 高级问题 栈和队列的区别是什么? 计算机图形学(有效边表算法) 介绍一下计算机图形学…...

clickhouse数据库简介,列式存储
clickhouse数据库简介 1、关于列存储 所说的行式存储和列式存储,指的是底层的存储形式,数据在磁盘上的真实存储,至于暴漏在上层的用户的使用是没有区别的,看到的都是一行一行的表格。 idnameuser_id1闪光10266032轨道物流10265…...
flask 发送ajax
前端 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <script src"https://cdn.lyshark.com/javascript/jquery/3.5.1/jquery.min.js"…...
Android Gradle 命令打包AAR
平台 Android Archive (AAR) 文件是一种特定于Android的存档文件格式,用于将Android库和资源打包成单个可重用的单元。AAR文件通常用于共享和分发Android库,以便其他Android应用项目可以轻松引用和使用这些库。 AAR文件是一种便捷的方式,用于…...

如何导出带有材质的GLB模型?
1、为什么要使用 GLB 模型? GLB格式(GLTF Binary)是一种用于存储和传输3D模型及相关数据的文件格式,具有以下优点和作用: 统一性:GLB是一种开放标准的3D文件格式,由Khronos Group制定和维护。它融合了GL…...
C/C++面试常见知识点
目录 C/C语言C内存分区malloc/free与new/delete的区别联合体联合体大小的计算 结构体对齐为什么需要结构体内存对齐 结构体与联合体的区别左值引用与右值引用指针和引用的区别迭代器失效static关键字在C语言的作用进程地址空间的分布内联函数 三大特性构造函数不能是虚函数析构…...
详细介绍数据结构-堆
计算机中的堆数据结构 什么是堆 在计算机科学中,堆(Heap)是一种重要的数据结构,它用于在动态分配时存储和组织数据。堆是一块连续的内存区域,其中每个存储单元(通常是字节)都与另一个存储单元…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...