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

路飞后台配置之封装日志

# 以后项目肯定要记录日志的
	日志都可以打印到控制台
  日志可以写到日志文件中
  日志存到某个库中
  所有项目日志统一管理	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不是一个东西:是可变长的,可以14个字节表示一个字符,

查看有哪些用户

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用户登录

image-20230227214955377

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

image-20230227214927741

Navicat连接

image-20230226154323739

项目中配置好使用mysql数据

image-20230226154727937

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

image-20230226155402409

os.environ

os.environ是查看环境变量

image-20230226160254216

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

image-20230226160412164

image-20230226160554140

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

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

image-20230226160757621

image-20230226160840038

面试提问

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

我们是有两套配置文件dev、drop

人家的是:

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
posted @   小福福  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
  1. 1 原来你也在这儿 温余福
  2. 2 世间美好和你环环扣扣 温余福
  3. 3 随风起舞 温余福
  4. 4 罪恶都市 温余福
世间美好和你环环扣扣 - 温余福
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 尹初七

作曲 : 温余福

编曲 : 彭圣杰

偏偏秉烛夜游

偏偏秉烛夜游

午夜星辰 似奔走之友

爱你每个结痂伤口

酿成的陈年烈酒

入喉尚算可口

入喉尚算可口

怎么泪水 还偶尔失守

邀你细看心中缺口

裂缝中留存 温柔

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

让樱花偷偷 吻你额头

让世间美好 与你环环相扣

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

当樱花开的纷纷扬扬

当世间美好 与你环环相扣

特别鸣谢:槿葵,我们的海报制作妹妹。

原唱:柏松

吉他:柏松

和声:柏松

录音:柏松

混音:张强

点击右上角即可分享
微信分享提示