python框架Django實戰商城項目之工程搭建

項目說明

該電商項目類似於京東商城,主要模組有驗證、用戶、第三方登錄、首頁廣告、商品、購物車、訂單、支付以及後台管理系統。
項目開發模式採用前後端不分離的模式,為了提高搜索引擎排名,頁面整體刷新採用jinja2模板引擎實現,局部刷新採用vue.js實現。

項目運行機制如下:
file

項目搭建

工程創建

項目使用碼雲進行源程式碼版本控制,在碼雲創建好後直接克隆到本地即可,然後在項目根目錄下執行virtualenv venv創建虛擬環境,source venv/bin/activat激活虛擬環境後,安裝django後,執行
django-admin startproject immortal_mall創建django工程。

配置開發環境

商城項目有兩個環境,分別為測試環境和開發環境,django項目在創建完成後只有一個settings配置文件,但是兩個環境需要兩個配置文件,這裡需要修改django獲取配置文件的方式。新建settings包,再新建dev和pro兩個配置文件,將默認生成的settings文件裡面的內容拷貝至dev和pro文件里,結果如下
file

再在mange.py文件里指定開發環境需要的配置文件,生成環境的後面再說
file

配置jiaja2模板引擎

安裝jinja2擴展包pip install jinja2,然後在dev文件中配置一下
file

這裡有個注意的點,如果在運行的時候報錯了,提示
file

這時是因為注釋掉了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
效果如下:
file

該類實現按月劃分日誌文件,自動按照當天日期命名日誌文件,也可以定義文件容量。

配置前端靜態文件

準備靜態文件夾static

file

指定靜態文件載入路徑

# 指定載入靜態恩建路由前綴  STATIC_URL = '/static/'  # 配置靜態文件載入路徑  STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

運行項目,請求獲取一張圖片http://127.0.0.1:8989/static/images/adv01.jpg,成功獲取表示配置正確。

最終項目各個目錄展示成果:

file

歡迎大家去 我的部落格 瞅瞅,裡面有更多關於測試實戰的內容哦!!