1. 程式人生 > >用django框架開發一個B2C購物網站的基本流程和用到的知識點總結1

用django框架開發一個B2C購物網站的基本流程和用到的知識點總結1

value 後端開發 .site elf pan 直接 基本 inter mobile

開發流程

技術分享圖片

開發模式采用前後端分離模式,作為後端開發人員我們只關註後端業務邏輯開發:

省略項目框架搭建文件的配置部分。。。。

一:用戶部分

在項目開發中我們要用到用戶模型類User,Django認證系統提供了用戶模型類User和User的相關操作方法;自帶的用戶模型無法滿足我們的要求時需要自定義用戶模型添加格外字段;

如:

在創建好的應用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 參數的設置以點.來分隔,表示應用名.模型類名。

用戶註冊驗證碼獲取接口邏輯設置:

import random

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from django_redis import get_redis_connection

from verifications import constants
from meiduo_mall.libs.yuntongxun.sms import CCP
# Create your views here.

# 獲取logger
import logging
logger = logging.getLogger(‘django‘)


# GET /sms_codes/(?P<mobile>1[3-9]\d{9})/
class SMSCodeView(APIView):
  def get(self, request, mobile):
  """
  獲取短信驗證碼:
  1. 生成短信驗證碼內容
  2. 在redis中保存短信驗證碼內容,以`mobile`為key,以短信驗證碼內容為value
  3. 使用雲通訊發送短信驗證碼
  4. 返回應答,發送短信成功
  """
  # 判斷60s之內是否給`mobile`發送過短信
  redis_conn = get_redis_connection(‘verify_codes‘)
  send_flag = redis_conn.get(‘send_flag_%s‘ % mobile)

  if send_flag:
    return Response({‘message‘: ‘發送短信過於頻繁‘}, status=status.HTTP_400_BAD_REQUEST)

  # 1. 生成短信驗證碼內容,隨機生成一個6位數字
  sms_code = ‘%06d‘ % random.randint(0, 999999)

  # 2. 在redis中保存短信驗證碼內容,以`mobile`為key,以短信驗證碼內容為value
  # redis_conn.set(‘<key>‘, ‘<value>‘, ‘<expires>‘)
  # redis_conn.setex(‘<key>‘, ‘<expires>‘, ‘<value>‘)

  # redis管道:可以向管道中添加多個要執行redis命令,然後一次性執行
  pl = redis_conn.pipeline()

  # 向管道添加命令
  pl.setex(‘sms_%s‘ % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
  # 設置一個給`mobile`發送短信的標記
  pl.setex(‘send_flag_%s‘ % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)

  # 執行管道中的命令
  pl.execute()

  # 3. 使用雲通訊發送短信驗證碼
  expires = constants.SMS_CODE_REDIS_EXPIRES // 60
  # try:
  # res = CCP().send_template_sms(mobile, [sms_code, expires], constants.SMS_CODE_TEMP_ID)
  # except Exception as e:
  # logger.error(‘mobile: %s,發送短信異常‘ % mobile)
  # return Response({‘message‘: ‘發送短信異常‘}, status=status.HTTP_503_SERVICE_UNAVAILABLE)
  #
  # if res != 0:
  # # 發送短信失敗
  # return Response({‘message‘: ‘發送短信異常‘}, status=status.HTTP_503_SERVICE_UNAVAILABLE)

  # 發出發送短信任務
  from celery_tasks.sms.tasks import send_sms_code
  send_sms_code.delay(mobile, sms_code, expires)

  # 4. 返回應答,發送短信成功
  return Response({‘message‘: ‘OK‘})

用到的知識點:celery異步任務隊列

技術分享圖片

##### 4. celery異步任務隊列

技術分享圖片

本質:

? 使用進程或協程調用函數實現異步。

基本概念:

? 發出者:發出所有執行的任務(任務就是函數)。

? (中間人)任務隊列:存放所要執行的任務信息。

? 處理者:也就是工作的進程或協程,負責監聽任務隊列,發現任務便執行對應的任務函數。

特點:

? 1)任務發送者和處理者可以分布在不同的電腦上,通過中間人進行信息交換。

? 2)任務隊列中的任務會進行排序,先添加的任務會被先執行。

使用:

? 1)安裝 pip install celery

? 2)創建Celery對象並配置中間人地址

? from celery import Celery

? celery_app = Celery(‘demo‘)

? 配置文件:broker_url=‘中間人地址‘

? celery_app.config_from_object(‘配置文件路徑‘)

? 3)定義任務函數

? @celery_app.task(name=‘my_first_task‘)

? def my_task(a, b):

? print(‘任務函數被執行‘)

? ...

? 4)啟動worker

? celery -A ‘celery_app文件路徑‘ worker -l info

? 5)發出任務

? my_task.delay(2, 3)

遇到的問題:

跨域請求:

當前端與後端分處不同的域名,我們需要為後端添加跨域訪問的支持;使用CORS來解決後端對跨域訪問的支持(django-cors-headers擴展);

技術分享圖片

##### 3. 跨域請求

瀏覽器的同源策略: **協議、主機IP和端口PORT相同的地址是同源,否則是非同源**。

當發起請求的頁面地址和被請求的地址不是同源,那麽這個請求就是**跨域請求**。

在發起請求時,如果瀏覽器發現請求是跨域請求,那麽在請求的報文頭中,會添加如下信息:

> Origin: 源請求IP地址
>
> 例如:Origin: http://www.meiduo.site:8080

在被請求的服務器返回的響應中,如果響應頭中包含如下信息:

> Access-Control-Allow-Origin: 源請求IP地址
>
> 例如:Access-Control-Allow-Origin: http://www.meiduo.site:8080

那麽瀏覽器認為被請求服務器支持來源地址對其進行跨域請求,否則認為不支持,瀏覽器會將請求直接駁回。

解決流程:

安裝
pip install django-cors-headers
添加應用
INSTALLED_APPS = (
...
‘corsheaders‘,
...
)
中間層設置
MIDDLEWARE = [
‘corsheaders.middleware.CorsMiddleware‘,
...
]
添加白名單
# CORS
CORS_ORIGIN_WHITELIST = (
‘127.0.0.1:8080‘,
‘localhost:8080‘,
‘www.meiduo.site:8080‘,
)
CORS_ALLOW_CREDENTIALS = True # 允許攜帶cookie
凡是出現在白名單中的域名,都可以訪問後端接口
CORS_ALLOW_CREDENTIALS 指明在跨域訪問中,後端是否支持對cookie的操作(未完待續)

用django框架開發一個B2C購物網站的基本流程和用到的知識點總結1