前台、前台项目创建和配置

后台配置之封装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个比特位'

User模块User表配置,开放media访问

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'

开放media访问

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"]
            })
        ]
    }
};
posted @ 2022-11-06 11:57  无言以对啊  阅读(60)  评论(0)    收藏  举报