Django 开发环境配置
后台 Django项目环境搭建
环境
mkvirtualenv BaseLineApi
pip install django
pip install djangorestframework
pip install PymySQL
创建项目
开发:用pycharm打开项目,并选择提前备好的虚拟环境
django-admin startproject BaseLineApi
重构项目目录
新建项目后, 目录结构如下
│ manage.py
│
└─BaseLineApi
asgi.py
settings.py
urls.py
wsgi.py
__init__.py
- 根目录新建logs目录,和内层目录BaseLineApi同级
- 根目录新建scripts目录,和内层目录BaseLineApi同级,里面存放本地的测试文件
- 内层目录BaseLineApi新建apps包(python packages类型)
- 内层目录BaseLineApi新建libs包 (python packages类型), 和apps包同级, 这个包存放第三方模块
- 内层目录BaseLineApi新建settings包(python packages类型), 和apps包同级
- 内层目录BaseLineApi新建media目录, 和apps包同级
- 在settings包里新建2个python文件, 分别对应生产和开发使用的配置文件(
dev.py
|prod.py
) - 内层目录BaseLineApi新建utils包(python packages类型), 和apps包同级, 这个包存放自定义的模块
重构后的目录机构如下
C:.
│ manage.py
│
├─.idea
│ │ .gitignore
│ │ BaseLineApi.iml
│ │ misc.xml
│ │ modules.xml
│ │ workspace.xml
│ │
│ └─inspectionProfiles
│ profiles_settings.xml
│ Project_Default.xml
│
├─BaseLineApi
│ │ asgi.py
│ │ db.sqlite3
│ │ settings_bak.py
│ │ urls.py
│ │ wsgi.py
│ │ __init__.py
│ │
│ ├─apps
│ │ __init__.py
│ │
│ ├─libs
│ │ __init__.py
│ │
│ ├─media
│ ├─settings
│ │ │ dev.py
│ │ │ prod.py
│ │ │ __init__.py
│ │ │
│ │ └─__pycache__
│ │ dev.cpython-36.pyc
│ │ __init__.cpython-36.pyc
│ │
│ ├─utils
│ │ │ APIResponse.py
│ │ │ exception.py
│ │ │ logging.py
│ │ │ __init__.py
│ │ │
│ │ └─__pycache__
│ │ logging.cpython-36.pyc
│ │ __init__.cpython-36.pyc
│ │
│ └─__pycache__
│ urls.cpython-36.pyc
│ wsgi.cpython-36.pyc
│ __init__.cpython-36.pyc
│
├─logs
│ baseline.log
│
└─scripts
t_dg1.py
配置开发环境
将settings.py
的内容拷贝到dev.py
和 prod.py
这时候启动django, 会出现如下报错
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
查看到manager.py
入口文件指向的settings
文件无法找到, 换成对应的配置文件
比如将文件换成 dev.py
,django可以启动成功
相应的asgi.py
, wsgi.py
也需要改成正确的路径
配置环境变量DJANGO_SETTINGS_MODULE
在配置文件dev.py
中配置内层目录BaseLineApi
from pathlib import Path
import sys
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
sys.path.insert(0, BASE_DIR)
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
Django 测试
scripts\t_dg1.py
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'BaseLineApi.settings.dev')
django.setup()
# 测试配置文件
from django.conf import settings
print(settings) # <Settings "BaseLineApi.settings.dev">
print(settings.BASE_DIR) # C:\Users\chenjiawei\Desktop\BaseLineApi\BaseLineApi
# 环境变量
import sys
print(sys.path)
注册rest_framework
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
]
配置日志
dev.py
# 日志配置
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': {
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
# 实际开发建议使用WARNING或ERROR
'level': 'WARNING',
'class': 'logging.handlers.RotatingFileHandler',
# 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR
'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/baseline.log"),
# 日志文件的最大值,这里我们设置300M
'maxBytes': 300 * 1024 * 1024,
# 日志文件的数量,设置最大日志数量为10
'backupCount': 10,
# 日志格式:详细格式
'formatter': 'verbose' ,
# 编码
'encoding': 'utf-8'
},
},
# 日志对象
'loggers': {
'django': {
'handlers': ['console', 'file'],
'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
},
}
}
配置logger:utils/logging.py
import logging
logger = logging.getLogger('django')
测试日志
scripts\t_dg1.py
# 测试djngo的logger
from utils.logging import logger
logger.info('测试info')
logger.error('测试error')
二次封装Response类:
utils/response.py
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self, data_status, msg, results=None, headers=None, status=None, **kwargs):
data = {
'status': data_status,
'msg': msg,
}
if results:
data['results'] = results
data.update(kwargs)
super().__init__(data=data, headers=headers, status=status)
异常处理
utils/exception.py
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status
from rest_framework.response import Response
from .logging import logger
def exception_handler(exc, context):
response = drf_exception_handler(exc, context)
if response is None:
view = context['view']
logger.error('%s:%s' % (view, exc))
response = Response({'detail': '服务器内部错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return response
配置drf异常处理句柄
settings/dev.py
# drf配置
REST_FRAMEWORK = {
# 异常句柄配置
'EXCEPTION_HANDLER': 'utils.exception.exception_handler'
}
媒体目录
settings/dev.py
# 1.访问上传文件的url地址前缀
MEDIA_URL = "/media/"
# 2.项目中存储上传文件的根目录
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
# 媒体目录创建
# 3.在BaseLineApi/BaseLineApi中创建media目录(谁是项目根目录就在那个文件夹下创建)
路由配置
# 配置路由
from django.urls import re_path
from django.views.static import serve
from django.conf import settings
urlpatterns = [
re_path(r'media/(?P<path>.*)', serve, {"document_root": settings.MEDIA_ROOT}),
]