一、路飞项目全局日志配置

​ 那个代码不用死记硬背,知道一些地方是啥意思即可

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、数据库准备的更多相关文章

  1. drf序列化高级、自定义只读只写、序列化覆盖字段、二次封装Response、数据库查询优化(断关联)、十大接口、视图家族

    目录 自定义只读 自定义只写 序列化覆盖字段 二次封装Response 数据库关系分析 断外键关联关系 ORM操作外键关系 ORM四种关联关系 基表 系列化类其他配置(了解) 十大接口 BaseSer ...

  2. 个人博客开发之blog-api 项目全局日志拦截记录

    前言 大型完善项目中肯定是需要一个全局日志拦截,记录每次接口访问相关信息,包括: 访问ip,访问设备,请求参数,响应结果,响应时间,开始请求时间,访问接口描述,访问的用户,接口地址,请求类型,便于项目 ...

  3. 学习ASP.NET Core(10)-全局日志与xUnit系统测试

    上一篇我们介绍了数据塑形,HATEOAS和内容协商,并在制器方法中完成了对应功能的添加:本章我们将介绍日志和测试相关的概念,并添加对应的功能 一.全局日志 在第一章介绍项目结构时,有提到.NET Co ...

  4. WPF 精修篇 全局为处理异常处理

    原文:WPF 精修篇 全局为处理异常处理 当我们写代码的时候 对代码错误异常处理 有的时候会 没做处理 比如 我们执行如下代码 会引发程序崩溃 private void Button_Click(ob ...

  5. 3.后台配置、环境变量、日志、异常处理、二次封装Response、路由组件

    目录 环境变量 封装logger 封装项目异常处理 二次封装Response模块 路由组件配置 环境变量 dev.py # 环境变量操作:小luffyapiBASE_DIR与apps文件夹都要添加到环 ...

  6. SpringBoot全局日志管理(AOP)

    1.在pom.xml中引入aop的jar包 <dependency> <groupId>org.springframework.boot</groupId> < ...

  7. 关于TornadoFx和Android的全局配置工具类封装实现及思路解析

    原文地址: 关于TornadoFx和Android的全局配置工具类封装实现及思路解析 - Stars-One的杂货小窝 目前个人开发软件存在设置页面,可以让用户自定义些设置,但我发现,存储数据的代码逻 ...

  8. 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 ...

  9. Luffy之虚拟环境.项目搭建,目录日志等配置信息

    1. 项目开发前 1.1 虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的 ...

  10. git的介绍、git的功能特性、git工作流程、git 过滤文件、git多分支管理、远程仓库、把路飞项目传到远程仓库(非空的)、ssh链接远程仓库,协同开发

    Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码 ...

随机推荐

  1. ChatGPT留给知乎、小红书的时间不多了

    大家好啊,今天我打算给大家整点好活!挑战一下用ChatGPT打入各平台内部. 知乎挑战! 首先了解一下"知乎体" 知乎体是以专业知识为基础,以清晰的条理对问题进行阐述,并解决该问题 ...

  2. Jest + React 单元测试最佳实践

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 前言 单元测试是一种用于测试"单元"的软件测试方 ...

  3. python3中,isinstance() 函数

    #isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). #返回值:如果对象的类型与参数二的类型相同则返回True,否则返回False 使用isinstance函数的实 ...

  4. ICSharpCode.SharpZipLib.Zip 解析时报错System.NotSupportedException: No data is available for encoding 936

    分析原因 利用ICSharpCode.SharpZipLib.Zip进行APK解析时,因为APK内编译的名称为中文,查询微软开发文档936为gb2312中文编码 微软开发文档地址https://doc ...

  5. PostgreSQL 谁堵塞了谁(锁等待检测)- pg_blocking_pids

    一.背景 当一个进程处于等待(被堵塞)状态时,是谁干的?可以使用如下函数,快速得到捣蛋(堵塞别人)的PID. 二.案例 1.会话1 postgres=# begin; BEGIN postgres=# ...

  6. python中的字符串的常用方法介绍

    a = "alxe Li 金角大王"     #创建一个字符串来演示方法的功能结果.一下都使用这个字符串演示. 首先要了解的常识性的知识点是:字符串是不可变的序列.所有对字符串的内 ...

  7. 【FPGA学习】MATLAB和FPGA实现FFT

    本博客记录一下在matlab设计和在FPGA平台实现FFT的方法,平台是Xilinx的ZYNQ 参考: COE文件制作与使用 Vivado使用技巧(9):COE文件使用方法 .coe文件生成 在某些I ...

  8. 第七周作业-N67044-张铭扬

    1. 说明自动化运维的路径,原理,实践方法. 所谓自动化运维是指通过将日常IT运维中大量的重复性工作(小到简单的日常检查.配置变更和软件安装,大到整个变更流程的组织调度)由过去的手工执行转为标准化.流 ...

  9. 自己写的垃圾shell

    #!/bin/bash echo -e "deb https://mirrors.aliyun.com/ubuntu/ trusty main restricted universe mul ...

  10. linux 替换csv的换行符(Linux 替换^M字符 方法)

    sed -i 's/^M//g' a.csv 注意:这里的"^M"要使用"CTRL-V CTRL-M"生成,而不是直接键入"^M". 实验: ...