python 框架 Django 实战商城项目之工程搭建

本贴最后更新于 1481 天前,其中的信息可能已经时移俗易

项目说明

该电商项目类似于京东商城,主要模块有验证、用户、第三方登录、首页广告、商品、购物车、订单、支付以及后台管理系统。
项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用 jinja2 模板引擎实现,局部刷新采用 vue.js 实现。

项目运行机制如下:
iShot2020030816.23.32.png

项目搭建

工程创建

项目使用码云进行源代码版本控制,在码云创建好后直接克隆到本地即可,然后在项目根目录下执行 virtualenv venv创 建虚拟环境,source venv/bin/activat 激活虚拟环境后,安装 django 后,执行
django-admin startproject immortal_mall 创建 django 工程。

配置开发环境

商城项目有两个环境,分别为测试环境和开发环境,django 项目在创建完成后只有一个 settings 配置文件,但是两个环境需要两个配置文件,这里需要修改 django 获取配置文件的方式。新建 settings 包,再新建 dev 和 pro 两个配置文件,将默认生成的 settings 文件里面的内容拷贝至 dev 和 pro 文件里,结果如下
iShot2020030816.46.04.png

再在 mange.py 文件里指定开发环境需要的配置文件,生成环境的后面再说
iShot2020030816.47.39.png

配置 jiaja2 模板引擎

安装 jinja2 扩展包 pip install jinja2,然后在 dev 文件中配置一下
iShot2020030816.49.40.png

这里有个注意的点,如果在运行的时候报错了,提示
iShot2020030821.15.18.png

这时是因为注释掉了 django 默认的模板配置,需要去掉注释,只添加新的版本引起即可。

配置 mysql 数据库

新建数据库

  1. 新建数据库
    create database meiduo charset=utf8;
  2. 新建 mysql 用户
    create user mall identified by '123456';
  3. 授权用户只能访问 immortal_mall 数据库
    grant all on immortal_mall.* to 'mall'@'%';
  4. 刷新授权
    flush privileges;

配置数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'immortal_mall',
        'HOST': '127.0.0.1',
        'USER': 'zhouyajun',
        'PASSWORD': '12345678',
        'PORT': '3306'
    }
}

django 默认使用的是 mysqlclient 工具,需要单独安装,这里用 pymysql 代替,在工程同名子目录的 __init__.py 文件中,写入下面代码

import pymysql
pymysql.install_as_MySQLdb()

在启动项目对的时候可能会报错,提示 mysql

File "/Users/lixiang/.env/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 36, in <module>
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

具体解决方式可以参考这里 https://zhuanlan.zhihu.com/p/76920424

配置 redis

商城采用 redis 作为缓存服务
pip install django-redis
这里是 django-redis 的使用文档 https://django-redis-chs.readthedocs.io/zh_CN/latest/,在 dev 文件中配置 redis

缓存配置

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    "session": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/3",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

default 是 redis 采用的默认配置,用的是 2 号数据库,sessionredis 保持保持状态的配置项,用的是 3 号数据库,

日志配置

# 日志配置
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(os.path.dirname(BASE_DIR), 'logs/mall.log'),  # 日志文件的位置
            'maxBytes': 300 * 1024 * 1024,
            'backupCount': 10,
            'formatter': 'verbose'
        },
    },
    'loggers': {  # 日志器
        'django': {  # 定义了一个名为django的日志器
            'handlers': ['console', 'file'],  # 可以同时向终端与文件中输出日志
            'propagate': True,  # 是否继续传递日志信息
            'level': 'INFO',  # 日志器接收的最低日志级别
        },
    }
}

这里需要在项目的根目录下手动创建 logs 文件,写日志的时候呢,我们希望能够自动分日期去写,每天的日志写到不同的文件里,这里可以使用 python 模块自带的 TimedRotatingFileHandler,也可以自定义一个 handler 类去实现。
我这里呢自己实现了一个类叫做 MallRotatingFileHandler
效果如下:
iShot2020030818.13.27.png

该类实现按月划分日志文件,自动按照当天日期命名日志文件,也可以定义文件容量。

配置前端静态文件

准备静态文件夹 static

iShot2020030817.30.57.png

指定静态文件加载路径

# 指定加载静态恩建路由前缀
STATIC_URL = '/static/'
# 配置静态文件加载路径
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

运行项目,请求获取一张图片 http://127.0.0.1:8989/static/images/adv01.jpg,成功获取表示配置正确。

最终项目各个目录展示成果:
iShot2020030818.16.49.png

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    534 引用 • 671 回帖
  • Django
    47 引用 • 72 回帖 • 4 关注
  • 测试开发
    8 引用 • 5 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 教程不错呀!建议把不同功能的 app 放在一个 apps 目录下。

  • 其他回帖
  • someone
    作者

    谢谢哈!是的呢,今天会再发一篇关于用户模块的,就是你说的这种思路