django2.2 使用者登入練習完整版(待改善)
主要配置:
settings.py配置:
#資料庫配置 import pymysql pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite', 'HOST': '47.104.124.214', 'USER': 'root', 'PASSWORD': 'django', 'PORT': '3306', } } # 郵件配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.163.com' EMAIL_PORT = 25 EMAIL_HOST_USER = '[email protected]' EMAIL_HOST_PASSWORD = 'wyl5588' # 註冊有效期天數 CONFIRM_DAYS = 7 #session共享 # 配置session使用redis CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://47.104.124.214:6379', # 指明使用redis的1號資料庫後面加/庫名即可 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "PASSWORD": "", }, }, } # session的儲存配置 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' # 設定session失效時間,單位為秒 SESSION_COOKIE_AGE = 60*5
專案urls.py
from django.contrib import admin from django.urls import path,include from Registration import views urlpatterns = [ path('',include('Registration.urls')), path('admin/', admin.site.urls), path('Registration/',include('Registration.urls')), path('login/',views.login), path('register/',views.register), path('logout/',views.logout), path('captcha/', include('captcha.urls')), path('confirm/', views.user_confirm), ]
app admin.py
from django.contrib import admin from . import models # Register your models here. admin.site.register(models.User) admin.site.register(models.ConfirmString)
models.py
from django.db import models class User(models.Model): gender = (('male','男'),('female','女')) user = models.CharField(verbose_name=u'姓名',max_length=128,unique=True) passwd = models.CharField(verbose_name=u'密碼',max_length=128) email = models.EmailField(verbose_name=u'郵箱',unique=True) sex = models.CharField(verbose_name=u'性別',max_length=32,choices=gender,default="男") c_time = models.DateTimeField(verbose_name=u'建立時間',auto_now_add=True) mod_date = models.DateTimeField(verbose_name=u'修改日期', auto_now=True) confiremd = models.BooleanField(default=False) def __str__(self): return self.user class Meta: ordering = ['-c_time'] db_table = 'User' verbose_name = '使用者表[User]' verbose_name_plural = '使用者表[User]' #verbose_name=u'姓名',用於在admin介面新增正好時友好顯示。不寫新增賬號會顯示:欄位名稱 #unique唯一性 #auto_now無論是你新增還是修改物件,時間為你新增或者修改的時間。 #auto_now_add為新增時的時間,更新物件時不會有變動。 #choice只能選擇'男'或者'女'.預設為男 #__str__是python的一個魔幻方法。作用於django管理介面用於將資料庫中的記錄展示為易讀的字串。 #Meta類用於定義表名稱。預設表名稱為'app名稱_表名稱',db_table用於指定表名 #ordering 用於指定一個欄位,按照升序或降序對資料進行排序。指定的欄位名稱前加'-'表示遞減,若沒有加表示升序,若加'?'表示隨機. #verbose_name用於在admin介面單數顯示,verbose_name_plural複數形式顯示。中文單數複數一般不做區別。 #verbose類似於User表在admin介面的顯示形式。類似於別名 #code_confiremd欄位值是一個布林值.預設返回為False。當用戶確認後我們將其改為True即可。 class ConfirmString(models.Model): code = models.CharField(max_length=256) user = models.OneToOneField('User',on_delete=models.CASCADE) c_time = models.DateTimeField(auto_now_add=True) #on_delete=models.CASCADE主外關係鍵中,級聯刪除,也就是當刪除主表的資料時候從表中的資料也隨著一起刪除 def __str__(self): return self.user.name + ": "+self.code class Meta: ordering = ['-c_time'] db_table = 'ConfirmString' verbose_name = "確認碼" verbose_name_plural = "確認碼"
app urls.py
from django.urls import path from . import views urlpatterns = [ path('', views.index,name='index'), ]
views.py
from django.shortcuts import render,redirect from django.http import HttpResponse from . import models import hashlib import datetime from django.conf import settings def send_email(email, code): from django.core.mail import EmailMultiAlternatives subject = '來自bestyunyan.com的註冊確認郵件' text_content = '''感謝註冊bestyunyan.com,這裡是王雲龍的部落格站點,專注於Python、Django學習技術的分享!\ 如果你看到這條訊息,說明你的郵箱伺服器不提供HTML連結功能,請聯絡管理員!''' html_content = ''' <p>感謝註冊<a href="http://{}/confirm/?code={}" target=blank>www.bestyunyan.com</a>,\ 這裡是王雲龍的部落格站點,專注於Python、Django學習技術的分享!</p> <p>請點選站點連結完成註冊確認!</p> <p>此連結有效期為{}天!</p> '''.format('127.0.0.1', code, settings.CONFIRM_DAYS) msg = EmailMultiAlternatives(subject, text_content, settings.EMAIL_HOST_USER, [email]) msg.attach_alternative(html_content, "text/html") msg.send() #定義hash_code方法用於生成code def hash_code(s, salt='mysite'): h = hashlib.sha256() s += salt h.update(s.encode()) return h.hexdigest() def make_confirm_string(user): now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") code = hash_code(user.user, now) models.ConfirmString.objects.create(code=code, user=user,) return code def index(request): if not request.session.get('is_login',None): return redirect('/login/') # return HttpResponse('Hello, world. You\'re at the polls index.') return render(request,'index.html') def login(request): if request.session.get('is_login',None): return redirect('/') if request.method == "POST": user = request.POST.get('username') password = request.POST.get('password') message='請檢查填寫內容!' print('------user:%s,password:%s------'%(user,password)) if user.strip() and password: try: u=models.User.objects.get(user=user) #a=models.table_name.objects.get(xx=xx,yy=yy) #返回一個數據物件.獲取資料物件的某一個屬性欄位值通過點的方式獲取如: print('---資料庫使用者:%s,密碼:%s,註冊日期:%s'%(u.user,u.passwd,u.c_time)) except Exception as f: print(f) message = '使用者不存在!' return render(request,'login/login.html',{'message':message}) if not u.confiremd: message = '使用者為確認!' return render(request,'login/login.html',{'message':message}) if u.passwd == password: request.session['is_login'] = True request.session['user_id'] = u.id request.session['user_name'] = u.user request.session['user_email'] = u.email return redirect('/') else: message = '密碼不正確' return render(request,'login/login.html',{'message':message}) return render(request,'login/login.html',{'message':message}) return render(request,'login/login.html') #通過下面的if語句,我們不允許重複登入: # if request.session.get('is_login',None): # return redirect("/") # request.session['is_login'] = True # request.session['user_id'] = user.id # request.session['user_name'] = user.name def register(request): if request.session.get('is_login',None): return redirect('/') if request.method == 'POST': user = request.POST.get('username') password1 = request.POST.get('passwd1') password2 = request.POST.get('passwd2') email = request.POST.get('email') sex = request.POST.get('sex') print('user:%s,password1:%s,password2:%s,email:%s,sex:%s'%(user,password1,password2,email,sex)) if password1 != password2: message='兩次密碼不相同' return render(request,'login/register.html') else: sameuser = models.User.objects.filter(user=user) if sameuser: message='該使用者已經存在' return render(request,'login/register.html') sameemail =models.User.objects.filter(email=email) if sameemail: message='該郵箱已經被註冊了' return render(request,'login/register.html') #django的操作資料庫get方法是從資料庫的取得一個匹配的結果,返回一個物件,如果記錄不存在的話,它會報錯。 #django的操作資料庫filter方法是從資料庫的取得匹配的結果,返回一個物件列表,如果記錄不存在的話,它會返回[]。 models.User.objects.create(user=user,passwd=password1,email=email,sex=sex) new_user = models.User.objects.get(user=user) print('使用者名稱稱:%s密碼:%s'%(new_user.user,new_user.passwd)) code = make_confirm_string(new_user) send_email(email, code) #通過make_confirm_string函式獲取 message = '請前往郵箱確認!' print('code:%s,message:%s'%(code,message)) return render(request, 'login/confirm.html',{'message':message}) return render(request,'login/register.html') def logout(request): if not request.session.get('is_login',None): return redirect('/login/') request.session.flush() return redirect("/login/") def user_confirm(request): code = request.GET.get('code', None) message = '' try: confirm = models.ConfirmString.objects.get(code=code) except: message = '無效的確認請求!' return render(request, 'login/confirm.html', locals()) c_time = confirm.c_time now = datetime.datetime.now() print('---now:%s'%(now)) print('c_time:%s'%(c_time + datetime.timedelta(settings.CONFIRM_DAYS))) if str(now) > str(c_time + datetime.timedelta(settings.CONFIRM_DAYS)): confirm.user.delete() message = '您的郵件已經過期!請重新註冊!' return render(request, 'login/confirm.html', locals()) else: confirm.user.confiremd = True confirm.user.save() confirm.delete() message = '感謝確認,請使用賬戶登入!' return render(request, 'login/confirm.html', locals())
cat confirm.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>註冊確認</title> </head> <body> <h1 style="margin-left: 100px;">{{ message }}</h1> <script> window.setTimeout("window.location='/login/'",2000); </script> </body> </html>
相關推薦
django2.2 使用者登入練習完整版(待改善)
主要配置: settings.py配置: #資料庫配置 import pymysql pymysql.install_as
2016 尚學堂 互聯網架構師 培訓2期-不加密完整版(32G)
收集 二維碼 完整 AR 技術資料 alt view info 資料 ======================================================= 長期更新IT編程視頻教程,資料收集整理不易,需要一點費用 有意者加Q
Odoo:全球第一免費開源ERP權威效能測試報告完整版(絕對珍藏)
Odoo平臺簡介 Odoo(以前叫OpenERP)是世界排名第一的開源ERP系統,最早由比利時一家公司開發,經過十幾年發展,目前全世界Odoo的使用者超過2百萬人,Odoo被翻譯成幾十種語言,Odoo社群活躍的開發人員超過5000人。從2012年開始,美國著名IT雜誌Info
決策樹——機器學習實戰完整版(python 3)
import matplotlib.pyplot as plt # boxstyle是文字框型別 fc是邊框粗細 sawtooth是鋸齒形 '''xy是終點座標 xytext是起點座標 可能疑問:為什麼說是終點,但是卻是箭頭從這出發的? 解答:arrowstyle="<-" 看到沒有,這是個反
JSP+Servlet+Tomcat應用開發從零開始學_完整版(附原始碼)
連結:https://pan.baidu.com/s/17Lx7g3qBVierneWlJJQCjg 提取碼:0x7w 目錄 第1章搭建 Java Web開發環境 1.1 Web開發背景知識 1.1.1 Web訪問的基本原理.&nb
一本通網站練習源碼(待完善)
gif ont play isp 測試 hide 待完善 金字塔 space 第一部分 C++語言 第二節 C++語文程序結構 1000:入門測試題目 1001:Hello,World! 1002:輸出第二個整數 1003:對齊輸出 1004:字符三角形 1005:
對於同一套應用程序如何發布一個體驗版(有部分功能)完整版(有完整功能)
service() () ogr com 完整 fine adk testin generic 最近項目中,先做一個版本給用戶(普通用戶作為體驗使用)。之後再有一個完整功能版。 #define OFFLINE using System; using System.
python 爬蟲獲取文件式網站資源完整版(基於python 3.6)
sta 不支持 bytes ror 啟動 www des find parse <--------------------------------下載函數-----------------------------> import requestsimport t
方維直播源碼:修復BUG完整版(附代碼)
方維直播源碼 方維直播系統 雲豹直播源碼 雲豹直播系統 呆萌直播 方維直播源碼現在市面上的流通的版本很多也很亂,還有許多人不知道該怎麽選擇版本,帶有很多bug的版本很多都便宜給了小白鼠,可以搭建起來,卻基本上都是打醬油的根本做不起來。首先真正的方維直播系統源碼官方的十幾w一般
劍指Offer演算法題及答案Java完整版(一)
1、輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。 package cn.ctgu.offer; /* * 輸入一個整數陣列,實現一個函式來調整該陣列中數
openlayers-熱地圖加載(完整版及代碼)
初始 sele coo source stat ima layout tap 中心 //地圖加載function mapInit(data){ //底圖// var raster = new ol.layer.Tile({// source: new ol.
劍指Offer演算法題及答案Java完整版(二)
16、請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑,路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則之後不能再次進入這個格子。例如 a b c e s f c s a d e e 這樣的
TensorFlow車牌識別完整版(含車牌資料集)
在之前釋出的一篇博文《MNIST資料集實現車牌識別--初步演示版》中,我們演示瞭如何使用TensorFlow進行車牌識別,但是,當時採用的資料集是MNIST數字手寫體,只能分類0-9共10個數字,無法分類省份簡稱和字母,侷限性較大,無實際意義。 經過影象定位分割處理
PTA練習:找完數(C語言)
所謂完數就是該數恰好等於除自身外的因子之和。例如:6=1+2+3,其中1、2、3為6的因子。本題要求編寫程式,找出任意兩正整數m和n之間的所有完數。 輸入格式: 輸入在一行中給出2個正整數m和n(1<m≤n≤10000),中間以空格分隔。 輸出格式: 逐行輸出給定範
看這一篇就夠啦!微信小程式入門與實戰,橫掃常用元件API開發技巧(完整版包含全部原始碼)
第1章:什麼是微信小程式? 1 開篇及課程特色介紹 2 直觀感受一下微信小程式 3 小程式適合做什麼樣的應用 4 對開發者的影響 5 學習基礎 6 小作業 第2章:小程式環境大件與開發工具介紹 1 開篇介紹及下載工具 2 小程式目前情況及限制 3 小程式開發
第三方登入QQ完整版,授權登入
在這個網址裡下載 Android_SDK_V3.3.0 http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD 首先將Android_SDK_V3.3.0.lite下面的open_sdk_r5886_lite
Matlab 2012a—2017a軟體下載官網官方完整版(win32&64位)MATLAB 2012a 2013a 2014b 2015a 2015b 2016a 2016b 2017a破解版下載附
tipsMATLAB和Mathematica、Maple並稱為三大數學軟體。它在數學類科技應用軟體中在數值計算方面首屈一指。MATLAB可以進行矩陣運算、繪製函式和資料、實現演算法、建立使用者介面、連線其他程式語言的程式等,主要應用於工程計算、控制設計、訊號處理與通訊、影象處
MBTI職業性格測試完整版(手機使用者點這裡進入測試>>)
引導語:“我性格內向/外向,適合什麼工作?”“哪些職業正好匹配我的性格?”“以我的個性從事什麼行業好?”“我性格中的優勢和劣勢是什麼?”“我是不是該繼續現在從事的職業?” 不論是正待走進職場的畢業生,還是工作了一段時間的人,面對這類問題都會感到困惑——性格因素和職業選
資源 | 斯坦福CS231n Spring 2017詳細課程大綱(附完整版課件下載)
機器之心編譯 參與:Smith、蔣思源 CS231n 近幾年一直是計算機視覺領域和深度學習領域最為經典的課程之一。而最近才剛剛結課的 CS231n Spring 2017 仍由李飛飛帶頭主講,並邀請了 Goodfellow 等人對其中部分章節詳細介紹。本課程從計算
練習2-3 輸出倒三角圖案(5 分)
本題要求編寫程式,輸出指定的由“*”組成的倒三角圖案。輸入格式:本題目沒有輸入。輸出格式:按照下列格式輸出由“*”組成的倒三角圖案。* * * * * * * * * *#include<stdio.h> int main(){ printf