后台配置之封装logger
1.日志配置(配置在配置文件中)
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': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
# 实际开发建议使用ERROR
'level': 'INFO',
'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中新建logger.py
import logging
# 通过配置中的名字拿到logger对象,只需要导入直接使用对象写日志
logger = logging.getLogger('django')
'之后在需要使用的地方导入logger'
后台配置之封装全局异常
1.处理全局异常,新建一个exceptions.py,在文件中写个函数
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from utils.logger import logger
def exception_handler(exc, context):
request = context.get('request')
# 程序出异常都要记录在日志中:请求地址、请求方式、请求时间、请求那个视图函数、用户id
try:
user_id = request.user.pk
if not user_id:
# 如果没有获取名字则默认为匿名用户
user_id = '匿名用户'
except:
user_id = '匿名用户'
# 获取视图函数
view = context.get('view')
logger.error(
f'用户:{user_id}使用:{request.method}请求,请求地址:{request.get_full_path()},视图函数:{str(view)},出错了,错误是:{str(exc)}')
'''
res如果是有值为Response的对象,说明是drf的异常
res如果是为None,说明是drf的异常
'''
res = drf_exception_handler(exc, context)
if res: # drf异常,错误信息是从detail中获取,如果没有则是后面的字符串
res = Response(data={'code': 999, 'msg': res.data.get('detail', '服务器出错,请联系管理员')})
else: # django异常,错误信息是将exc异常对象转成字符串
res = Response(data={'code': 888, 'msg': str(exc)})
return res
2.在配置文件中配置,出了异常就会执行函数
REST_FRAMEWORK = {
# 只要出异常,就会执行exception_handler
'EXCEPTION_HANDLER': 'utils.exceptions.exception_handler',
}
后台配置之二次封装response
1.封装一个Response类,自己写返回的code和msg字段
2.utils/response.py
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)
# 调用父类的__init__来完成
super().__init__(data=data, status=status, headers=headers)
'在视图类中导入即可使用'
3.使用APIResponse返回给前端的格式为
return APIResponse(token='asfdasfd',status=201,code=101)
return APIResponse(status=200, result={'id': 1, 'name': '西游记', 'price': 10})
数据库配置
1.直接使用root用户作为项目的数据库用户,权限太高了,一般在公司中,会给项目单独建立用户,这个用户只对该库权限
2.在mysql中创建一个用户luffy_api,给用户授予luffy库的所有权限
-使用navicate客户端创建数据库
-查看有哪些用户
select user,host from mysql.user;
2.1创建一个luffy_api用户
-授权命令
grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'
-把luffy库下所有表的权限都授予luffy_api这个用户,允许远程链接
grant all privileges on luffy.* to 'luffy_api'@'%' identified by '123';
-把luffy库下所有表的权限都授予luffy_api这个用户,允许本地链接
grant all privileges on luffy.* to 'luffy_api'@'localhost' identified by '123';
-以luffy_api用户登录,只能看到luffy库
3.在配置文件中配置好mysql数据
user = os.environ.get('USER', 'luffy_api')
pwd = os.environ.get('PWD', '123')
# 防止源代码泄露,被人获取数据库用户名、密码
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy',
'USER': user,
'PASSWORD': pwd,
'HOST': '127.0.0.1',
'PORT': 3306
}
}
'django默认使用mysqlDB操作mysql,只需要装mysqlclient模块即可'
3.1mysql的utf8编码与utf8mb4编码的区别
-utf8:一个字符,占两个字节
-utf8mb4:一个字符,占4个字节
'1字节(byte)等于8个比特位'
1.配置好mysql了,项目的用户表是会用Auth的User表,在原有字段的基础上扩写字段
2.user/models.py
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
mobile = models.CharField(max_length=11, unique=True)
# ImageField继承了CharField,使用时需要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
3.在配置文件中配置
# 用户表的配置
AUTH_USER_MODEL = 'user.UserInfo'
1.在配置文件中配置
MEDIA_URL = '/media/'
# 以后提交的文件都会保存在media文件夹下
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
2.在路由中加入
from django.views.static import serve
from django.conf import settings
urlpatterns = [
# 开启media访问
path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT}),
]
前台项目创建和配置
创建前端
1.创建项目,删除无用的代码或文件
2.安装axios
2.1输入命令行安装
cnpm install axios
2.2配置在main.js中
import axios from 'axios'
// 将axios配置好后,在任意组件中都可以使用
Vue.prototype.$axios = axios
2.3使用
this.$axios.get()
使用elementui
1.vue2要使用elementui
cnpm i element-ui -S
// vue3使用element-plus
2.配置在main.js中
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
// 配置elementui
Vue.use(ElementUI);
3.使用方法
在任意组件中复制粘贴(template,script,style)
vue-cookies
1.安装
cnpm install vue-cookies -S
2.配置在main.js中
import cookies from 'vue-cookies'
// 配置cookies
Vue.prototype.$cookies = cookies
3.使用
this.$cookies.set()
bootstrap,jquery
1.安装
cnpm install jquery -S
cnpm install bootstrap@3 -S
2.配置在main.js中
// bootstrap配置
import 'bootstrap'
import 'bootstrap/dist/css/bootstrap.min.css'
3.vue.config.js配置
const webpack = require("webpack");
module.exports = {
configureWebpack: {
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery",
"window.$": "jquery",
Popper: ["popper.js", "default"]
})
]
}
};