1. 程式人生 > >django2.2 使用者登入練習完整版(待改善)

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