ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

路飞项目篇:日志配置、封装全局异常、二次封装Response、路飞数据库配置、路飞User表配置及开放media访问

2022-07-05 22:05:50  阅读:197  来源: 互联网

标签:封装 media 配置 django 路飞 user luffy 日志


目录

1 路飞后台配置之封装logger

# 使用步骤:
	第一步:写一个日志配置的字典(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,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}

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

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',
}

image-20220705111458073

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

# 原来的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)
        
        
        
# 视图类使用
from utils.response import APIResponse
class TestView(APIView):
    def get(self,request):
        return APIResponse(102,'失败',err='没有权限')

4 路飞数据库配置

#使用步骤
	# 第一步,项目配置文件,加入数据库的链接地址
            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;
    -创建用户;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?';
	

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

# 用户板块,用户表---》使用auth的user表,扩写
# 决定使用auth的user表,要在迁移之前决定


# 步骤:
	第一步:创建app
    python ../../manage.py startapp user

   	第二步:注册app
    INSTALLED_APPS = [
	...
    'user'
]
    第三步:扩写auth的user表
    	from django.contrib.auth.models import AbstractUser
        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 删除项目中所有的迁移文件
    	migrations
    -3 删除源码中admin和auth这两个app的迁移文件
    	from django.contrib import admin,auth
    -4 再去迁移
		

5.2 开放media访问

在配置文件中
# media的配置
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')


# 在urls.py 中
from django.views.static import serve
from django.conf import settings

path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT}),



# 浏览器访问(假如media内已经生成icon,里面有一张default.png)
http://127.0.0.1:8000/media/icon/default.png

6 路飞前台项目创建和配置

vue create luffycity

该删的删除

拓展

# 1 mysql 使用localhost连接和使用ip地址链接有什么区别
	1. mysql -h 127.0.0.1 的时候,使用TCP/IP链接,
mysql server 认为该链接来自于127.0.0.1或者是"localhost.localdomain"3d

	2. mysql -h localhost 的时候,是不使用TCP/IP链接的,而使用Unix socket;
	此时,mysql server则认为该client是来自"localhost"

	3. mysql权限管理中的"localhost"有特定含义:
	—— MySQL手册 5.6.4 ..... A Host value may be a hostname or an IPnumber, or 'localhost' to indicate the local host.
    
	unix domain socket 是在socket架构上发展起来的用于同一台主机的进程间通讯(IPC: Inter-Process Communication),它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。UNIX Domain Socket有SOCK_DGRAM或SOCK_STREAM两种工作模式,类似于UDP和TCP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。
# 2 mysql utf8和utf8mb4有什么区别
	一 、UTF8是什么
    utf8”只是“utf8mb3”的一个别名,可以支持1-3字节表示的unicode字符。
	而MySQL在5.5.3版本之后增加了一个utf8mb4的编码,mb4就是most bytes 4的意思,用来兼容四字节的unicode。其实,utf8mb4是utf8的超集,理论上原来使用“utf8”,然后将字符集修改为“utf8mb4”,也并不会对已有的utf8编码读取产生任何问题。当然,为了节省空间,一般情况下使用"utf8"也就够了。

	二、为什么会有UTF8MB4?
	既然utf8应付日常使用完全没有问题,那为什么还要使用utf8mb4呢? 低版本的MySQL支持的utf8(utf8mb3)编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8(utf8mb4)字符集存储。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等


# 读几个中间件
	-django.contrib.sessions.middleware.SessionMiddleware
    -django.middleware.common.CommonMiddleware
    -django.contrib.auth.middleware.AuthenticationMiddleware
    
    
    
    

标签:封装,media,配置,django,路飞,user,luffy,日志
来源: https://www.cnblogs.com/williama/p/16448762.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有