6.15 封装logger,全局异常处理,response media访问 开启前端
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')
5.自己封装Response
/1 首先在utils文件夹中自己创建出common_response.py文件
>导入模块
from rest_framework.response import Response
>进行封装
class APIRespoinse(Response):
def __init__(self,code=100,msg='成功',status=None,headers=None,**kwargs): # **kwargs为了接收除前面几个以外的参数
data={'code':code,'msg':msg}
# kwargs 有可能是 {token:abc,name:keria}
# 需要放到data之中
if kwargs:
data.update(kwargs) # 会把两个字典合到一起
# 调用父类的__init___完成初始化
super().__init__(data=data,status=status,headers=headers)
/2 对APIResponse的测试
from utils.common_response import APIRespoinse
class ResponseView(APIView):
def get(self, request):
return APIRespoinse(token=123,culture=[{'money':20,'strom':123}])
6.开启media访问
/1 我们需要建立一个存放图片头像的文件夹,以便后期取出使用
# 导入meida相关的模块
from django.views.static import serve
from django.conf import settings
在urls中添加地址: path('media/<path:path>',serve,{'document_root':settings.MEDIA_ROOT})
/2 需要在配置文件中添加:
# 开启media访问
MEDIA_ROOT=os.path.join(BASE_DIR,'media')
/3 在luffy文件下创建media文件夹
放入图片
在浏览器地址栏中按照地址写入路径打开图片
7.创建前端界面
/1 在cmd中输入 vue create luffy_front前端项目
/2 安装第三方的模块:
cnpm install -S axios
cnpm install -S vue-cookie # 操作cookie需要的模块
cnpm i element-ui@2.9.2 -S
/3 在main.js中进行配置
注:elementui的配置去官网去找
// elementui配置
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
// axios配置(可以直接在view中写this.$axios.get() )
import axios from "axios";
Vue.prototype.$axios=axios
// vue-cookies配置
import cookies from 'vue-cookies'
Vue.prototype.$cookies=cookies
/4.在assets中文件夹中建立settings.js
export default {
BASE_URL: 'http://127.0.0.1:8000/api/v1/'
}
/5 再在main.js中写入新的配置文件
import settings from '@/assets/js/settings'
Vue.prototype.$settings=settings
>>之后在任意组件中,只要输入this.$settings.BASE_URL就可以拿到settings.py中的BASE_URL
8.全局样式的配置 '@/assets/css/global.css'
/1 在assets中建立一个css文件夹,并在css文件夹中写上清除全局样式的代码:
/* 声明全局样式和项目的初始化样式 */
body, h1, h2, h3, h4, h5, h6, p, table, tr, td, ul, li, a, form, input, select, option, textarea {
margin: 0;
padding: 0;
font-size: 15px;
}
a {
text-decoration: none;
color: #333;
}
ul {
list-style: none;
}
table {
border-collapse: collapse; /* 合并边框 */
}
/2 然后在main中引入
import '@/assets/css/global.css'

浙公网安备 33010602011771号