第三百八十三節,Django+Xadmin打造上線標準的在線教育平臺—路由映射與靜態文件配置
阿新 • • 發佈:2017-09-16
是否 操作數 列表 errors ner rate 郵箱 scrip user
第三百八十四節,Django+Xadmin打造上線標準的在線教育平臺—路由映射與靜態文件配置以及會員註冊
基於類的路由映射
from django.conf.urls import url, include # 導入django自在的include邏輯 from django.contrib import admin from django.views.generic import TemplateView # 導入django自帶的TemplateView邏輯 import xadmin #導入xadmin from app_users.views import deng_lu, zhu_ce, active_code, logout # 導入登錄邏輯處理類 urlpatterns = [ url(r‘^xadmin/‘, xadmin.site.urls), url(r‘^index.html‘, TemplateView.as_view(template_name=‘index.html‘), name=‘index‘), url(r‘^register.html‘, zhu_ce.as_view(), name=‘register‘), url(r‘^captcha/‘, include(‘captcha.urls‘), name=‘captcha‘), url(r‘^active/(?P<active_de>.*)/$‘, active_code.as_view(), name="user_active"), url(r‘^login.html‘, TemplateView.as_view(template_name=‘login.html‘), name=‘login‘), url(r‘^deng_lu‘, deng_lu.as_view(), name=‘deng_lu‘), url(r‘^logout‘, logout.as_view(), name=‘deng_lu‘), ]
靜態文件配置
settings.py
STATIC_URL = ‘/static/‘ # 設置靜態文件前綴名稱 #配置靜態文件目錄 STATICFILES_DIRS = [ os.path.join(BASE_DIR, ‘static‘), # 設置靜態文件路徑 ]
html靜態文件引用
<!DOCTYPE html> <html> {% load staticfiles %} {# 啟用靜態文件引用 #} <head> <meta charset="UTF-8"> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" > <title>課程機構列表 - 慕學在線網</title> <link rel="stylesheet" type="text/css" href="{% static ‘css/reset.css‘ %}"> {# 啟用靜態文件引用後才可以 #} <link rel="stylesheet" type="text/css" href="{% static ‘css/animate.css‘ %}"> <link rel="stylesheet" type="text/css" href="{% static ‘css/style.css‘ %}"> <script src="{% static ‘js/jquery.min.js‘ %}" type="text/javascript"></script> <script src="{% static ‘js/jquery-migrate-1.2.1.min.js‘ %}" type="text/javascript"></script> </head>
會員註冊
1,首先路由映射好邏輯處理類
from django.conf.urls import url, include # 導入django自在的include邏輯 from django.contrib import admin from django.views.generic import TemplateView # 導入django自帶的TemplateView邏輯 import xadmin # 導入xadmin from app_users.views import deng_lu, zhu_ce, active_code, logout # 導入登錄邏輯處理類 urlpatterns = [ url(r‘^xadmin/‘, xadmin.site.urls), url(r‘^index.html‘, TemplateView.as_view(template_name=‘index.html‘), name=‘index‘), url(r‘^register.html‘, zhu_ce.as_view(), name=‘register‘), url(r‘^captcha/‘, include(‘captcha.urls‘), name=‘captcha‘), url(r‘^active/(?P<active_de>.*)/$‘, active_code.as_view(), name="user_active"), url(r‘^login.html‘, TemplateView.as_view(template_name=‘login.html‘), name=‘login‘), url(r‘^deng_lu‘, deng_lu.as_view(), name=‘deng_lu‘), url(r‘^logout‘, logout.as_view(), name=‘deng_lu‘), ]
2,編寫表單驗證forms文件
from django import forms # 導入Django的表單驗證模塊 from captcha.fields import CaptchaField class zhu_ce_forms(forms.Form): email = forms.EmailField( required=True, max_length=40, min_length=2, error_messages={ ‘required‘: ‘郵箱名不能為空‘, ‘max_length‘: ‘郵箱名長度不得超過40個字符‘, ‘min_length‘: ‘郵箱名長度不得少於2個字符‘, } ) password = forms.CharField( required=True, max_length=20, min_length=2, error_messages={ ‘required‘: ‘密碼不能為空‘, ‘max_length‘: ‘密碼長度不得超過20個字符‘, ‘min_length‘: ‘密碼長度不得少於2個字符‘, } ) captcha = CaptchaField( required=True, error_messages={ ‘required‘: ‘驗證碼不能為空‘, ‘invalid‘: ‘驗證碼不正確‘ } )
3,在邏輯處理類裏將request.POST也就是用戶提交的表單,放到表單類裏驗證,驗證不通過返回提示信息,回填數據,驗證通過獲取驗證通過的表單數據(包括驗證碼驗證,前後將)
#!/usr/bin/env python # -*- coding:utf8 -*- import io # 導入io模塊 from django.shortcuts import render, HttpResponse, redirect # 導入django向瀏覽器返回方法 from django.views.generic.base import View from django.db.models import F,Q # 導入F和Q from django.contrib.auth.hashers import make_password, check_password # 導入django密碼加密,和密碼驗證 from django.contrib.auth import login # 調用django的登錄函數 from app_users.forms import deng_lu_forms, zhu_ce_forms # 導入登錄頁面表單認證 from app_users.models import Users, Email # 導入數據庫操作 from utils.email_send import send_register_email # 導入郵件發送 class zhu_ce(View): def get(self, request): yanzhm = zhu_ce_forms() return render(request, ‘register.html‘, {‘yanzhm‘: yanzhm}) def post(self, request): f = zhu_ce_forms(request.POST) if f.is_valid(): # 判斷認證是否成功 tong_guo = f.cleaned_data # 認證成功,接收用戶數據 email = tong_guo[‘email‘] password = tong_guo[‘password‘]else: # 認證不成功,接收錯誤信息 cuo_wu = f.errors # 接收錯誤信息 print(cuo_wu) return render(request, ‘register.html‘, {‘cuo_wu‘: cuo_wu, ‘yanzh‘: f}) # 將錯誤信息傳到登錄頁面
4,將用戶名拿到數據庫,查找用戶是否存在,用戶存在提示信息回填數據,用戶不存在說明可以註冊,註意用戶密碼需要加密,可以用django密碼加密函數make_password(要加密的密碼),然後將用戶信息寫入數據庫
#!/usr/bin/env python # -*- coding:utf8 -*- import io # 導入io模塊 from django.shortcuts import render, HttpResponse, redirect # 導入django向瀏覽器返回方法 from django.views.generic.base import View from django.db.models import F,Q # 導入F和Q from django.contrib.auth.hashers import make_password, check_password # 導入django密碼加密,和密碼驗證 from django.contrib.auth import login # 調用django的登錄函數 from app_users.forms import deng_lu_forms, zhu_ce_forms # 導入登錄頁面表單認證 from app_users.models import Users, Email # 導入數據庫操作 from utils.email_send import send_register_email # 導入郵件發送 class zhu_ce(View): def get(self, request): yanzhm = zhu_ce_forms() return render(request, ‘register.html‘, {‘yanzhm‘: yanzhm}) def post(self, request): f = zhu_ce_forms(request.POST) if f.is_valid(): # 判斷認證是否成功 tong_guo = f.cleaned_data # 認證成功,接收用戶數據 email = tong_guo[‘email‘] password = tong_guo[‘password‘] user = Users.objects.filter(username=email).values() if len(user) >= 1: tishi = ‘用戶已經存在‘ return render(request, ‘register.html‘, {‘tishi‘: tishi, ‘yanzh‘: f}) else: a = {‘username‘: email, # 將要寫入的數據組合成字典,鍵為字段值為數據 ‘password‘: make_password(password), ‘is_active‘: 0 } Users.objects.create(**a) # 添加到數據庫,註意字典變量名稱一定要加** send_register_email(email) # 執行驗證郵件發送 return render(request, ‘login.html‘) else: # 認證不成功,接收錯誤信息 cuo_wu = f.errors # 接收錯誤信息 print(cuo_wu) return render(request, ‘register.html‘, {‘cuo_wu‘: cuo_wu, ‘yanzh‘: f}) # 將錯誤信息傳到登錄頁面
5,激活用戶,自定義一個用戶郵件激活函數,
在數據庫專門用一張表來記錄激活用戶所需要的隨機字符和郵箱等信息
當用戶數據寫入數據庫後,隨機生成一個字符
向用戶激活表裏寫入當前的隨機字符,和用戶驗證郵箱
然後向用戶的郵箱發送一條激活連接,激活連接由域名加隨機字符組成,然後提示用戶到郵箱激活
#!/usr/bin/env python # -*- coding:utf8 -*- from random import Random # 導入隨機函數 from django.core.mail import send_mail # 導入django郵件函數 from app_users.models import Email # 導入激活操作數據庫表 from MxOnline.settings import DEFAULT_FROM_EMAIL def random_str(randomlength=8): """ 循環獲取隨機字符串,默認8位 """ str = ‘‘ chars = ‘AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789‘ length = len(chars) - 1 random = Random() for i in range(randomlength): str+=chars[random.randint(0, length)] return str def send_register_email(email, send_type="register"): """ 發送郵件 :接收兩個參數: :第一個驗證郵箱,第二個驗證類型 """ """寫入數據庫驗證信息""" email_record = Email() # 實例化數據庫表 if send_type == "update_email": code = random_str(4) # 生成4位隨機數 else: code = random_str(16) # 生成16位隨機數 email_record.code = code # 數據庫寫入驗證隨機數 email_record.email = email # 數據庫寫入驗證郵箱 email_record.send_type = send_type # 數據庫寫入驗證類型 email_record.save() """發送驗證郵件""" email_title = "" # 記錄郵件標題 email_body = "" # 記錄郵件內容 if send_type == "register": email_title = "慕學在線網註冊激活鏈接" email_body = "請點擊下面的鏈接激活你的賬號: http://127.0.0.1:8000/active/{0}".format(code) send_status = send_mail(email_title, email_body, DEFAULT_FROM_EMAIL, [email]) if send_status: pass elif send_type == "forget": email_title = "慕學在線網註冊密碼重置鏈接" email_body = "請點擊下面的鏈接重置密碼: http://127.0.0.1:8000/reset/{0}".format(code) send_status = send_mail(email_title, email_body, DEFAULT_FROM_EMAIL, [email]) if send_status: pass elif send_type == "update_email": email_title = "慕學在線郵箱修改驗證碼" email_body = "你的郵箱驗證碼為: {0}".format(code) send_status = send_mail(email_title, email_body, DEFAULT_FROM_EMAIL, [email]) if send_status: pass
6.設置激活連接邏輯
當用戶點擊激活連接時,獲取到激活連接的隨機字符,
將隨機字符拿到激活表裏去查詢是否有這條隨機字符,如果有,將當前隨機字符的所有信息獲取到,通過獲取到的信息,將對應用戶表裏用戶狀態改為激活狀態,返回登錄頁面,提示以激活請登錄
from django.conf.urls import url, include # 導入django自在的include邏輯 from django.contrib import admin from django.views.generic import TemplateView # 導入django自帶的TemplateView邏輯 import xadmin # 導入xadmin from app_users.views import deng_lu, zhu_ce, active_code, logout # 導入登錄邏輯處理類 urlpatterns = [ url(r‘^xadmin/‘, xadmin.site.urls), url(r‘^index.html‘, TemplateView.as_view(template_name=‘index.html‘), name=‘index‘), url(r‘^register.html‘, zhu_ce.as_view(), name=‘register‘), url(r‘^captcha/‘, include(‘captcha.urls‘), name=‘captcha‘), url(r‘^active/(?P<active_de>.*)/$‘, active_code.as_view(), name="user_active"), url(r‘^login.html‘, TemplateView.as_view(template_name=‘login.html‘), name=‘login‘), url(r‘^deng_lu‘, deng_lu.as_view(), name=‘deng_lu‘), url(r‘^logout‘, logout.as_view(), name=‘deng_lu‘), ]
激活邏輯處理
class active_code(View): def get(self, request, active_de): yanzh_email = Email.objects.filter(code=active_de) if yanzh_email: for record in yanzh_email: email = record.email Users.objects.filter(username=email).update(is_active=True) Email.objects.filter(code=active_de).delete() return render(request, ‘login.html‘)
第三百八十三節,Django+Xadmin打造上線標準的在線教育平臺—路由映射與靜態文件配置