首页 > 数据库 >路飞项目:封装日志 全局处理 封装response 数据库配置 软件开发模式 user表配置 开启media访问

路飞项目:封装日志 全局处理 封装response 数据库配置 软件开发模式 user表配置 开启media访问

时间:2023-02-27 23:35:09浏览次数:48  
标签:配置 封装 media mysql --- user luffy 日志 response

目录

路飞后台配置之封装日志

# 以后项目肯定要记录日志的
	日志都可以打印到控制台
  日志可以写到日志文件中
  日志存到某个库中
  所有项目日志统一管理	sentry:Django写的服务,收集日志的,可以展示 开源的

在以后的项目中不要再出现print了,以后都用日志logger.info(),以后项目上线,只需要调整日志级别,低级别的日志就不打印了,于是日志输出不用删掉

操作步骤:

第一步:在配置文件中加入 日志配置 ---大字典

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': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            # 实际开发建议使用ERROR
            'level': 'WARNING',
            '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,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}

第二步:在utils新建 common_logger.py,得到日志对象

import logging
logger = logging.getLogger('django')

第三步:在任意位置想用日志的地方,导入使用即可

from utils.common_logger import logger
logger.info('info级别的日志')
logger.error('error级别的日志')

后期可以通过日志来排查错误等,Django就是基于原生的logging模块来配置的

dev配置直接粘贴过去

image-20230226125604524

级别有:info debug woring error

日志轮转,这个是根据大小来轮转的

image-20230226130203054

日志对象:是Django会打到控制台、文件里。后期还可以加多个,就某一个你想打到控制台还是文件中

image-20230226130736286

以后用的话,基本上只去改文件的级别,路径,大小,

到小路飞下的utils(存放工具类)里新建common_logger.py文件

image-20230226132513604

以后要用的就直接导,用logger点info、warning、error

之后就会多出来这么个文件,Django的源码里面也会有日志,所以可以将日志的级别用的高一些的如:error

image-20230227191701427

路飞后台配置之封装处理全局异常

前端要接收的格式,要统一,无论后端是否以出错。

三大认证,视图类的方法中只要出现了异常,就会执行一个函数,但是这个函数只能处理drf的异常。--->>> 所有我们需要自己写个函数,既能处理drf的异常,又能处理Django的异常,这样统一返回的格式,前端看到格式都统一了

使用步骤:

第一步:在uitls中新建 common_exceptions.py

第二步:写个函数,必须有固定的的接收参数

image-20230226134020449

程序出了异常,会走到这儿,还得去配置

把原来的异常也导过来,第一步让它先执行原来的异常,再处理我自己的。drf中它内置了一个给我,去导过来,那么要下载Djangorestframework

image-20230226134418077

image-20230226134359922

再导进原来drf的异常:

image-20230226134732342

可以这写,但是呢想给前端显示的更详细些。if response有值就是drf的异常,否则就是Django的异常。

from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from utils.common_logger import logger


# 只要走到这个函数中,一定是出异常了,所以要记录日志
def exception_handler(exc, context):
    # 1 记录日志 : 哪个ip地址,用户id是多少,访问哪个路径,执行哪个视图函数,出了什么错
    request = context.get('request')
    view = context.get('view')
    ip = request.META.get('REMOTE_ADDR')
    user_id = request.user.pk
    path = request.get_full_path()
    response = drf_exception_handler(exc, context)
    if response:
        logger.warning('drf出了异常,异常是:%s' % str(exc))
        # drf的异常已经处理了--->直接取detail 会有点小小的问题,碰到再解决
        res = Response({'code': 999, 'msg': response.data.get('detail', '服务器异常,请联系系统管理员')})
    else:
        # djagno的异常,无法直接取detail了,咱们自己要处理
        logger.error('用户【%s】,ip地址为【%s】,访问地址为【%s】,执行视图函数为【%s】,出错是【%s】' % (user_id, ip, path, str(view), str(exc)))
        res = Response({'code': 888, 'msg': '服务器异常,请联系系统管理员'})

    return res

第三步:配置文件,以后只要出现了异常,都会走咱们的函数

REST_FRAMEWORK = {
  'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler'
}

else说明是Django的异常,那么msg的信息就不能在里面取了。把exc转成个字符串,因为exc就是异常对象,给它转成字符串。

drf的报的异常:

image-20230227210630644

Django报的异常:

image-20230227210816228

在把res返回出去

在这里可以将异常分的更细,比如数据库的异常,除以0的异常,列表越界的异常

那么程序走到这就是程序出错,会走到这,那么就得记录日志

那么导logger对象来,而记得肯定得详细些。请求地址,请求方式,请求时间(verbose里面我们是配置了时间的),请求哪个视图函数,如果登入了记录一下用户id,日志越详细越好。

而要记的话,有context里面有request,view

image-20230226142325339

drf的配置,这样配好后以后只要出异常,就会执行excption_handler

image-20230226141953548

记录日志:

image-20230226142812328

路飞后台配置之二次封装response

本身drf有Response,但是咱们公司规定,前端收到的格式否是固定的
	-{code:100,msg:提示,data:{}/[]}
	-{code:100,msg:提示,token:asdfasd,user:lqz}
对response进行封装,封装之后,code, msg可以不传,不传就用默认的

drf提供的Response对象,返回公司都有规定要返回code、需要返回msg。而它提供的我们不能很方便的加入code、msg的字段。那么自己封装一个Response类

使用步骤:

第一步:

所以我们封装,那么就又得写在utils里面,新建response文件

第二步:

封装APIRespon,基于Response封装,Response类加括号就会执行它的双下init。

image-20230226144601131

字典的Update更新,有就更新、没有就新增

如果额外传了就会被kwargs接收,那么就会.update新增到date字典里面

image-20230227212930266

路飞数据库配置

创建luffy数据库

"""
1.管理员连接数据库
>: mysql -uroot -proot

2.创建数据库
>: create database luffy default charset=utf8;

3.查看用户
>: select user,host,password from mysql.user; 
只有root用户,要创建luffy用户

# 5.7往后的版本
>: select user,host,authentication_string from mysql.user;
"""

创建个luffy库:

image-20230227214006835

查看用户:

image-20230227214644120

数据使用mysql,之前使用的root用户作为项目的数据可以用户,权限太高了。

比如你在公司里,因为你用的root,在配置里你就能看到用户和密码

image-20230226150221121

现在用的是路飞这个库,但是现在你们可以通过root用户和密码登入进去之后,能进去看到所有的库,对所有的库都有权限,权限太高了。

所以一般公司里,给项目单独建立一个用户,这个用户只对当前库有权限。

在mysql中创建一个用户,给用户授予luffy库的所有权限

创建luffy用户

设置权限账号密码
# 授权账号命令:grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'

1.配置任意ip都可以连入数据库的账户
>: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';

2.由于数据库版本的问题,可能本地还连接不上,就给本地用户单独配置
>: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';

3.刷新一下权限
>: flush privileges;

只能操作luffy数据库的账户
账号:luffy
密码:Luffy123?

mysql的utf8编码和utf8mb4的区别

utf8: 一个字符,占两个字节,一个字节(byte)占8个比特位(可以当成GBK,因为GBK的一个字符也是占两个字节)

utf8mb4:一个字符占4个字节,会有一些表情符号,

咱们学的utf-8跟mysql的utf8不是一个东西:是可变长的,可以1到4个字节表示一个字符,

查看有哪些用户

image-20230226152523744

公司主流mysql是5.7,mysql5.7称之为7,mysql5.8称之为8

image-20230226153218601

image-20230226153336118

image-20230226153551412

mysql -h

image-20230227113826743

执行完两条命令之后

查看select user,host from mysql.user;

可以看出本地连接以及远程连接

image-20230226153739261

以luffy_api用户登录

image-20230227214955377

这样库下就只能看到luffy库了,就只对luffy库有权限 ,这样在项目里面就只用luffy_api这个用户来操作我的库

image-20230227214927741

Navicat连接

image-20230226154323739

项目中配置好使用mysql数据

image-20230226154727937

可能存在漏洞,源代码泄露,别人

image-20230226155402409

os.environ是查看环境变量

image-20230226160254216

这么写,以后用户名和密码就配置在环境变量里

image-20230226160412164

image-20230226160554140

这样的好处,项目要上线用户和密码看着是这个,其实还是环境变量里面配置的

实际就是按照环境变量里面的image-20230226160749575

image-20230226160757621

image-20230226160840038

面试提问

生产环境和测试环境数据库连的肯定不是一个地址,你们是怎么处理的???

我们是有两套配置文件

人家的是:

image-20230226161221922

使用项目连接库

# 项目操作mysql,需要安装模块
	-pymysql
    -mysqlDB
    -mysqlclient
    
    -历史:原来py2上有个操作mysql的模块叫mysqlDB,但到py3,没有支持py3,django默认使用这个模块去连接mysql,默认使用-mysqlDB连接,-mysqlDB不支持py3,运行报错
    -我们使用pymysql,作为连接mysql的数据库模块,但是需要加代码
    	imprort pymysql
        pymysql.install_as_mysqldb()  # 猴子补丁
        
    -django 2.2.2以后,还使用pymysql,需要改djagno源代码
    
    -统一使用mysqlclient来作为操作mysql的底层库
    	-基于py2的mysqldb,在py3上重新了,但是名字改成了mysqlclient
    -使用mysqlclient,只需要安装这个模块,不需要再写任何代码,直接用即可
    
    -但是:mysqlclient 这个模块,不好装
    	-win 一般人品好,人品好,pip install mysqlclient
        -人品不好,装不了,centos部署项目,后面会讲centos上如何装
        

# mysqlclient
pip install mysqlclient

###### 配置文件修改,连接mysql,使用路飞用户


# 用户名密码写死在代码中了,保证安全
name = os.environ.get('LUFFY_NAME', 'luffy')
password = os.environ.get('LUFFY_PASSWORD', 'Luffy123?')
# 拓展:有的公司,直接有个配置中心---》服务--》只用来存放配置文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'luffy',
        'USER': name,
        'PASSWORD': password,
        'HOST': '127.0.0.1',
        'PORT': 3306
    }
}

运行会报错,因为Django默认使用mysqlDB操作,mysqlDB这个模块,在python2可以的。

image-20230226162729774

image-20230226164032692

以后使用Django中不使用pymysql了,使用msyqlclient,不需要使用任何补丁了

下载安装mysqlclient

image-20230226164712955

环境变量配置

image-20230226164602835

在做表迁移的时候出现报错:

image-20230227231617657

sys.path里不能放一个对象,如果放的话会出现迁移报错

软件开发模式

# 瀑布模式:bbs项目就是按照这种模式
	-需求分析---》设计--》创建数据库 所有都创建---》开发(3个月)---》交给测试--》测试通过---》上线
	
# 敏捷开发
	-需求分析---》设计---》只设计一个板块---》开发(2周)---》交给测试---》运维上线(测试环境)
    -设计---》只设计一个板块---》开发(2周)---》交给测试---》运维上线(测试环境)
	
    -一个sprint周期
    -scrum敏捷项目管理

image-20230227231542319

user模块User表配置

1.创建app叫user

image-20230226164851030

2.user的app

image-20230226165120125

image-20230226165241366

image-20230226165301377

注册app:

image-20230226165523118

配置:

image-20230226165453982

下载pillow模块,再迁移:要注意路径,manage.py是在小路飞下面了

开启media访问

# 配置文件加入
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# 总路由中设置
# re_path('^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT})
path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT})
# 访问
http://127.0.0.1:8000/media/icon/default.png
        
        
# 以后使用djagno的配置文件都用这个
from django.conf import settings

配置

image-20230226165804279

在BASE_DIR在小路飞下创建

image-20230226170102259

serve视图函数

image-20230226170209944

两种方式传:转换器、re_path正则,建议使用转换器

image-20230226170316632

serve视图函数源码:

image-20230227225959577

需要传的是我们配置文件配的路径,要这个的路径

image-20230226170841970

那么得导配置文件,这么导它内置的和我们自己配的就都有

image-20230226170630614

解析serve:

普通路由配一个视图函数地址,只是这个视图函数是它给我的,这里由于分组分出一个path来,自然就会给到serve里面的第二参数path的位置。但第三个位置的document_root需要你去指定上,就是media的地址,那如何指定的,是在这儿写了个kwargs等于一个字典,它会把打散然后传给它

image-20230226171205843

结果:在地址栏里面敲

这样就能看到了

image-20230226171731112

路飞前端项目创建和配置

下载axios

配置axios放在原型上

image-20230226172729732

使用elementUI

image-20230226173248050

image-20230226173310295

安装vue-cookies

cnpm install vue-cookies

image-20230226173836519

示例:

这样只要页面一加载,cookies里面就会有个name等于lpz

image-20230226174046974

bootstrap,jquery

如何导入引用:

image-20230226174506929

image-20230226174425140

到main中配置

image-20230226174549539

image-20230226174644270

这样bootstrap和jQuery就都能用了,这样就也可以使用jQuery的ajax了,但是不建议这样使用

扩展

# 期终架构相关
	-前端---》看人家开源的前端项目,看不懂
    -第一种情况,vue+java====》分析有哪些接口,drf复写出来
	-第二种情况: 你新建前端项目,你看到它哪个页面好看,copy你里面去只要template和style  
    	-js东西自己写

# https://zhuanlan.zhihu.com/p/370167569

# windows安装 mysql 5.7
https://zhuanlan.zhihu.com/p/571585588

标签:配置,封装,media,mysql,---,user,luffy,日志,response
From: https://www.cnblogs.com/xiao-fu-zi/p/17162365.html

相关文章