目录
路飞后台配置之封装日志
# 以后项目肯定要记录日志的
日志都可以打印到控制台
日志可以写到日志文件中
日志存到某个库中
所有项目日志统一管理 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配置直接粘贴过去
级别有:info debug woring error
日志轮转,这个是根据大小来轮转的
日志对象:是Django会打到控制台、文件里。后期还可以加多个,就某一个你想打到控制台还是文件中
以后用的话,基本上只去改文件的级别,路径,大小,
到小路飞下的utils(存放工具类)里新建common_logger.py文件
以后要用的就直接导,用logger点info、warning、error
之后就会多出来这么个文件,Django的源码里面也会有日志,所以可以将日志的级别用的高一些的如:error
路飞后台配置之封装处理全局异常
前端要接收的格式,要统一,无论后端是否以出错。
三大认证,视图类的方法中只要出现了异常,就会执行一个函数,但是这个函数只能处理drf的异常。--->>> 所有我们需要自己写个函数,既能处理drf的异常,又能处理Django的异常,这样统一返回的格式,前端看到格式都统一了
使用步骤:
第一步:在uitls中新建 common_exceptions.py
第二步:写个函数,必须有固定的的接收参数
程序出了异常,会走到这儿,还得去配置
把原来的异常也导过来,第一步让它先执行原来的异常,再处理我自己的。drf中它内置了一个给我,去导过来,那么要下载Djangorestframework
再导进原来drf的异常:
可以这写,但是呢想给前端显示的更详细些。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的报的异常:
Django报的异常:
在把res返回出去
在这里可以将异常分的更细,比如数据库的异常,除以0的异常,列表越界的异常
那么程序走到这就是程序出错,会走到这,那么就得记录日志
那么导logger对象来,而记得肯定得详细些。请求地址,请求方式,请求时间(verbose里面我们是配置了时间的),请求哪个视图函数,如果登入了记录一下用户id,日志越详细越好。
而要记的话,有context里面有request,view
drf的配置,这样配好后以后只要出异常,就会执行excption_handler
记录日志:
路飞后台配置之二次封装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。
字典的Update更新,有就更新、没有就新增
如果额外传了就会被kwargs接收,那么就会.update新增到date字典里面
路飞数据库配置
创建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库:
查看用户:
数据使用mysql,之前使用的root用户作为项目的数据可以用户,权限太高了。
比如你在公司里,因为你用的root,在配置里你就能看到用户和密码
现在用的是路飞这个库,但是现在你们可以通过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个字节表示一个字符,
查看有哪些用户
公司主流mysql是5.7,mysql5.7称之为7,mysql5.8称之为8
mysql -h
执行完两条命令之后
查看select user,host from mysql.user;
可以看出本地连接以及远程连接
以luffy_api用户登录
这样库下就只能看到luffy库了,就只对luffy库有权限 ,这样在项目里面就只用luffy_api这个用户来操作我的库
Navicat连接
项目中配置好使用mysql数据
可能存在漏洞,源代码泄露,别人
os.environ是查看环境变量
这么写,以后用户名和密码就配置在环境变量里
这样的好处,项目要上线用户和密码看着是这个,其实还是环境变量里面配置的
实际就是按照环境变量里面的
面试提问
生产环境和测试环境数据库连的肯定不是一个地址,你们是怎么处理的???
我们是有两套配置文件
人家的是:
使用项目连接库
# 项目操作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可以的。
以后使用Django中不使用pymysql了,使用msyqlclient,不需要使用任何补丁了
下载安装mysqlclient
环境变量配置
在做表迁移的时候出现报错:
sys.path里不能放一个对象,如果放的话会出现迁移报错
软件开发模式
# 瀑布模式:bbs项目就是按照这种模式
-需求分析---》设计--》创建数据库 所有都创建---》开发(3个月)---》交给测试--》测试通过---》上线
# 敏捷开发
-需求分析---》设计---》只设计一个板块---》开发(2周)---》交给测试---》运维上线(测试环境)
-设计---》只设计一个板块---》开发(2周)---》交给测试---》运维上线(测试环境)
-一个sprint周期
-scrum敏捷项目管理
user模块User表配置
1.创建app叫user
2.user的app
注册app:
配置:
下载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
配置
在BASE_DIR在小路飞下创建
serve视图函数
两种方式传:转换器、re_path正则,建议使用转换器
serve视图函数源码:
需要传的是我们配置文件配的路径,要这个的路径
那么得导配置文件,这么导它内置的和我们自己配的就都有
解析serve:
普通路由配一个视图函数地址,只是这个视图函数是它给我的,这里由于分组分出一个path来,自然就会给到serve里面的第二参数path的位置。但第三个位置的document_root需要你去指定上,就是media的地址,那如何指定的,是在这儿写了个kwargs等于一个字典,它会把打散然后传给它
结果:在地址栏里面敲
这样就能看到了
路飞前端项目创建和配置
下载axios
配置axios放在原型上
使用elementUI
安装vue-cookies
cnpm install vue-cookies
示例:
这样只要页面一加载,cookies里面就会有个name等于lpz
bootstrap,jquery
如何导入引用:
到main中配置
这样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