首页 > 数据库 >路飞项目 day02 全局日志、全局异常处理、封装Response、数据库准备

路飞项目 day02 全局日志、全局异常处理、封装Response、数据库准备

时间:2023-02-27 22:22:45浏览次数:35  
标签:get day02 user import 全局 drf 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就很尴尬

标签:get,day02,user,import,全局,drf,Response,日志
From: https://www.cnblogs.com/wznn125ml/p/17162183.html

相关文章