对于通常Django工程的配置中,创建出来的源目录结构远远不能胜任实际项目中开发的需求,故而需要自己配置目录结构,以下为个人学习简记
1、首先往往是需要去修改setting文件的路径,一般是在对应的工程代码文件夹下,如图
image.png
2、改变了文件路径故需要去确认BASE_DIR 的路径是否正确
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
此段代码中:
__file__得到当前文件文件名字
os.path.abspath(__file__)得到当前文件的绝对路径
os.path.dirname(os.path.abspath(__file__)))得到当前文件的上一层的文件夹路径
os.path.dirname(os.path.dirname(os.path.abspath(__file__))))得到当前文件的上一次文件夹的上一层
BASE_DIR就是manage.py文件的所在路径
除此之外,修改了Setting.py文件还需要修改manage.py里面的默认环境配置,修改为现在的路径
image.png
3、一般来说app应用需统一存放到单独的app文件夹里面,相应的也需要配置
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
sys.path包含了python解释器导包路径
image.png
然后INSTALLED_APPS里面添加app的相对路径即可
4、接下来是设置后端数据库,不通的数据库引擎不一样,MySql一般配置如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'meiduo',
'USER': 'meiduo',
'PASSWORD': 'password',
'HOST': '192.168.47.128',
'PORT': '3306',
}
}
ENGINE为要使用的数据库后端。内置的数据库后端是:
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
5、后端缓存Redis配置,除default外可添加多项
CACHE = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': ['redis://192.168.47.128:6379/0'],
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'CONNECTTON_POOL_KWARGS': {'max_connections': 128},
},
},
}
6、关于LOGGING
Python日志记录配置由四部分组成:
Logger 记录仪
Handler 处理程序
Filters 过滤器
Formaters 格式化程序
记录器
是记录系统的入口点,可以将消息写入其中以进行处理,写入记录器的每条消息都是一个日志记录,记录器确定需要处理消息后,会将其传递给Handler
记录器配置为具有日志级别。此日志级别描述了记录器将处理的消息的严重性。Python定义了以下日志级别:
DEBUG:用于调试目的的底层系统信息
INFO:一般系统信息
WARNING:描述已发生的小问题的信息
ERROR:描述已发生的主要问题的信息
CRITICAL:描述已发生的严重问题的信息
处理程序
处理程序是确定记录器中每个消息发生什么情况的引擎。它描述了特定的日志记录行为,例如将消息写到屏幕,文件或网络套接字。
像记录器一样,处理程序也具有日志级别。如果日志记录的日志级别不满足或超过处理程序的级别,则处理程序将忽略该消息。
一个记录器可以具有多个处理程序,并且每个处理程序可以具有不同的日志级别。这样,可以根据消息的重要性提供不同形式的通知。
过滤器
用于提供其他控制,以控制哪些日志记录从记录器传递到处理程序。
过滤器还可以用于在发出之前修改日志记录。例如,您可以编写一个过滤器,以将ERROR日志记录降级 WARNING为满足特定条件的记录。
过滤器可以安装在记录器或处理程序上;链中可以使用多个过滤器来执行多个过滤操作。
格式化
最终,日志记录需要呈现为文本。格式器描述了该文本的确切格式
以下是相当复杂的日志记录设置的示例
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'filters': {
'special': {
'()': 'project.logging.SpecialFilter',
'foo': 'bar',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['special']
}
},
'loggers': {
'django': {
'handlers': ['console'],
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
'myproject.custom': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
'filters': ['special']
}
}
}
日志的使用
# import the logging library
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
def my_view(request, arg1, arg):
...
if bad_mojo:
# Log an error message
logger.error('Something went wrong!')
命名记录器
按照约定,记录器名称通常为name,其中包含记录器的python模块的名称。这使您可以按模块过滤和处理日志记录调用。但是,如果您采用其他方式来组织日志记录消息,则可以提供任何用点号分隔的名称来标识记录器
# Get an instance of a specific named logger
logger = logging.getLogger('project.interesting.stuff')
日志调用
记录器实例包含每个默认日志级别的输入方法:
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()
还有其他两个日志记录调用:
logger.log():手动发出具有特定日志级别的日志消息。
logger.exception():创建ERROR包装当前异常堆栈框架的级别日志记录消息。
这是一个简单的配置,它将记录器的所有日志记录写入本地文件
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/path/to/django/debug.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}