Django項目(二)
- 2019 年 10 月 6 日
- 筆記
1、首先是我們的模板頁面,我們寫好一個html頁面,我們的頁面是這樣的:
HTML頁面

2、視圖views.py中程式碼的編寫
註冊模組屬於用戶,所以我們在xm_user下的views.py中編寫程式碼,以下的程式碼都在xm_user的應用下
2.1、以前我們都是在views.py中都是一個方法一個方法的。程式碼一多,可能就亂了,本次引出一個新的概念,視圖類。
顧名思義就是將一個請求規劃成一個類。用到視圖類,首先需要導入模組:
from django.views.generic import View
我們這裡寫註冊,就編寫一個RegisterView類:
class RegisterView(View):
xxxxx
我們的類繼承於View,裡面有很多方法,目前介紹兩個get和post,也就是說我們在這個類中定義一個get方法,當請求過來的時候我們就顯示頁面。也就會
執行我們get方法里的程式碼,還有一個post,當時post請求,就執行post里的程式碼,我們可以利用這兩個方法,一個顯示,一個註冊,
也就是當用戶訪問註冊頁面的時候就是get請求,當提交註冊的時候就是post,我們寫上這樣一段程式碼:
from django.shortcuts import render,redirect
from django.core.urlresolvers import reverse
from xm_user.models import User
import re
class RegisterView(View):
#請求為get,就返回註冊頁面,post就註冊用戶。
# get請求顯示註冊頁面,get函數名固定
def get(self,request):
return render(request, "register.html")
# post 請求, 方法名固定
def post(self, request):
'''接收數據'''
username = request.POST.get("username")
pwd = request.POST.get("password")
email = request.POST.get("email")
# all函數,有一個為空就會返回false
if not all([username, pwd, email]):
return render(request, 'register.html', {'errmsg': '有數據為空'})
# 驗證郵箱
if not re.match(r'^[a-z0-9][w.-]*@[a-z0-9-]+(.[a-z]{2,5}){1,2}$', email):
return render(request, 'register.html', {'errmsg': '郵箱格式不正確!'})
# 判斷用戶名是否存在
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
user = None
if user:
return render(request, 'register.html', {'errmsg': '用戶以存在!'})
# 添加用戶
# 以前的做法
# user = User()
# user.username = xxx
# user.password = xxx
# user.save()
# 我們因為用的是Django自帶的認證模組,所以不用這麼複雜了
# 只需要調用create_user方法就好了
user = User.objects.create_user(username, email, pwd)
# 由於我們是發送到郵箱,讓用戶註冊,由於用自帶的會默認激活,所以我們自己定義成0
user.is_active = 0
# 保存
user.save()
# 發送郵件
# xxxxx
# 反向解析
return redirect(reverse("xm_goods:index"))
以上,get中的方法很簡單,返回註冊的頁面,post方法中,例如:request.POST.get("username"),就是接收模板頁發送過來的帳號,username就是我們html頁面input標籤的name值(前端基礎希望自己補充),其中的all方法,all就是用來判斷是否有空值,如果有空值,我們就返回存在空值,接下來是驗證郵箱格式,這裡用的正則表達式,不多說,接下來是判斷用戶名是否存在,存在返回以存在,由於objects.get當他為查詢的值的時候會報錯,所以我們try一下,接下來我們添加帳號,這裡是用的Django自帶的認證模組,我們models中也是用的Django自帶的,這裡我們只需要執行create_user方法就好了。
同時我們的urls.py中要對url進行映射url(r'^register$',RegisterView.as_view(),name='register'),此時,註冊成功就會跳到商城的主頁。
RegisterView就是我們的類名,這裡直接調用as_view()方法就好了,name是我們反向解析的時候需要用到的。同時這裡需要導入:
from xm_user.views import RegisterView
2.2、發送郵箱註冊
這裡我使用的是qq郵箱發送郵件,你也可以去使用其他的郵箱,進行發送郵件。
在這之前,我們需要去登陸qq郵箱做一些配置,在網頁中打開qq郵箱,找到設置,點擊帳號,往下翻,會看到:

我們點擊開啟,會需要你發送一條簡訊,接著他會彈出一串字母,複製下來保存下,回到我們的項目中,
在項目的seetings.py中添加這幾條配置:
# 配置郵箱
EMAIL_USE_TLS = True
# 發送郵件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# smpt服務地址,不同郵箱,這裡不同
EMAIL_HOST = 'smtp.qq.com'
# 埠號
EMAIL_PORT = 25
# 帳號
EMAIL_HOST_USER = '你的郵箱帳號'
# 密碼
EMAIL_HOST_PASSWORD = '剛剛讓你保存的那一串字母'
# 收件人看到的發件人,
EMAIL_FROM = 'python入門到放棄<這裡必須寫你的郵箱帳號>'
然後回到我們的xm_user下的views.py中,在上面我們在返回主頁之前,我們寫了一個註冊,發送郵箱,我們的下面的程式碼寫在那個位置:
# 發送郵件,激活賬戶
# 發送的還是本網站的頁面 http://127.0.0.1:8000/xm_user/active/id
# 這裡的id為防止能直接看出來,我們需要加密處理
# 這裡加密我們需要用到itsdangerous模組,我們先安裝pip install itsdangerous
# 導入模組from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 這裡的python入門到放棄這個參數你可以隨便寫,就是一個密鑰,加密的時候是連帶一起加密的,3600是鏈接失效的時間3600秒。你可以自己定義
serializer = Serializer('python入門到放棄',3600)
# 將id用一個字典存起來,這裡你存的是字典,也可以是元組,列表,你怎麼村的數據,你解密就怎麼拿數據
info = {'id':user.id}
# 加密用dumps函數,加密後是bytes類型
token = serializer.dumps(info) # bytes類型
# 解碼,將bytes解碼成uft8類型
token = token.decode('utf8')
# 發送郵件, 主題
subject = 'python入門到放棄'
# 這裡發送的內容不支援寫html頁面,所以我們直接不寫,用html_message 這個參數
message = ''
# 這裡導入了settings,導入發送的郵箱
sender = settings.EMAIL_FROM
# 發送到的郵箱
receiver = [email]
# 支援html程式碼的參數
html_message = '<h1>尊敬的%s,你好,歡迎註冊小米商城會員。</h1>請點擊下面鏈接激活<a href="Http://127.0.0.1:8000/xm_user/active/%s">Http://127.0.0.1:8000/xm_user/active/%s</a>'%(username,token,token)
send_mail(subject,message,sender,receiver,html_message=html_message)
上面說的很清楚,所以我這裡就不多解釋了,id在項目中是不能暴露出來的,所以需要加密。
我們激活需要一個地址: http://127.0.0.1:8000/xm_user/active/id,我們去創建他的類:
from itsdangerous import SignatureExpired
from django.http import HttpRequest
class ActiveView(View):
def get(self,request,token):
'''進行解密'''
serializer = Serializer('python入門到放棄', 3600)
try:
# 解密函數用loads
info = serializer.loads(token)
user_id = info['id']
user = User.objects.get(id=user_id)
# 把狀態改為1 , 表示激活
user.is_active = 1
user.save()
# 反向解析,跳到登陸頁面
return redirect(reverse("xm_user:login"))
except SignatureExpired as e:
return HttpRequest('連接已經過期!')
這裡鏈接失效就會提示SignatureExpired錯誤,因此我們需要捕捉這個錯誤,這裡我們要從url中取到我們加密的id,因此我們url映射寫成這樣:
url(r'^active/(.*)$',ActiveView.as_view(),name='active'),需要導入:from xm_user.views import ActiveView
上面說了,我們註冊成功需要跳到登陸頁面,所以我們在寫一個視圖類,來顯示我們的登陸頁面:
class LoginView(View):
def get(self,request):
return render(request,"login.html")
url映射:url(r'^login$',LoginView.as_view(),name='login'),需要導入:from xm_user.views import LoginView
完成,我們運行項目,測試一下,我們註冊時填寫自己的郵箱,他就會向我們的郵箱發送一個註冊鏈接,我們點擊註冊鏈接,就會完成激活,並跳轉登陸頁面。今天和上篇的源程式碼,以及模板的html頁面,我都會發給大家,目前只能載入註冊頁面的註冊,主頁和登陸頁的圖片和和樣式還沒有修改路徑,所以顯示不出來,下一節會教大家怎麼修改。今天需要實現發送郵箱註冊跳轉登陸頁面。
後台回復Django項目二獲取上一篇文章和這篇文章的源程式碼。
另:這個頁面真的是不好看,到現在還沒搞清楚怎麼把程式碼調成可以滑動的,如果有知道的歡迎後台回復我,雖然我自己的編輯頁面是一行,但是到了手機上就不是一行了。