# 使用步骤: 第一步:写一个日志配置的字典(atm项目) 第二步:通过配置生成一个logger对象 第三步:以后记录日志,就用这个logger对象 logger.debug .... # # 建议以最短路径导入,还建议你用相对导入 可能程序会报错,报错原因就是循环导入 # 以后再项目中不要使用print打印了,要使用日志输出
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), "log", "luffy.log"), # 日志文件的最大值,这里我们设置300M 'maxBytes': 300 * 1024 * 1024, # 日志文件的数量,设置最大日志数量为10 'backupCount': 10, # 日志格式:详细格式 'formatter': 'verbose', # 文件内容编码 'encoding': 'utf-8' }, }, # 日志对象 'loggers': { 'django': { 'handlers': ['console', 'file'], 'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统 }, } }
utils/exceptions.py
from rest_framework.views import exception_handler from rest_framework.response import Response # 用这个配置文件的好处:无论你是开发阶段,还是上线阶段,取到的都是当前项目运行使用的配置文件 # 项目配置文件如果没写,会有默认的配置文件 from django.conf import settings from utils.loggings import logger def common_exception_handler(exc, context): # 只要走到这,说明程序出异常了,都需要记录日志,越详细越好 request=context.get('request') view=context.get('view') ip=request.META.get('REMOTE_ADDR') path=request.path logger.error('程序出错了,错误视图类是:%s,用户ip是:%s,请求地址是:%s,错误原因:%s'%(str(view),ip,path,str(exc))) # 只处理了drf的异常,如果res有值,就是drf的异常,处理了,如果为None,就是djagno的异常,我们额外处理 res = exception_handler(exc, context) if settings.DEBUG: if res: return Response({'code': 888, 'msg': res.data['detail']}) else: return Response({'code': 999, 'msg': str(exc)}) else: return Response({'code': 999, 'msg': '系统错误,请联系系统管理员'})
配置文件
# drf的配置 REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'utils.exceptions.common_exception_handler', }
# 原来的drf的Response类,不是特别好用,自己封装一个更好用的,以后我们用自己的
class APIResponse(Response): def __init__(self, code=100, msg='成功', status=None, headers=None, **kwargs): data = {'code': code, 'msg': msg} if kwargs: # 有值,说明传了除上面声明的以外,有其他的,要放到data字典中 data.update(kwargs) # 还要调用父类的init完成初始化 super().__init__(data=data, status=status, headers=headers)
#使用步骤 # 第一步,项目配置文件,加入数据库的链接地址 user = os.environ.get('USER', 'luffy') password = os.environ.get('PASSWORD', 'Luffy123?') # 数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'luffy_api', # 数据库的名字 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': user, # 给数据库创建一个用户,叫luffy 'PASSWORD': password }, } # 第二步:由于,django的orm默认用的链接mysql的包是 MysqlDB,我们不用,我们用的是pymysql,所以,每次我们都,在__init__中加入两句话,[猴子补丁]--->在django 2.0.7以后的版本,如果使用pymysql,django源代码报错----》改django源码---》麻烦---》以后不用pymysql了 import pymysql pymysql.install_as_MySQLdb() # myselclient---》跟pymysql师出同源---》以后不用写两句话了 -装这个东西看人品---》有可能你机器装不上 -如果装不上,使用whl文件装 -https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient -尤其在linux系统上 http://www.liuqingzheng.top/python/%E5%85%B6%E4%BB%96/01-%E5%90%84%E4%B8%BB%E6%B5%81Linux%E7%B3%BB%E7%BB%9F%E8%A7%A3%E5%86%B3pip%E5%AE%89%E8%A3%85mysqlclient%E6%8A%A5%E9%94%99/ # 第三步:在数据库创建一个luffy用户,密码是Luffy123?,只能对luffy_api库有操作权限 -查看数据库的用户:select user,host,authentication_string from mysql.user; ''' 新版MySQL8.0.12中,添加用户并设定权限 MySQL8.0之前在添加用户的时候可以直接设置用户权限如: GRANT ALL ON *.* TO `zqj`@`ip` IDENTIFIED BY 'passowrd' WITH GRANT OPTION; 但是在新版MySQL中这样就会报错,必须分开开,先创建用户,然后才能设置权限如下: CREATE USER `zqj`@`ip` IDENTIFIED BY 'zqj' [PASSWORD EXPIRE INTERVAL 90 DAY]; GRANT ALL ON *.* TO `zqj`@`127.0.0.1` WITH GRANT OPTION; 1.创建新用户 CREATE USER 'user1'@'%' IDENTIFIED BY '07fa533360d9'; 如 CREATE USER 'yunwei01'@'%' IDENTIFIED BY 'yunwei01'; '%' - 所有情况都能访问 'localhost' - 本机才能访问 '111.222.33.44' - 指定 ip 才能访问 注:修改密码 update mysql.user set password=password('新密码') where user='user1'; 2.给该用户添加权限 grant all privileges on 想授权的数据库.* to 'user1'@'%'; 如: GRANT all PRIVILEGES on zldc.* to 'yunwei01'@'%'; flush privileges; all 可以替换为 select,delete,update,create,drop 3、查看用户权限 show grants for test; ''' -创建用户;grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码' grant all privileges on luffy_api.* to 'luffy'@'%' identified by 'Luffy123?'; grant all privileges on luffy_api.* to 'luffy'@'localhost' identified by 'Luffy123?';
# 用户板块,用户表---》使用auth的user表,扩写 # 决定使用auth的user表,要在迁移之前决定 # 步骤: 第一步:创建app python ../../manage.py startapp user 第二步:注册app 第三步:扩写auth的user表 class User(AbstractUser): # 必须继承AbstractUser # 必须使用pillow模块 icon = models.ImageField(upload_to='icon', default='icon/default.png') class Meta: db_table = 'luffy_user' # 修改表名 verbose_name = '用户表' # admin的后台管理中显示的中文 verbose_name_plural = verbose_name def __str__(self): # print User的对象时,会显示它返回的数据 return self.username 第四步:去配置文件配置 AUTH_USER_MODEL='user.User' # app名字.类名 第五步:执行两条迁移命令 python manage.py makemigrations python manage.py migrate # 如果项目已经开始写了,再决定用auth的user表扩写 -1 删库----》重新创建出这个库---》里面没有表 -2 删除项目中所有的迁移文件 -3 删除源码中admin和auth这两个app的迁移文件 -4 再去迁移
在配置文件中 # media的配置 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 在urls.py 中 path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT}),
vue create luffycity 该删的删除