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'

posted @ 2023-06-15 23:23  ranbo145  阅读(34)  评论(0)    收藏  举报