django配置文件 路飞后台配置之封装logger ## 2 路飞后台配置之封装全局异常 路飞数据库配置 User模块User表配置,开放media访问


django配置文件

settings.py

import os

import sys

# BASE_DIR不是项目的根路径,他是小的lufeiapi
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# apps路径加入环境变量
sys.path.append(os.path.join(BASE_DIR, 'apps'))
# 加入小lufeiapi到环境变量
sys.path.append(BASE_DIR)

# 导入模块可以从apps下直接进行导入 从项目根路径下开始导入

# 这是一串密钥.session 的加密 必须存在 django中某个地方加密需要用到这个密钥
SECRET_KEY = 'x#7tnzeka5!%sjyo=+#y_0!bjx(6n_^$k^g=-q*kqu140amw(='

# 是否是调试线上环境要用False,
DEBUG = True

# 运行的项目运行在那个地址之上
ALLOWED_HOSTS = []

# Application definition

# 所有的App
INSTALLED_APPS = [
   'django.contrib.admin',  # admin的后台管理
   'django.contrib.auth',  # 他有六个表,auth表,自带rbac的认证
   'django.contrib.contenttypes',  # 生成contenttype表
   'django.contrib.sessions',  # session 相关 有这个可以进行request.session
   'django.contrib.messages',  # 消息框架 flask闪现 前后端混合的时候用得较多分离之后就变得较少
   'django.contrib.staticfiles',  # 静态文件
   'user',
   'home'

]
# 七个中间件间
MIDDLEWARE = [
   'django.middleware.security.SecurityMiddleware',  # 安全 配合上边的密钥进行一些安全的验证
   'django.contrib.sessions.middleware.SessionMiddleware',  # session app的中间件
   'django.middleware.common.CommonMiddleware',  # 路径后带不带斜杠 (进行两次地址的匹配访问然后才加上了斜杠,第一次匹配不成功,然后redirect重定向这个路由)
   'django.middleware.csrf.CsrfViewMiddleware',  # csrf:前后端分离后,不带rcsrf了
   'django.contrib.auth.middleware.AuthenticationMiddleware',  # request.user (生成)
   'django.contrib.messages.middleware.MessageMiddleware',  # 消息框架
   'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 总路由
ROOT_URLCONF = 'lufeiapi.urls'
# 模板相关
TEMPLATES = [
  {
       'BACKEND': 'django.template.backends.django.DjangoTemplates',
       'DIRS': [os.path.join(BASE_DIR, 'templates'), ]
      ,
       'APP_DIRS': True,
       'OPTIONS': {
           'context_processors': [
               'django.template.context_processors.debug',
               'django.template.context_processors.request',
               'django.contrib.auth.context_processors.auth',
               'django.contrib.messages.context_processors.messages',
          ],
      },
  },
]
# 上线用的,运行application对象 application()==运行
WSGI_APPLICATION = 'lufeiapi.wsgi.application'

# (数据库,主从数据库 主从数据库会提高并发量)
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
       'NAME': os.path.join(BASE_DIR, '../../db.sqlite3'),
  }
}

# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
#认证相关
AUTH_PASSWORD_VALIDATORS = [
  {
       'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
  },
  {
       'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
  },
  {
       'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
  },
  {
       'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
  },
]

#国际化
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False

#静态文件相关
STATIC_URL = '/static/'

路飞后台配置之封装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

路飞后台配置之二次封装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)

 

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
第三步:扩写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 再去迁移

 

 

5.2 开放media访问

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


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

概述flask闪现

Flask提供了一个功能方便向前端反馈消息,这个功能叫闪现。闪现的功能是基于session实现,所以我们在使用闪现的时候需要配置secret_key。

 

mysql utf8和utf8mb4有什么区别

可以简单的理解 utf8mb4 是目前最大的一个字符编码,支持任意文字.
为什么会有UTF8MB4?
既然utf8应付日常使用完全没有问题,那为什么还要使用utf8mb4呢? 低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。
UTF-8编码
理论上将, UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。关于UTF编码,请阅读《常见编码总结》一文。
而utf8 则是 Mysql 早期版本中支 持的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。这可能是因为在MySQL发布初期,基本多文种平面之外的字符确实很少用到。而在MySQL5.5.3版本后,要在 Mysql 中保存 4 字节长度的 UTF-8 字符,就可以使用 utf8mb4 字符集了。例如可以用utf8mb4字符编码直接存储emoj表情,而不是存表情的替换字符。
为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8,事实上,最新版的phpmyadmin默认字符集就是utf8mb4。诚然,对于 CHAR 类型数据,使用utf8mb4 存储会多消耗一些空间。
那么utf8mb4比utf8多了什么的呢?
多了emoji编码支持.
如果实际用途上来看,可以给要用到emoji的库或者说表,设置utf8mb4.
比如评论要支持emoji可以用到.
建议普通表使用utf8 如果这个表需要支持emoji就使用utf8mb4
新建mysql库或者表的时候还有一个排序规则
utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下 utf8_general_ci的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是utf8_general_ci,所以新建数据 库时一般选用utf8_general_ci就可以了
如果是utf8mb4那么对应的就是 utf8mb4_general_ci utf8mb4_unicode_ci
 
posted @   文质彬彬赵其辉  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示