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号
浙公网安备 33010602011771号