🏆🏆🏆教程全知識點簡介:1.郵件驗證系統包括Django發送郵件、保存郵箱併發送驗證郵件、Celery使用Django配置文件設置。2. 地址管理涵蓋shou貨地址、省市區地址查詢、數據庫建表、後端接口設計、前端實現、緩存使用(安裝、使用方法、省市區視圖緩存、緩存數據保存位置和有效期設置)、用户地址管理。3. 數據庫設計包括用户部分、產品部分、數據庫表設計、表結構、數據庫模型類。4. 容器化部署涵蓋Docker使用(Ubuntu安裝、啓動停止、鏡像操作)、FastDFS客户端與自定義文件存儲系統、頁面靜態化、定時任務、靜態化首頁腳本。5. 產品系統包括產品詳情頁、異步任務觸發、腳本工具、用户瀏覽歷史記錄(保存、查看)。6. 產品模式涵蓋B2B企業對企業、C2C個人對個人、O2O線上到線下、開發流程、需求分析。7. 購wu車系統包括購wu車管理、購wu車數據存儲設計(Redis保存已登錄用户)、添加到購wu車、查詢購wu車數據、登錄合併購wu車。8. 訂order單系統涵蓋提交訂order單、我的訂order單、訂order單評價、訂order單結算、保存訂order單、MySQL事務隔離級別修改、下單成功頁面。9. 搜索系統包括產品搜索、搜索引擎原理、Elasticsearch、Docker安裝Elasticsearch擴展、前端實現。10. 支fu系統涉及 集成、Xadmin管理後台。11. 項目配置包括項目準備、配置文件修改、數據庫配置、Redis配置、本地化語言時區、異常處理、日誌記錄。12. 用户認證系統涵蓋圖片驗證碼、域名設置、前端Vue代碼、跨域CORS、Celery發送短信、賬號存在判斷、JWT認證(JWT概念、構成、應用、Django REST framework JWT)、 登錄(登錄流程、模型類創建、urllib使用、回調處理)、用户中心個人信息。
<!-- start:bj1 -->
📚📚👉👉👉本站這篇博客: https://segmentfault.com/a/1190000047166553 中查看
📚📚👉👉👉本站這篇博客: https://segmentfault.com/a/1190000046720728 中查看
<!-- end:bj1 -->
✨ 本教程項目亮點
🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考
🎯🎯🎯全教程總章節
🚀🚀🚀本篇主要內容
郵件與驗證
學習目標:
- 使用Django發送郵件的方法
- 郵件激活的機制
業務説明:
在用户中心頁面中, 允許用户設置郵箱
當用户點擊保存後, 會向用户發送郵件以驗證郵箱的有效性。
為了避免用户未收到驗證郵箱, 提供“重新發送驗證郵件”按鈕允許用户重新發送郵件。
郵箱驗證成功,顯示已驗證。
技術説明:
在郵件中提供的激活鏈接地址,為了能區分是哪個用户在進行郵箱驗證,需要在鏈接中包含用户和郵箱的識別信息,如user_id和email數據,但是基於安全性的考慮,不能將這兩個數據直接暴露在郵件鏈接中,而是需要進行隱藏和簽名處理(能夠檢測出是否修改過鏈接數據)。可以使用前面學過的itsdangerous對user_id和email數據進行處理,生成token作為鏈接的參數。
使用Django發送郵件
Django中內置了郵件發送功能,被定義在django.core.mail模塊中。發送郵件需要使用SMTP服務器,常用的免費服務器有:163、126、,下面以163郵件為例。
1)註冊163郵箱itcast88,登錄後設置。
2)在新頁面中點擊“客户端授權 ”,勾選“開啓”,彈出新窗口填寫手機。
3)填寫授權碼。
4)提示開啓成功。
5) 在Django配置文件中,設置郵箱的配置信息
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
#發送郵件的郵箱
EMAIL_HOST_USER = 'itcast88@163.com'
#在郵箱中設置的客户端授權
EMAIL_HOST_PASSWORD = 'python808'
#收件人看到的發件人
EMAIL_FROM = 'python<itcast88@163.com>'
6) 使用Django提供的模塊發送郵件
在django.core.mail模塊提供了send_mail來發送郵件。
send_mail(subject, message, from_email, recipient_list,html_message=None)
- subject 郵件標題
- message 普通郵件正文, 普通字符串
- from_email 發件人
- recipient_list 收件人列表
- html_message 多媒體郵件正文,可以是html字符串
例如:
Pandas 文檔
msg='<a href="http://www.itcast.cn/subject/pythonzly/index.shtml" target="_blank">點擊激活</a>'
send_mail('註冊激活','',settings.EMAIL_FROM, ['itcast88@163.com'], html_message=msg)
保存郵箱併發送驗證郵件
W3Schools Python
後端接口設計:
請求方式:PUT /email/
請求參數: JSON 或 表單
| 參數 | 類型 | 是否必須 | 説明 |
|---|---|---|---|
| str | 是 | Email郵箱 |
返回數據: JSON
| 返回值 | 類型 | 是否必須 | 説明 |
|---|---|---|---|
| id | int | 是 | 用户id |
| str | 是 | Email郵箱 |
在users/serializers.py中新建序列化器,用户驗證用户提交的郵箱信息。
class EmailSerializer(serializers.ModelSerializer):
"""
郵箱序列化器
"""
class Meta:
model = User
fields = ('id', 'email')
extra_kwargs = {
'email': {
'required': True
}
}
def update(self, instance, validated_data):
instance.email = validated_data['email']
instance.save()
return instance
在users/views.py中創建新視圖,用於保存用户的郵箱信息,注意需要用户登錄通過認證後。
from rest_framework.permissions import IsAuthenticated
class EmailView(UpdateAPIView):
"""
保存用户郵箱
"""
permission_classes = [IsAuthenticated]
serializer_class = serializers.EmailSerializer
def get_object(self, *args, **kwargs):
return self.request.user
設置路由信息
url(r'^emails/$', views.EmailView.as_view()), # 設置郵箱
補充發送驗證郵件
在保存郵箱的時候,需要向用户發送驗證郵件, 將發送郵件的工作放到celery中異步執行。
在celery*tasks目錄中新建email目錄和email/*_init**.py文件和email/tasks.py文件
在email/tasks.py文件中是實現發送郵件的異步任務
from celery_tasks.main import celery_app
from django.core.mail import send_mail
from django.conf import settings
@celery_app.task(name='send_verify_email')
def send_verify_email(to_email, verify_url):
"""
發送驗證郵箱郵件
:param to_email: 收件人郵箱
:param verify_url: 驗證鏈接
:return: None
"""
subject = "美多商某城郵箱驗證"
html_message = '<p>尊敬的用户您好!</p>' \
'<p>感謝您使用美多商某城。</p>' \
'<p>您的郵箱為:%s 。請點擊此鏈接激活您的郵箱:</p>' \
'<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url)
send_mail(subject, "", settings.EMAIL_FROM, [to_email], html_message=html_message)
注意
在發送郵件的異步任務中,需要用到django的配置文件,所以 需要修改celery的啓動文件main.py,在其中指明celery可以讀取的django配置文件,並且註冊添加email的任務
from celery import Celery
# 為celery使用django配置文件進行設置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo_mall.settings.dev'
# 創建celery應用
celery_app = Celery('meiduo')
# 導入celery配置
celery_app.config_from_object('celery_tasks.config')
# 自動註冊celery任務
celery_app.autodiscover_tasks(['celery_tasks.sms', 'celery_tasks.email'])
在User模型類中定義生成驗證郵箱鏈接的方法
郵箱的激活鏈接是用户點擊時會訪問的網址, 讓用户點擊時進入到success_verify_email.html頁面。
def generate_verify_email_url(self):
"""
生成驗證郵箱的url
"""
serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=constants.VERIFY_EMAIL_TOKEN_EXPIRES)
data = {'user_id': self.id, 'email': self.email}
token = serializer.dumps(data).decode()
verify_url = 'http://www.meiduo.site:8080/success_verify_email.html?token=' + token
return verify_url
修改EmailSerializer序列化器的update方法,增加發送郵件
def update(self, instance, validated_data):
email = validated_data['email']
instance.email = email
instance.save()
# 生成驗證鏈接
verify_url = instance.generate_verify_email_url()
# 發送驗證郵件
send_verify_email.delay(email, verify_url)
return instance
前端
修改user_center_info.js文件,增加save_email方法
// 保存email
save_email: function(){
var re = /^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$/;
if(re.test(this.email)) {
this.email_error = false;
} else {
this.email_error = true;
return;
}
axios.put(this.host + '/email/',
{ email: this.email },
{
headers: {
'Authorization': 'JWT ' + this.token
},
responseType: 'json'
})
.then(response => {
this.set_email = false;
this.send_email_btn_disabled = true;
this.send_email_tip = '已發送驗證郵件'
})
.catch(error => {
alert(error.data);
});
}
sys 文檔
驗證郵箱鏈接
當用户點擊郵箱裏的鏈接時,進入到success_verify_email.html頁面。
在該頁面中, 將請求網址中用於驗證的token發送給後端接口,由後端接口判斷token的有效性,如果token有效,則修改郵箱的驗證狀態,並將處理結果返回給前端展示給用户。
後端接口設計:
請求方式:GET /emails/verification/?token=xxx
請求參數: 查詢字符串參數
|參數|類型|是否必須|説明