路飞项目 day02 全局日志、全局异常处理、封装Response、数据库准备
一、路飞项目全局日志配置
那个代码不用死记硬背,知道一些地方是啥意思即可
1.复制django自带的日志模块的大代码到dev(settings)文件中
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': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
# 实际开发建议使用ERROR
'level': 'ERROR',
'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, # 是否让日志信息继续冒泡给其他的日志处理系统
},
}
}
2.因为要封装进utils 公共类库中,所以我们去utils下新建一个py文件
common_exceptions.py
import logging
logger = logging.getLogger('django')
3.这样就配好了,在想要用日志的地方导入用即可
from lufei_api.utils.common_logger import logger
...
logger.info('info级别的日志~')
...
二、路飞项目全局异常处理封装
其实就是drf写过的,自己写个函数,做到能处理drf异常又能处理其他异常,统一返回格式
1.一样的,封进utils中
utils新建common_exceptions.py
2.写函数
3.配置里配置一下EXCEPTION_HANDLER:‘’
回顾一下drf的自定义全局异常处理
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from utils.common_logger import logger
# 只要走到这个函数中,一定是出异常了,所以要记录日志
def exception_handler(exc, context):
# 1 记录日志 : 哪个ip地址,用户id是多少,访问哪个路径,执行哪个视图函数,出了什么错
request = context.get('request')
view = context.get('view')
ip = request.META.get('REMOTE_ADDR')
user_id = request.user.pk
path = request.get_full_path()
response = drf_exception_handler(exc, context)
if response:
logger.warning('drf出了异常,异常是:%s' % str(exc))
# drf的异常已经处理了--->直接取detail 会有点小小的问题,碰到再解决
res = Response({'code': 999, 'msg': response.data.get('detail', '服务器异常,请联系系统管理员')})
else:
# djagno的异常,咱们要处理
logger.error('用户【%s】,ip地址为【%s】,访问地址为【%s】,执行视图函数为【%s】,出错是【%s】' % (user_id, ip, path, str(view), str(exc)))
res = Response({'code': 888, 'msg': '服务器异常,请联系系统管理员'})
return res
三、路飞项目封装Response
依旧是drf写过的,定制后端返回的数据格式
1.去utils中创一个common_response.py文件
2.开始写自定义APIresponse
3.视图层直接拿来用即可
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self, code=100, msg='成功', status=None, headers=None, **kwargs):
data = {'code': code, 'msg': msg}
if kwargs:
data.update(kwargs)
super().__init__(data=data, status=status, headers=headers)
四、路飞项目数据库准备
1.准备一个数据库的管理账号
不能再用Root用户了,权限太高了,以后公司里肯定不会给开发root权限的数据库用户的
会专门创建一个用户
1.我们先创建一个库
create database luffy
2.查看一下目前数据库存在的用户,以及支持的链接方式(分localhose本地链接即-p链接,127.0.0.1是通过-h 地址 进行网络链接)
select user,host,password from mysql.user;
3.开始创建我们需要的用户
grant all privileges on lufei.* to 'gao'@'%' identified by 'lufei123?';
# 解释 grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'
grant all privileges on lufei.* to 'gao'@'localhost' identified by 'lufei123?';
# 上面这一句是再次给这个账号添加一种链接许可的方式,即支持本地链接
4.刷新一下权限
flush privileges;
5.现在我们就可以再次查看数据库所有的用户
select user,host,password from mysql.user;
2.项目链接数据库
先去pip安装一下mysqlclient
pip install mysqlclient -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
3.替换项目配置文件的用户名密码
我们以前写在settings里面的数据库的用户名和密码都是明文的,肯定是不行的
我们可以用os.environ.get()来取到环境变量中设置的键值对
举例:
1.去环境变量中添加键值对,注意要和自己数据库账号对上哦
2.添加完成后要重启电脑(windows)
3.然后自己试试取一下
import os
name = os.environ.get('MYSQL_USERNAME')
password = os.environ.get('MYSQL_PASSWORD')
print(name,password)
4.取到了就替换掉配置文件中的数据
4.拓写auth表
一定注意!搞完这一块的东西后再去迁移
还有注意,先去创建一个user app ,然后注册下!
1.直接去user app下 创表
class User(AbstractUser):
# 扩写手机号和头像字段
mobile = models.CharField(max_length=11, unique=True)
# 需要pillow包的支持
icon = models.ImageField(upload_to='icon', default='icon/default.png')
class Meta:
db_table = 'luffy_user'
verbose_name = '用户表'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
2.设置里面去配置auth对应的表
AUTH_USER_MODEL = 'user.User'
3.进行迁移
建议先cd出去,去根目录
python manage.py makemigrations
python manage.py migrate
五、路飞项目开启Media访问
# 配置文件加入
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
#自己在小路飞下创建一个media文件夹,塞一个图片待会测试
# 总路由中设置
from django.conf import settings
from django.views.static import serve
path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT})
# 访问
http://127.0.0.1:8000/media/icon/default.png
# 以后使用djagno的配置文件都用这个
from django.conf import settings
补充:
软件开发模式
DevOps更接近实际中的敏捷开发,一边设计一边开发一边测试一边部署
今日注意:
1.字典的update方法,如果有一样的k,就替换,如果没有的K,就新增在尾部
2.执行命令行一定要清楚自己在哪一层,不然找不到manage.py就很尴尬
路飞项目 day02 全局日志、全局异常处理、封装Response、数据库准备的更多相关文章
- drf序列化高级、自定义只读只写、序列化覆盖字段、二次封装Response、数据库查询优化(断关联)、十大接口、视图家族
目录 自定义只读 自定义只写 序列化覆盖字段 二次封装Response 数据库关系分析 断外键关联关系 ORM操作外键关系 ORM四种关联关系 基表 系列化类其他配置(了解) 十大接口 BaseSer ...
- 个人博客开发之blog-api 项目全局日志拦截记录
前言 大型完善项目中肯定是需要一个全局日志拦截,记录每次接口访问相关信息,包括: 访问ip,访问设备,请求参数,响应结果,响应时间,开始请求时间,访问接口描述,访问的用户,接口地址,请求类型,便于项目 ...
- 学习ASP.NET Core(10)-全局日志与xUnit系统测试
上一篇我们介绍了数据塑形,HATEOAS和内容协商,并在制器方法中完成了对应功能的添加:本章我们将介绍日志和测试相关的概念,并添加对应的功能 一.全局日志 在第一章介绍项目结构时,有提到.NET Co ...
- WPF 精修篇 全局为处理异常处理
原文:WPF 精修篇 全局为处理异常处理 当我们写代码的时候 对代码错误异常处理 有的时候会 没做处理 比如 我们执行如下代码 会引发程序崩溃 private void Button_Click(ob ...
- 3.后台配置、环境变量、日志、异常处理、二次封装Response、路由组件
目录 环境变量 封装logger 封装项目异常处理 二次封装Response模块 路由组件配置 环境变量 dev.py # 环境变量操作:小luffyapiBASE_DIR与apps文件夹都要添加到环 ...
- SpringBoot全局日志管理(AOP)
1.在pom.xml中引入aop的jar包 <dependency> <groupId>org.springframework.boot</groupId> < ...
- 关于TornadoFx和Android的全局配置工具类封装实现及思路解析
原文地址: 关于TornadoFx和Android的全局配置工具类封装实现及思路解析 - Stars-One的杂货小窝 目前个人开发软件存在设置页面,可以让用户自定义些设置,但我发现,存储数据的代码逻 ...
- Asp.Net Core 2.0 项目实战(4)ADO.NET操作数据库封装、 EF Core操作及实例
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- Luffy之虚拟环境.项目搭建,目录日志等配置信息
1. 项目开发前 1.1 虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的 ...
- git的介绍、git的功能特性、git工作流程、git 过滤文件、git多分支管理、远程仓库、把路飞项目传到远程仓库(非空的)、ssh链接远程仓库,协同开发
Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码 ...
随机推荐
- 复制内容到剪切板通用的js方法
复制内容到剪切板通用的js方法 /** * 复制内容到剪切板 * @param text 要复制的内容 */ function Clipboard(text) { if (navigator.clip ...
- vue + element-ui + vue-clipboard2 实现文字复制粘贴功能与提示
1.在所在项目下安装插件 npm install vue-clipboard2 --save 2.在所在项目的index.js注入vue-clipboard2 import VueClipboard ...
- 学习Java Day17
今天继续加强了一下类的联系,并学习了如何生成随机数
- vant ui rem配置流程
参考地址 https://www.cnblogs.com/WQLong/p/7798822.html 1.下载lib-flexible 使用的是vue-cli+webpack,通过npm来安装的 n ...
- 三分钟使用chatGPT
ChatGPT最近也是火爆出圈,网上已被刷屏. 今天我们说一下,使用ChatGPT的方法,很简单,只需要三步: 前期确保自己能访问google,IP地址为某些国家:否则检查会报错:Services a ...
- Liunx(CentOS)安装Nacos(单机启动,绑定Mysql)
Liunx安装Nacos(单机启动,绑定Mysql) 一,准备安装包 github下载点 二,在/usr/local/目录下创建一个文件夹用于上传和解压Nacos cd /usr/local/ #这里 ...
- CF863E - Turn Off The TV
题意:对于若干个闭区间 \([l_i,r_i]\),它们构成了一个集合 \(\bigcup_{i\le n}{[l_i,r_i]}\),求一个 \(k\),使得 \(\bigcup_{i\le n}{ ...
- vue2 使用x2js json转换成xml
安装: 在项目终端运行以下命令 cnpm install x2js --save 引用: // 引入模块 import x2js from 'x2js' 全部代码: <template> ...
- 看完这一篇,ShardingSphere-jdbc 实战再也不怕了
谈到分库分表中间件时,我们自然而然的会想到 ShardingSphere-JDBC . 这篇文章,我们聊聊 ShardingSphere-JDBC 相关知识点,并实战演示一番. 1 ShardingS ...
- 将python2.7项目转为Python3问题记录
将一个Python2.7开发的测试工具项目转化为Python3. 工具:Python自带的2to3.py 将所有.py文件进行转化,生成的python3文件为原文件名,python2文件在后面加.ba ...