首页 > 数据库 >路飞-day2——路飞后台配置之封装logger、路飞后台配置之封装全局异常、路飞台配置之二次封装response、路飞数据库配置、软件开发模式、User模块用户表、djagno的配置文件讲解、开启m

路飞-day2——路飞后台配置之封装logger、路飞后台配置之封装全局异常、路飞台配置之二次封装response、路飞数据库配置、软件开发模式、User模块用户表、djagno的配置文件讲解、开启m

时间:2023-02-27 19:00:37浏览次数:52  
标签:封装 mysql 配置 用户 django 路飞 luffy path 日志

目录

一、路飞后台配置之封装logger

以后,项目肯定要记录日志

-日志都可以打印到控制台
-日志可以写到日志文件中
-日志存到某个库中
-所有项目日志统一管理    sentry:django写的服务,收集日志的,可以展示  开源的    

使用了日志之后,在项目中不要出现print了,以后都用日志 logger.info()打印信息,以后项目上线,只需要调整日志级别,低级别的日志就不打印了,于是日志输出不用删掉

sentry:django写的实时日志平台

配置步骤

步骤一:复制代码(之前学过的日志字典)到配置文件中(dev.py)

代码如下:

# 真实项目上线后,日志文件打印级别不能过低,因为一次日志记录就是一次文件io操作
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配置的是输出到控制台中的日志内容
        'console': {
            # 实际开发建议使用WARNING
            'level': 'WARNING',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        # file配置的是记录到日志文件中的日志内容
        'file': {
            # 实际开发建议使用ERROR
            'level': 'ERROR',
            '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对象,以后只需要导入,直接使用对象写日志即可
        logger=logging.getLogger('django')

步骤三:在任意想用日志的地方,导入使用即可

views.py

from utils.common_logger import logger
from django.http import JsonResponse
def test_logger(request):
    logger.info('info级别的日志')
    logger.error('error级别的日志')
    return JsonResponse({'name':'zzh'})

urls.py

from django.contrib import admin
from django.urls import path
from user import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test_logger/', views.test_logger),
]

image

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

前端要接收的数据格式,要统一,无论后端是否出错

在drf的三大认证,视图类的方法中只要出了异常,就会执行一个函数,但是这个函数只能处理drf的异常

因此我们需要自己写个函数,既能处理drf异常,又能处理django异常,这样前端看到格式都统一了

# 写一个函数,封装全局异常
	-1 统一返回格式
    -2 记录日志:出了异常,程序有问题,后期排查问题

配置步骤

因为我们要用到drf,所以需要安装djangorestframework模块

步骤一:在utils中新建 common_exceptions.py

步骤二:在common_exceptions.py中编写全局异常处理函数

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的异常,咱们要处理
        logger.error('用户【%s】,ip地址为【%s】,访问地址为【%s】,执行视图函数为【%s】,出错是【%s】' % (user_id, ip, path, str(view), str(exc)))
        res = Response({'code': 888, 'msg': '服务器异常,请联系系统管理员'})

    return res

ps1:这里因为需要用warning级别的日志记录drf中的错误,所以需要修改配置文件中的日志记录等级

# 真实项目上线后,日志文件打印级别不能过低,因为一次日志记录就是一次文件io操作
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配置的是输出到控制台中的日志内容
        'console': {
            # 实际开发建议使用WARNING
            'level': 'WARNING',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        # file配置的是记录到日志文件中的日志内容
        '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, # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}

ps2:因为封装了全局异常处理,所以当用户为登陆的时候,日志中记录的用户名会是None

image

步骤三:在配置文件中注册drf的app,并修改drf使用的异常处理函数以后只要出了异常,都会走咱们的函数

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'home',
    'user',
]

# drf的配置
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
}

步骤四:在视图层中测试

views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.exceptions import APIException

class TestExcepiton(APIView):
    def get(self, request):
        # drf 异常
        raise APIException('drf抛出异常')
        # 未知错误
        # l = [1, 23, 4]
        # print(l[9])
        # 9/0
        # django主动抛的错误
        # raise Exception('出错了')
        return Response('ok')

urls.py

from django.contrib import admin
from django.urls import path
from user import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test_logger/', views.test_logger),
    path('test_exception/', views.TestExcepiton.as_view()),
]

image

image

当我们配置好全局异常处理后,就可以勇敢大胆写代码,即便报错,程序不会蹦,并且会记录日志,并且处理成统一格式

如果我们在配置了全局异常处理的情况下出现程序报错停止的情况,就说明我们编写的全局异常处理函数(common_exceptions.py)中出了问题

三、路飞台配置之二次封装response

  • drf提供的Response对象,不能很方便的加入code和msg字段,但是咱们公司规定,前端收到的格式都是固定的。

  • 因此我们自己封装一个Response类,以后都用我们自己封装的,方便咱们写code和msg

	-{code:100,msg:提示,data:{}/[]}
    -{code:100,msg:提示,token:asdfasd,user:lqz}

封装后的效果:code,msg可以不传,不传就用默认的值

配置步骤

第一步:在utils下新建common_response.py

第二步:在common_response.py中封装APIRespon

ps:这里使用了字典的update方法,基本作用就是跟新有的字段,并把没有的字段添加进去

from rest_framework.response import Response

'''

以后使用 
    -return APIResponse()----------前端收到-->{code:100,msg:成功}
    -return APIResponse(token=xsdse,username=lqz)----------前端收到-->{code:100,msg:成功,token:xsdse,username:lqz}
    -return APIResponse(data=[{},{},{}])----------前端收到-->{code:100,msg:成功,data:[{},{},{}]}
    -return APIResponse(code=101,msg=失败)----------前端收到-->{code:101,msg:失败}
    -return APIResponse(headers={'xx':'xx'})----------前端收到-->{code:100,msg:成功},但是响应头中有xx=xx
    -return APIResponse(status=201)----------前端收到-->{code:100,msg:成功},但是响应状态码是201
'''


class APIResponse(Response):
    def __init__(self, code=100, msg='成功', status=None, headers=None, **kwargs):
        data = {'code': code, 'msg': msg}
        if kwargs:  # 有值,说明,传了 除了code msg   status headers 以外的,咱们都要返回给前端,放到这个data中
            data.update(kwargs)
        # Response(data=data,status=status,headers=headers)
        super().__init__(data=data, status=status, headers=headers)

        # 不要return,你可以这样做  self.data=data  self.status=status

第三步:导入使用,视图函数的方法,返回时,都使用咱们自己的

views.py

## 只是为了测试APIResponse
from utils.common_response import APIResponse


class TestAPIResponse(APIView):
    def get(self, request):
        # return APIResponse(token='asdfasdf', usename='lqz')
        # return APIResponse(code=101, msg='错误')
        return APIResponse(data=[{'name': "红楼梦", 'price': '66'}, {'name': "红楼梦", 'price': '66'}])

urls.py

from django.contrib import admin
from django.urls import path
from user import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test_logger/', views.test_logger),
    path('test_exception/', views.TestExcepiton.as_view()),
    path('test_response/', views.TestAPIResponse.as_view()),
]

image

四、路飞数据库配置

# 数据库使用mysql,配置mysql

# 之前使用root用户作为项目的数据库用户,权限太高了,一般公司里,给项目单独建立一个用户,这个用户只对当前库有权限

# 在mysql中创建一个用户luffy_api,给用户授予luffy库的所有权限
    -1 链接mysql,创建一个luffy库
    	-命令行创建
        -navicate客户端创建
   -2 查看有哪些用户
	select user,host from mysql.user;
   -3 创建一个luffy_api用户(之前有个root用户,权限很高)
    #授权账号命令:grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'
    # 把luffy库下所有表的权限都授予luffy_api这个用户,允许远程链接
    grant all privileges on luffy.* to 'luffy_api'@'%' identified by 'Luffy123?';
    # 把luffy库下所有表的权限都授予luffy_api这个用户,允许本地链接
    grant all privileges on luffy.* to 'luffy_api'@'localhost' identified by 'Luffy123?';
    
   -4 以luffy_api用户登录,查看,只能看到luffy库
    
    
    
    
# 在项目中配置好使用mysql数据
	1 在配置中:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'luffy',
            'USER': user,
            'PASSWORD': password,
            'HOST': '127.0.0.1',
            'PORT': 3306
        }
    }
    
    2 运行项目会报错,django默认使用mysqlDB操作mysql,mysqlDB这个模块,在python2可以的,在python3中不支持,于是咱们使用pymysql替换,到了django2.0.7以后,如果使用pymysql替换,需要改django的源代码,后期使用mysqlclient,替换pymysql,mysqlclient是mysqlDB的python3.x版本
     -如果使用pymysql,需要改源码,需要执行
        import pymysql
		pymysql.install_as_MySQLdb() # 猴子补丁,把里面所有mysqlDB的对象,都替换成pymysql
    -猴子补丁是:在程序运行过程中得动态替换技术:https://www.liuqingzheng.top/python/Python%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/24-%E5%8D%8F%E7%A8%8B%E4%B9%8Bgevent%E6%A8%A1%E5%9D%97/
    
    -以后再django中不使用pymysql了,使用mysqlclient,不需要再执行任何补丁了
    -win,linux,mac,这个模块不太好装,看人品,有时候很顺利,有时候装不上
  3 只需要装 mysqlclient,一切都解决了
    
    
# 目前咱们配置文件中,直接写死了mysql的用户名和密码
	-可能存在的风险---》如果我的源代码泄露了---》数据库用户名密码就泄露---》黑客可以远程登录---》脱库
    -华住汉庭的酒店入住信息泄露,源代码泄露了,导致被脱库
    -上海随身办的数据泄露
# 补充:
	mysql的utf8编码和utf8mb4的区别?
    	-utf8:一个字符,占两个字节(byte--->1个byte是8个比特位  10101010)
        -utf8mb4:一个字符,占4个字节,表情符号
        -咱们学的utf-8:可变长可以1---4字节表示一个字符
    
    
    
# 研究一下 以下两种登录方式的区别?第一个快
    mysql -uroot -p
    mysql -h 192.168.1.11 -P 3306 -uroot -p

image-20221104113811509

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

# 配置好mysql了,咱们项目的用户表是,会用Auth的User表,扩写字段

# 使用步骤
	-1 创一个用户app:python ../../manage.py startapp user
    -2 user 的app的models.py中扩写用户表
    class UserInfo(AbstractUser):
        mobile = models.CharField(max_length=11, unique=True)
        # 需要pillow包的支持 ImageField继承了 FileField只存储图片
        icon = models.ImageField(upload_to='icon', default='icon/default.png')

        class Meta:
            db_table = 'luffy_user'  # 指定表明
            verbose_name = '用户表'  # 后台管理中显示中文
            verbose_name_plural = verbose_name

        def __str__(self):
            return self.username
        
    -3 配置文件配置,注册app,安装pillow模块
    	# 用户表的配置
		AUTH_USER_MODEL='user.UserInfo'
    -4 两条命令迁移
    	

2 前后端分离的rbac项目演示

# 后台:https://gitee.com/liuqingzheng/rbac_manager
# 前端:https://gitee.com/liuqingzheng/vue_admin

4 luffy数据库创建

4.1 创建用户创建库

# 创建luffy数据库
# 之前项目操作数据库,都是使用root用户,root用户权限太高了,在公司里,一般不会给你root用户权限
# 如果开发人员是root权限,数据安全性就很差
	
    
# 开发人员,专门创建一个用户,用户只对当前项目的库有操作权限
	
    
# 创建一个luffy库,创建luffy用户,luffy用户只对luffy库有操作权限

	
    
# 面试题:utf8  utf8mb4 有什么区别

# 创建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库所有权限
"""
设置权限账号密码
# 授权账号命令: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?
"""

4.2 使用项目连接库

# 项目操作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
    }
}

5 软件开发模式

# 瀑布模式:bbs项目就是按照这种模式
	-需求分析---》设计--》创建数据库 所有都创建---》开发(3个月)---》交给测试--》测试通过---》上线
	
# 敏捷开发
	-需求分析---》设计---》只设计一个板块---》开发(2周)---》交给测试---》运维上线(测试环境)
    -设计---》只设计一个板块---》开发(2周)---》交给测试---》运维上线(测试环境)
	
    -一个sprint周期
    -scrum敏捷项目管理

img

6 User模块用户表


# 你决定使用auth表扩写,项目一定不要先迁移,先建好用户表再迁移
	已经迁移完了,再想用auth的user表
    -删库,删迁移文件所有app
    -删admin和auth的迁移文件


# 用户表使用auth表扩写  pip install Pillow
class User(AbstractUser):
    # 扩写手机号和头像字段
    mobile = models.CharField(max_length=11, unique=True)
    # 需要pillow包的支持
    icon = models.ImageField(upload_to='icon', default='icon/default.png')

    class Meta:
        db_table = 'luffy_user'
        verbose_name = '用户表'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username


# 遇到的问题,明明小luffyapi已经加入到环境变量,程序运行没问题,但是表迁移,就报错,找不到模块
	-打印了看一下,确实环境变量有,但是不是个字符串,是个对象
    -程序运行,是没问题
    -迁移有问题:配置文件中转成字符串,就解决了

7 djagno的配置文件讲解

# pathlib   # 3.6 以后,处理文件路径的模块,原来是os,



# 面试题,md5是对称加密还是非对称加密
	-对称加密:加密的秘钥和解密的秘钥是同一个
    -非对称加密:加密使用公钥加密,解密使用私钥解密,使用公钥是不能解密的
    -摘要算法:没有解密这一说
    
    
    
# 运行django ,泡在0.0.0.0上,局域网内,所有人都能访问
from pathlib import Path
import os
import sys

# 项目根路径
# 我们就是要让小路飞路径作为项目根路径
BASE_DIR = Path(__file__).resolve().parent.parent  # 项目根路径, 小路飞luffy_api路径 D:\pythonProject03\luffy_api\luffy_api
# print(BASE_DIR)
# 把 apps 路径加入到环境变量
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
# 把BASE_DIR也加入到环境变量,以后直接从小路飞开始导起即可
sys.path.insert(0, str(BASE_DIR))
# print(sys.path)
# 以后从大路飞开始导起,或者小路飞开始导起,或者apps开始导起都可以


# 秘钥,涉及到加密的django中,都会用它
SECRET_KEY = 'django-insecure-!g(8l%fw_#t$pz$x4jdf#e3$b4+c%xzqyq@3zki08vj&i)z4k-'

# 项目是以debug模式运行,还是非debug模式运行

# 项目上线,要改成false
# debug=True 代码可以热更新
# 调试模式下,对开发者更友好:可以列出所有路径.报了错,前端能看到
DEBUG = False
# 它搭配debug=False,它的意思是,允许我的项目部署在哪个ip地址上,* 表示允许部署在所有地址上
ALLOWED_HOSTS = ['*']



# django 是多个app组成的,里面配置app,默认带的app,django内置的app
# django 是一个大而全的框架,有很多内置app:
#   admin后台管理,
#   auth权限管理,
#   contenttypes表中存app也表的关系,
#   sessions session表,django的session相关
#   messages:消息框架,flask讲闪现,是一样的东西
#  staticfiles:静态资源的

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',

    # 'luffy_api.apps.home',   # luffy_api在环境变量,直接从这一层开始导起, 太长了,以后就想 注册  home
    # 'luffy_api.apps.user'
    'home',
    'user'
]


# 中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',  # 安全相关中间件
    'django.contrib.sessions.middleware.SessionMiddleware', # session相关中间件
    'django.middleware.common.CommonMiddleware',            # 带不带 / 问题
    'django.middleware.csrf.CsrfViewMiddleware',            # csrf 认证,生成csrf串
    'django.contrib.auth.middleware.AuthenticationMiddleware', # 用户认证
    'django.contrib.messages.middleware.MessageMiddleware',  #消息框架相关
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]


# 根路由
ROOT_URLCONF = 'luffy_api.urls'

# 模板文件
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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',
            ],
        },
    },
]


# 项目运行的配置---》项目上线运行,使用uwsgi 运行  application()
WSGI_APPLICATION = 'luffy_api.wsgi.application'

# 用户名密码写死在代码中了,保证安全
name = os.environ.get('LUFFY_NAME', 'luffy')
password = os.environ.get('LUFFY_PASSWORD', 'Luffy123?')
# 拓展:有的公司,直接有个配置中心---》服务--》只用来存放配置文件


# 数据库配置,mysql 主从搭建完,读写分离
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'luffy',
        'USER': name,
        'PASSWORD': password,
        'HOST': '127.0.0.1',
        'PORT': 3306
    },
}

#忽略掉
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/'


# 
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

8 开启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

扩展

# 期终架构相关
	-前端---》看人家开源的前端项目,看不懂
    -第一种情况,vue+java====》分析有哪些接口,drf复写出来
	-第二种情况: 你新建前端项目,你看到它哪个页面好看,copy你里面去只要template和style  
    	-js东西自己写


# https://zhuanlan.zhihu.com/p/370167569


# windows安装 mysql 5.7
https://zhuanlan.zhihu.com/p/571585588

作业

1 路飞封装日志并测试
2 封装异常处理记录日志并测试
3 封装Resposne并测试
4 创建路飞用户,路飞库
5 创建用户表,迁移成功


---------扩展------
6 搜索:utf8和utf8mb4的区别
7 搜索:mysql本地连接和用ip连接的区别
8 学习python位运算
9 重装mysql 5.7


标签:封装,mysql,配置,用户,django,路飞,luffy,path,日志
From: https://www.cnblogs.com/zhihuanzzh/p/17161492.html

相关文章

  • k8sdeploy配置文件示例
    apiVersion:extensions/v1beta1kind:Deploymentmetadata:name:[k8s服务名]namespace:defaultlabels:k8s-app:[k8s服务名]spec:replicas:1te......
  • 封装
    封装属性私有,get/setpackagecom.andy.base.oop.demo01.demo04;//类publicclassStudent{//属性私有privateStringname;//名字privateintid;......
  • 企业为什么要做安全配置检查?
    随着行业信息化建设的不断深入,生产、业务支撑系统的网络结构越来越复杂,由此带来的各种应用和服务器的数量及种类也日益增多,一旦发生维护人员错误操作,或者采用一成不变的初始......
  • 软件开发流程-路飞项目需求- pip永久换源-虚拟环境-路飞项目前后端创建-包导入-后端项
    目录软件开发流程-路飞项目需求-pip永久换源-虚拟环境-路飞项目前后端创建-包导入-后端项目调整目录今日内容概要今日内容详细1软件开发流程2路飞项目需求3pip永久换源......
  • nginx代理本地目录配置文件
    #usernobody;worker_processes1;#error_loglogs/error.log;#error_loglogs/error.lognotice;#error_loglogs/error.loginfo;#pidlogs/nginx......
  • vite 打包vue3项目 nginx配置访问 生成dist文件夹文件
    其中一个是,vite项目执行“vitebuild”并部署上线后,在浏览器中访问就会有以下关于路由的奇怪问题:我们用嵌套路由开发的页面生成的路径,个别菜单在初次加载、或者二......
  • 配置ssh连接git
    在学习GitHub上的开源代码时,为了方便经常需要通过git从github克隆代码,如果是首次从github克隆代码时经常会碰到下面的提示:Warning:Permanentlyadded'github.com,20.20......
  • 全局异常配置
    xml:<!--validation验证--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validati......
  • idea开发使用外置tomcat配置
    1.添加依赖<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><scope>provided</scope></dependency>......
  • Prometheus配置Grafana监控大屏
    简介Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。主要特点展示方式:快速灵活的客户端图表,面板插件有许......