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

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

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. RocketMQ - 生产者原理

    https://rocketmq.apache.org/ Apache RocketMQ是一款开源的.分布式的消息投递与流数据平台.出生自阿里巴巴,在阿里巴巴内部经历了3个版本后,作为Apache 顶 ...

  2. 3 .NET Core笔试题

    1.什么是ASP.NET Core? 2.ASP.NET Core 中AOP的支持有哪些? 3.ASP.NET Core Filter的注册方式有哪些? 4.ASP.NET Core Filter如何 ...

  3. 为Jekyll静态网站添加PlantUML插件

    前言 突然想起来要好好整理一下自己的博客空间,已经荒废很多年,如果再不捡起来,等到自己知识老化的时候再去写东西就没人看了. 使用Github Pages + Jekyll把博客发布为静态网站,给人感觉 ...

  4. 学习Java Day23

    今天学习了包访问,没有指定public或private的部分可以被同一个包中的所有方法访问

  5. aop中的名词解释

    aop中的名词解释 aop spring Joinpoint(连接点) 目标对象中所有可以增强的方法叫做连接点 Pointcut(切入点) 目标对象中要增强的的方法 Advice(通知/增强) 增强的 ...

  6. let 和 var 的区别

    var 关键字 在块级作用域中使用var声明变量,外面同级的块级作用域也可以访问.if.switch.for 等语句的作用域都没有块级作用域,所以说,在这些语句中声明的变量都能被外界访问,这是非常不安 ...

  7. PyOpenGL的安装与错误解决

    1. 引言 OpenGL,一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形.图像的函数.然而,OpenGL本 ...

  8. 常用的git提交代码命令

    日常开发使用的git提交代码的方法 一.初始化本地仓库,提交代码,提交到远程git仓库 1.初始化代码仓库git init2.将当前目录下的所有文件放到暂存区git add .3.查看文件状态git ...

  9. 开始学python不知该怎么学?Python基础教程(第2版) 免费下载

    Python基础教程(第2版)pdf高清版免费下载  解压码:n0nl   内容简介  · · · · · · 本书是经典教程的全新改版,作者根据Python 3.0版本的种种变化,全面改写了书中内容 ...

  10. 基于GPU 显卡在k8s 集群上实现hpa 功能

    前言 Kubernetes 支持HPA模块进行容器伸缩,默认支持CPU和内存等指标.原生的HPA基于Heapster,不支持GPU指标的伸缩,但是支持通过CustomMetrics的方式进行HPA指标 ...