標籤:inf 技術 inter 設定檔 源地址 abstract 異常 業務 基本概念
開發流程
開發模式採用前後端分離模式,作為後端開發人員我們只關注後端商務邏輯開發:
省略項目架構搭建檔案的配置部分。。。。
一:使用者部分
在項目開發中我們要用到使用者模型類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