6.15

发布时间 2023-06-15 23:30:05作者: ranbo145

1.使用python代码拿到存储在环境变量中的用户名和密码 

/1 配置环境变量,并在script文件夹中建立py文件获取系统环境变量  

import os
pwd = os.environ.get('PWD','Luffy123?') # 如果在系统中没找到环境变量,就使用括号中的第二个参数
print(pwd)
user = os.environ.get('USER','luffy')
print(user)

/2 隐藏自己的环境变量,别人就算获取到你的源码也不能够登录你的数据库

在settings.py中的dev.py文件中添加下面的代码

user = os.environ.get('USER', 'luffy')
pwd = os.environ.get('PWD', 'Luffy123?')
print(user,pwd)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy', # 数据库名字
'USER': user, # luffy用户
'PASSWORD': pwd,
'HOST': 'localhost',
'PORT': 3306
}
}

2.封装logger(日志)

/1 在setttings.py中添加日志配置

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': 'WARNING',
'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 将文件夹变为蓝色,忽略一部分报错信息

/3 日志对象的获取

# 日志对象获取,以后想用日志的地方,在common.logger中直接导入,使用loffer.info error..
import logging
logger=logging.getLogger('django')

/4 日志输出的各个等级

# DEBUG < INFO < WARNING < ERROR < CRITICAL
logger.debug('debug级别')
logger.info('info级别')
logger.warning('warning级别')
logger.error('error级别')
logger.critical('CRITICAL级别')

补充:以后想用print的位置,都用logger.info,以后项目上线,调高日志输出级别,虽然代码中写了日志输出,实际上并不会输出

3.对于环境变量的补充

/1 临时设置环境变量(重启后会自动失效,只在当前会话生效)

在Teminal中输入set name = xxx

/2 取出设置的环境变量

echo $xxx

4.封装全局异常以及记录日志

/1 首先需要安装drf模块:

Terminal中输入:pip install djangorestframework

/2 在utils中新建common_exceptions.py文件

>导入模块

from rest_framework.views import exception_handler
from rest_framework.response import Response
from utils.common_logger import logger

> 加入日志记录:如果走到这个文件,就说明程序出错了,所以我们需要将错误录入日志
日志的记录尽量详细,记录ip地址,记录用户,记录请地址,执行哪个视图类出现的错误

def common_exception_handle(exc,context):
request = context.get('request') # 得到用户的请求对象
view= context.get('view') # 得到用户执行的哪个视图类
ip = request.META.get('ROMOTE_ADDR') # 得到用户IP
try:
user_id = request.user.pk # 去取用户的id,登录了就可以拿到用户id
except:
user_id = '[未登录用户]'
path = request.get_full_path() # 拿到路径
view_str = str(view) # 查看是哪个view
res = exception_handler(exc, context)
logger.error('用户地址为:%s,用户id号为:%s,请求地址为:%s,执行的视图函数为:%s' % (ip, user_id, path, view_str))

> 进行错误类型判断并返回结果

if res:
# drf的异常,一种是去res.data这个字典取,一种是,直接取data
if isinstance(res.data,dict):
data = {'code':102,'msg':res.data.get('detail','系统错误,联系管理员修复')}
else:
data = {'code': 100, 'msg': res.data}
else:
# django的异常
data = {'code':101,'msg':str(exc)}
return Response(data)

/3 在dev.py中写入配置文件:

REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'utils.common_exceptions.common_exception_handle',
}

/4 在views.py中添加异常处理测试

# 全局异常测试
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.exceptions import APIException, ValidationError

# 只有继承APIView的视图才会走全局异常
class ExceptionTestView(APIView):
def get(self,request):
# diango异常
# raise Exception('error')
a = [1,2,3]
print(a[99])
# drf的异常
# raise APIException('SHIT')
return Response('ok')