【Django開發】前後端分離美多商城項目第2篇:項目準備【附代碼文檔】

来源:https://www.cnblogs.com/yinuo112/p/18076000
-Advertisement-
Play Games

一、數據類型 定義: 就是用了保存數據的一個類型,一種數據類型,只能保存該類型數據值 作用: 只有瞭解數據類型,才能選擇合適的類型存放數據,才能更好的利用電腦硬體資源(記憶體和硬碟等)。 不同的數據類型存放數據大小是不同的。 數據類型的使用方式就是用來聲明一個變數,裝數據的。 常用的整數類型是 in ...


美多商城項目4.0文檔完整教程(附代碼資料)主要內容講述:美多商城,項目準備,商業模式介紹,開發流程,需求分析,項目架構,創建工程,1. 在git平臺創建工程1.B2B--企業對企業,2.C2C--個人對個人,3.B2C--企業對個人,4.C2B--個人對企業,5.O2O--線上到線下,6.F2C--工廠到個人,7.B2B2C--企業--企業--個人,1. 用戶部分,2. 商品部分,3. 購物車部分,4. 訂單部分,5. 支付部分,2. 添加前端文件,3. 創建Django REST framework工程,4. 修改manage.py,5. 創建資料庫。項目準備,配置,用戶部分,用戶模型類,註冊1. 修改settings/dev.py 文件中的路徑信息,2. INSTALLED_APPS,3. 資料庫,4. Redis,5. 本地化語言與時區,6. 日誌,7. 異常處理,設計介面的思路。用戶部分,圖片驗證碼,簡訊驗證碼,跨域CORS。用戶部分,使用Celery完成發送簡訊,判斷帳號是否存在,註冊1. 判斷用戶名是否存在,2. 判斷手機號是否存在:。用戶部分,JWT,什麼是JWT,Django REST framework JWT起源,基於token的鑒權機制,JWT長什麼樣?,JWT的構成,總結,安裝配置,使用。用戶部分,登錄,登錄,返回登錄網址的視圖創建模型類,urllib使用說明。登錄,登錄回調處理創建模型類,urllib使用說明。登錄,綁定用戶身份介面,用戶中心個人信息,郵件與驗證,使用Django發送郵件創建模型類,urllib使用說明。郵件與驗證,保存郵箱併發送驗證郵件,驗證郵箱鏈接,收貨地址。收貨地址,省市區地址查詢。收貨地址,使用緩存,用戶地址管理,用戶地址管理代碼,商品部分。商品部分,資料庫表設計,FastDFS分散式文件系統,Docker使用表結構,資料庫模型類,1. 什麼是FastDFS,2. 文件上傳流程,3. 簡易FastDFS構建。Docker使用,Docker簡介1. 虛擬化,2. 什麼是Docer,3. Docker組件,4 使用Docker做什麼。Docker使用,安裝與操作,使用Docker安裝FastDFS1. 在Ubuntu中安裝Docker,2. 啟動與停止,3. Docker鏡像操作,4. Docker 容器操作,5. 將容器保存為鏡像,6. 鏡像備份與遷移,1. 獲取鏡像,2. 運行tracker,3. 運行storage。商品部分,FastDFS客戶端與自定義文件存儲系統,CKEditor富文本編輯器,添加測試數據1. FastDFS的Python客戶端,2. 自定義Django文件存儲系統,3. 在Django配置中設置自定義文件存儲類,4. 添加image功能變數名稱。商品部分,頁面靜態化,定時任務,靜態化首頁的手動腳本。商品部分,商品詳情頁。商品部分,用戶瀏覽歷史記錄1. 保存,2. 查看。商品部分,商品列表頁獲取商品列表數據。商品部分,商品搜索。購物車部分,購物車數據存儲設計,添加到購物車1. Redis保存已登錄用戶,2. Cookie保存未登錄用戶。購物車部分,查詢購物車數據,修改購物車數據,刪除購物車數據,購物車全選。購物車部分,登錄合併購物車,訂單部分,訂單資料庫設計,訂單結算。訂單部分,保存訂單,下單成功頁面。支付,接入,發起支付,保存支付結果。Xadmin,用戶許可權控制,資料庫讀寫分離1. 安裝,2. 使用。資料庫讀寫分離,MySQL主從同步,配置Django實現資料庫讀寫分離,部署1. 主從同步的定義,2. 主從同步的機制,3. 配置主從同步的基本步驟,4. 詳細配置主從同步的方法。。meiduo_mallBuild Setup。

全套筆記資料代碼移步: 前往gitee倉庫查看

感興趣的小伙伴可以自取哦,歡迎大家點贊轉發~


項目準備

配置

1. 修改settings/dev.py 文件中的路徑信息

我們將Django的應用放到了 工程目錄/meiduo_mall/apps目錄下,如果創建一個應用,比如users,那麼在配置文件的INSTALLED_APPS中註冊應用應該如下:

INSTALLED_APPS = [
    ...
    'meiduo_mall.apps.users.apps.UsersConfig',
]

為了還能像如下方式簡便的註冊引用,我們需要向Python解釋器的導包路徑中添加apps應用目錄的路徑。

INSTALLED_APPS = [
    ...
    'users.apps.UsersConfig',
]

我們將配置文件改為放在settings子目錄下,所以 配置文件中的BASE_DIR指向的變為了meiduo/meiduo_mall/meiduo_mall

使用sys.path添加<BASE_DIR>/apps目錄,即可添加apps應用的導包路徑。

  
  
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
  
  
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

  
  
# 添加導包路徑
  
  
import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

2. INSTALLED_APPS

在INSTALLED_APPS中添加rest_framework

INSTALLED_APPS = [
    ...
    'rest_framework',
]

3. 資料庫

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',  # 資料庫主機
        'PORT': 3306,  # 資料庫埠
        'USER': 'meiduo',  # 資料庫用戶名
        'PASSWORD': 'meiduo',  # 資料庫用戶密碼
        'NAME': 'meiduo_mall'  # 資料庫名字
    }
}

註意:

記得在meiduo/meiduo_mall/__init__.py文件中添加

import pymysql

pymysql.install_as_MySQLdb()

4. Redis

安裝django-redis,並配置

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

除了名為default的redis配置外,還補充了名為session的redis配置,分別使用兩個不同的redis庫。

同時修改了Django的Session機制使用redis保存,且使用名為'session'的redis配置。

此處修改Django的Session機制存儲主要是為了給Admin站點使用。

**關於django-redis 的使用,說明文檔可見[

5. 本地化語言與時區

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

6. 日誌

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': 'DEBUG',
            '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/meiduo.log"),  # 日誌文件的位置
            'maxBytes': 300 * 1024 * 1024,
            'backupCount': 10,
            'formatter': 'verbose'
        },
    },
    'loggers': {  # 日誌器
        'django': {  # 定義了一個名為django的日誌器
            'handlers': ['console', 'file'],  # 可以同時向終端與文件中輸出日誌
            'propagate': True,  # 是否繼續傳遞日誌信息
            'level': 'DEBUG',  # 日誌器接收的最低日誌級別
        },
    }
}

7. 異常處理

修改Django REST framework的預設異常處理方法,補充處理資料庫異常和Redis異常。

新建utils/exceptions.py

from rest_framework.views import exception_handler as drf_exception_handler
import logging
from django.db import DatabaseError
from redis.exceptions import RedisError
from rest_framework.response import Response
from rest_framework import status

  
  
# 獲取在配置文件中定義的logger,用來記錄日誌
  
  
logger = logging.getLogger('django')

def exception_handler(exc, context):
    """
    自定義異常處理
    :param exc: 異常
    :param context: 拋出異常的上下文
    :return: Response響應對象
    """
    # 調用drf框架原生的異常處理方法
    response = drf_exception_handler(exc, context)

    if response is None:
        view = context['view']
        if isinstance(exc, DatabaseError) or isinstance(exc, RedisError):
            # 資料庫異常
            logger.error('[%s] %s' % (view, exc))
            response = Response({'message': '伺服器內部錯誤'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

    return response

配置文件中添加

REST_FRAMEWORK = {
    # 異常處理
    'EXCEPTION_HANDLER': 'meiduo_mall.utils.exceptions.exception_handler',
}

用戶部分

用戶模型類

Django提供了認證系統,文檔資料可參考此鏈接[

Django認證系統同時處理認證和授權。簡單地講,認證驗證一個用戶是否它們聲稱的那個人,授權決定一個通過了認證的用戶被允許做什麼。 這裡的詞語“認證”同時指代這兩項任務,即Django的認證系統同時提供了認證機制和許可權機制。

Django的認證系統包含:

  • 用戶
  • 許可權:二元(是/否)標誌指示一個用戶是否可以做一個特定的任務。
  • 組:對多個用戶運用標簽和許可權的一種通用的方式。
  • 一個可配置的密碼哈希系統
  • 用戶登錄或內容顯示的表單和視圖
  • 一個可插拔的後臺系統

Django預設提供的認證系統中,用戶的認證機制依賴Session機制,我們在本項目中將引入JWT認證機制,將用戶的身份憑據存放在Token中,然後對接Django的認證系統,幫助我們來實現:

  • 用戶的數據模型
  • 用戶密碼的加密與驗證
  • 用戶的許可權系統

Django用戶模型類

Django認證系統中提供了用戶模型類User保存用戶的數據,預設的User包含以下常見的基本欄位:

  • username

必選。 150個字元以內。 用戶名可能包含字母數字,_@+ .-個字元。在Django更改1.10:max_length從30個字元增加到150個字元。

  • first_name

可選(blank=True)。 少於等於30個字元。

  • last_name

可選(blank=True)。 少於等於30個字元。

  • email

可選(blank=True)。 郵箱地址。

  • password

必選。 密碼的哈希及元數據。 (Django 不保存原始密碼)。 原始密碼可以無限長而且可以包含任意字元。

  • groups

Group 之間的多對多關係。

  • user_permissions

Permission 之間的多對多關係。

  • is_staff

布爾值。 指示用戶是否可以訪問Admin 站點。

  • is_active

布爾值。 指示用戶的賬號是否激活。 我們建議您將此標誌設置為False而不是刪除帳戶;這樣,如果您的應用程式對用戶有任何外鍵,則外鍵不會中斷。它不是用來控制用戶是否能夠登錄。 在Django更改1.10:在舊版本中,預設is_active為False不能進行登錄。

  • is_superuser

布爾值。 指定這個用戶擁有所有的許可權而不需要給他們分配明確的許可權。

  • last_login

用戶最後一次登錄的時間。

  • date_joined

賬戶創建的時間。 當賬號創建時,預設設置為當前的date/time。

常用方法:
  • set_password(raw_password)

設置用戶的密碼為給定的原始字元串,並負責密碼的。 不會保存User 對象。當Noneraw_password 時,密碼將設置為一個不可用的密碼。

  • check_password(raw_password)

如果給定的raw_password是用戶的真實密碼,則返回True,可以在校驗用戶密碼時使用。

管理器方法:

管理器方法即可以通過User.objects. 進行調用的方法。

  • create_user(username, email=None, password=None, ***extra_fields*)

創建、保存並返回一個User對象。

  • create_superuser(username, email, password, ***extra_fields*)

create_user() 相同,但是設置is_staffis_superuserTrue

創建自定義的用戶模型類

Django認證系統中提供的用戶模型類及方法很方便,我們可以使用這個模型類,但是欄位有些無法滿足項目需求,如本項目中需要保存用戶的手機號,需要給模型類添加額外的欄位。

Django提供了django.contrib.auth.models.AbstractUser用戶抽象模型類允許我們繼承,擴展欄位來使用Django認證系統的用戶模型類。

我們現在在meiduo/meiduo_mall/apps中創建Django應用users,併在配置文件中註冊users應用。

在創建好的應用models.py中定義用戶的用戶模型類。

class User(AbstractUser):
    """用戶模型類"""
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手機號')

    class Meta:
        db_table = 'tb_users'
        verbose_name = '用戶'
        verbose_name_plural = verbose_name

我們自定義的用戶模型類還不能直接被Django的認證系統所識別,需要在配置文件中告知Django認證系統使用我們自定義的模型類。

在配置文件中進行設置

AUTH_USER_MODEL = 'users.User'

AUTH_USER_MODEL 參數的設置以點.來分隔,表示應用名.模型類名

註意:Django建議我們對於AUTH_USER_MODEL參數的設置一定要在第一次資料庫遷移之前就設置好,否則後續使用可能出現未知錯誤。

執行資料庫遷移

python manage.py makemigrations
python manage.py migrate

註冊

創建好用戶模型類後,我們開始來實現第一個業務邏輯——用戶註冊。

設計介面的思路

  • 分析要實現的業務邏輯,明確在這個業務中需要涉及到幾個相關子業務,將每個子業務當做一個介面來設計。

  • 分析介面的功能任務,明確介面的訪問方式與返回數據:

    • 介面的請求方式,如GET 、POST 、PUT等
    • 介面的URL路徑定義
    • 需要前端傳遞的數據及數據格式(如路徑參數、查詢字元串、請求體表單、JSON等)
    • 返回給前端的數據及數據格式

在前後端分離的應用模式中,我們作為後端開發人員設計後端介面時,可以不用考慮返回給前端數據後,前端如何處理,這是前端開發人員的工作,我們只需明確我們要保存的或者要返回的是什麼數據即可。

明確上述每一點後,即可開始編寫介面。

註冊業務介面分析

在用戶註冊中,需要實現以下介面:

  • 圖片驗證碼
  • 簡訊驗證碼
  • 用戶名判斷是否存在
  • 手機號判斷是否存在
  • 註冊保存用戶數據

圖片驗證碼、簡訊驗證碼考慮到後續可能會在其他業務中也用到,因此我們將圖片驗證碼獨立,創建一個新應用verifications,在此應用中實現圖片驗證碼、簡訊驗證碼

未完待續, 同學們請等待下一期

全套筆記資料代碼移步: 前往gitee倉庫查看

感興趣的小伙伴可以自取哦,歡迎大家點贊轉發~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android 輔助功能 -搶紅包(三) 本篇文章繼續講述輔助功能. 主要通過監聽通知欄紅包消息,來跳轉聊天頁面,並自動回覆對方"謝謝". 上篇文章我們講述了監聽notification, 跳轉聊天界面. 具體可查看: Android 輔助功能 -搶紅包(二) 1: 使用monitor抓取id. 打 ...
  • Android 輔助功能 -搶紅包 本篇文章主要介紹下通過android輔助功能的方式來實現類似搶紅包的功能. 1:許可權聲明 <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" tools:ign ...
  • Android 輔助功能 -搶紅包(二) 本篇文章繼續講述輔助功能實現搶紅包的方案. 上篇文章主要講了下輔助功能的基本使用,本文涉及的一些基礎內容就不再贅述了. 有疑問的可以查看上篇文章: Android 輔助功能 -搶紅包 1: 添加微信監聽 修改xml文件,android:packageName ...
  • 前言 如果趕時間請直接使用目錄跳到解決問題的部分。 使用的項目使用vue腳手架生成。 npm init vue@latest 版本如下 "@vitejs/plugin-vue": "^5.0.4", "vue": "^3.4.21" 由於近期在學less,心想如果不能將其應用到vue項目中,無異於紙 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、介紹 Promise,譯為承諾,是非同步編程的一種解決方案,比傳統的解決方案(回調函數)更加合理和更加強大 在以往我們如果處理多層非同步操作,我們往往會像下麵那樣編寫我們的代碼 doSomething(function(result) { ...
  • C語言中抽象函數與具體實現的命名與組織 在C語言的項目開發中,尤其是嵌入式系統和開源軟體項目里,合理地命名和組織抽象函數及其具體實現對於提高代碼的可讀性、可維護性和可擴展性至關重要。以下是關於如何在這些項目中有效地處理抽象和實現的一些建議: 抽象函數與具體實現的區分 API作為介面:API定義了一組 ...
  • Java 線程 線程使程式能夠通過同時執行多個任務而更有效地運行。 線程可用於在不中斷主程式的情況下在後臺執行複雜的任務。 創建線程 有兩種創建線程的方式。 擴展Thread類 可以通過擴展Thread類並覆蓋其run()方法來創建線程: public class MyThread extends ...
  • OI 一場空,不開 long long 見祖宗 cmp,一定要在 sort 里寫入 打 st 表一定要算空間複雜度 打倍增 LCA 一定要算空間複雜度 註意 ÷0 線段樹 4 倍空間 無向圖,鏈式前向星 2 倍空間 樹鏈剖分要註意是原編號還是 dfn 序的編號 鏈式前向星遍歷圖的時間複雜度永遠為 + ...
一周排行
    -Advertisement-
    Play Games
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...