项目准备

  • 新建大目录
  • 前端文件
  • django项目文件
  • venv 虚拟环境
  • .gitignore文件(忽略项配置好)
  • 备注: '.idea'是Pycharm文件,无需理会
  • 执行git命令
- git init

- git add .

- git commit -m '初始化开发环境'

配置开发环境(这种方式,在使用celery获取邮件settings配置的时候,会报模块路径错误)

  • 新建'local_settings'(负责各种密匙,区分开发/生成环境): 和'settings.py'同级目录
### settings 末尾加上以下代码
......
#-------------------local_settings-------------------------#
try:
    from . import local_settings  # 覆盖settings某些配置
except ImportError:
    pass
  • 以上错误已有解决办法,修改这行代码即可
###-------------------local_settings-------------------------###
try:
    from .local_settings import * # 改成这句就没有问题了
except ImportError:
    pass
  • 配置mysql数据库
### settings
......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 修改数据库为MySQL,并进行配置
        'NAME': 'meiduo_mail',  # 数据库的名称
        'USER': 'root',  # 数据库的用户名
        'PASSWORD': 'root',  # 数据库的密码
        'HOST': '127.0.0.1',
        'PORT': 3306,
        # 'OPTIONS': {'charset': 'utf8'}
    }
}

- 还需要安装 mysqlclient驱动,很有可能报一堆错误
  ......

  - 解决办法: 手动安装mysqlclient

    - 参考网址:
  • 配置redis数据库
# 安装'django-redis'
pip install django-redis

### settings
......
CACHES = {
    "default": { # 保存 省市区数据
        "BACKEND": "django_redis.cache.RedisCache",
        # 使用0号数据库
        "LOCATION": "redis://192.168.11.38:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {
                "max_connections": 1000,
                "encoding": 'utf-8'
            },
            # "PASSWORD": "foobared" # redis密码
        }
    },

    "session": { # 保存session数据
        "BACKEND": "django_redis.cache.RedisCache",
        # 使用1号数据库
        "LOCATION": "redis://192.168.11.38:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {
                "max_connections": 1000,
                "encoding": 'utf-8'
            },
        }
    },
    "verify_codes": { # 保存验证码
            "BACKEND": "django_redis.cache.RedisCache",
            # 使用2号数据库
            "LOCATION": "redis://192.168.11.38:6379/2",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {
                    "max_connections": 1000,
                    "encoding": 'utf-8'
                },
            }
    },
    "history": { # 保存用户浏览记录
            "BACKEND": "django_redis.cache.RedisCache",
            # 使用3号数据库
            "LOCATION": "redis://192.168.11.38:6379/3",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {
                    "max_connections": 1000,
                    "encoding": 'utf-8'
                },
            }
        },
    "cart": { # 保存购物车数据
                "BACKEND": "django_redis.cache.RedisCache",
                "LOCATION": "redis://192.168.11.38:6379/4",
                "OPTIONS": {
                    "CLIENT_CLASS": "django_redis.client.DefaultClient",
                    "CONNECTION_POOL_KWARGS": {
                        "max_connections": 1000,
                        "encoding": 'utf-8'
                    },
                }
        },
}

# 修改session存储机制使用Redis保存
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 使用名为"session"的Redis配置项存储session数据
SESSION_CACHE_ALIAS = 'session'
  • 在django中测试redis(需先导入django配置)
### scripts.django_base_env.py
# -*- coding:utf-8 -*-
import os
import sys
import django


base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meiduo_mail.settings")
django.setup()  # os.environ['DJANGO_SETTINGS_MODULE']
### 测试
# -*- coding:utf-8 -*-
import os
import sys
import django


base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meiduo_mail.settings")
django.setup()  # os.environ['DJANGO_SETTINGS_MODULE']

from django_redis import get_redis_connection
conn =get_redis_connection('verify_codes')
print(conn) # 不会报错就说明配置正确

配置日志

  • 项目根目录新建'logs'目录
### settings
......
# ------------日志------------------#
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在debug模式下才输出日志
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {  # 日志处理方法
        'console': {  # 向终端中输出日志
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {  ### 向文件中输出日志(最重要的配置)
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_DIR, 'logs\\meiduo.log'),  # 日志文件的位置和manage.py同级
            'maxBytes': 300 * 1024 * 1024,
            'backupCount': 10,
            'formatter': 'verbose'
        },
    },
    'loggers': {  # 日志器
        'django': {  # 定义了一个名为django的日志器
            'handlers': ['console', 'file'],  # 可以同时向终端与文件中输出日志
            'propagate': True,  # 是否继续传递日志信息
            'level': 'INFO',  # 日志器接收的最低日志级别
        },
    }
}
  • 测试日志: 运行后查看新生成的'logs/meiduo.log'文件
### scripts.django_base_env.py
# -*- coding:utf-8 -*-
import os
import sys
import django


base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meiduo_mail.settings")
django.setup()

import logging
# 创建日志记录器
logger = logging.getLogger('django')
# 输出日志
logger.debug('测试logging模块debug')
logger.info('测试logging模块info')
logger.error('测试logging模块error')
  • 需求问题点: logs文件目录需求被Git仓库记录和管理
    当把 *.log 都忽略掉后,logs文件目录为空
    但是,Git是不允许提交一个空的目录到版本库上的
- 如果把'*.log'移出'.gitnore',logs目录虽然会被提交,但是'meiduo.log'内容也会被提交
  不符合需求

- 如果把'meiduo.log'删除/忽略,变成了空目录,git又不允许(git不允许提交空目录)

- 解决办法: 'logs目录'底下,新建空文件'.gitkeep'

  - 保证logs目录被git记录,但是'meiduo.log'文件内容被忽略

前端安装 live-server

  • 可以使用前端node.js 提供的服务器live-server作为前端开发服务器使用
- 安装步骤

    - windows安装 node.js 版本控制工具 nvm(node version manage)

        - https://github.com/coreybutler/nvm-windows/releases/download/1.1.10/nvm-setup.zip

        - nvm 常用命令

            - nvm ls-remote:列出所有可以安装的node版本号
            - nvm install v15.1.0:安装指定版本号的node

                - 安装的版本和教程保持一致: nvm install v10.4.1

                    - 此时,会自动帮你安装 npm(node package manage),node 包/模块 管理工具

            - nvm use v15.1.0:切换node的版本,这个是全局的
            - nvm current:当前node版本
            - nvm ls:列出所有已经安装的node版本

    - 安装 live-server

        - npm install -g live-server

    - 测试:切换到前端目录,输入命令: live-server

用户模块

  • 新建 apps 目录包,存放所有的app
    新建 users app,用户相关的逻辑都放在里面
### settings
......
INSTALLED_APPS = [
    ......
    'rest_framework',  # drf框架,自己安装一下
    'apps.users',  # 用户模块
]

### user.apps
from django.apps import AppConfig

class UsersConfig(AppConfig):
    name = 'users' # 不要写成 name='apps.users'
  • 建模: 拓展django自带的User模型,增加手机号码字段
### users.models
from django.db import models
from django.contrib.auth.models import AbstractUser


class UserInfo(AbstractUser):
    mobile = models.CharField(max_length=11,unique=True,verbose_name='手机号码')

    class Meta:
        db_table = 'tb_users'  # 自定义数据库表名
        verbose_name = '用户'  # admin站点显示以及显示中文名
        verbose_name_plural = verbose_name

### settings
......
# ------------替换django User模型------------------#
AUTH_USER_MODEL = 'users.UserInfo' # 不要写成'apps.users.UserInfo'(django内部自动拼接路径)

- 最后,执行命令迁移模型,写入db

解决前后端跨域问题(只针对浏览器才有这种问题)

- pip install django-cors-headers

INSTALLED_APPS = [
    ......
    'corsheaders', # 位置任意
]


MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', # 一定要放在最上面(每个响应都会涉及到'跨域')
    'django.middleware.security.SecurityMiddleware',
    ......
]

# CORS  白名单
CORS_ORIGIN_WHITELIST = (
    'http://127.0.0.1:8080',
    'http://localhost:8080',
    'http://www.meiduo.site:8080',
    'http://www.meiduo.site:8000'
)
# 开发环境下,可以使用这句替换下面:CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True  # 允许携带cookie