实战项目-美多商城(一)开发环境配置
项目准备
-
新建大目录
-
前端文件
-
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
- 参考网址: https://blog.csdn.net/freedomlulux/article/details/103960082
- 配置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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异