1. 程式人生 > >Django開發之登陸和登出

Django開發之登陸和登出

coo .com password art post方法 沒有 必須 創建 ref

使用django自帶的驗證模塊

1、首先使用python manage.py startapp models為當前項目添加一個應用。

2、在setting.py中INSTALLED_APPS後面添加‘models‘,

INSTALLED_APPS = [
    django.contrib.admin,
    django.contrib.auth,
    django.contrib.contenttypes,
    django.contrib.sessions,
    django.contrib.messages,
    django.contrib.staticfiles
, models, ]

3、配置並同步數據庫

DATABASES = {
    default: {
        ENGINE: django.db.backends.mysql,
        #‘ENGINE‘: ‘django.db.backends.postgresql_psycopg2‘,
        NAME: gangdou,
        USER: root,
        PASSWORD: 1,
        HOST:ip,
        PORT:3306,
    }
}

同步數據庫

python manage.py migrate

4、使用python manage.py createsuperuser --username=gangdou [email protected]創建一個超級管理員用戶,記得密碼必須大於8位

5、在urls.py中添加

from . import views
urlpatterns = [ url(r^admin/, admin.site.urls), url(r^home/$,views.home),#通過url跳轉到登陸頁面 url(r^index/,views.index),#通過url跳轉到首頁
url(r^login_view$,views.login_view),#填寫完信息後提交登陸驗證 url(r^logout_view$,views.logout_view),#退出登陸 ]

6、在views.py中添加

# -*- coding:utf-8 -*-
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate
from django.contrib.auth import login,logout
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response

def home(request):
    return render(request,"login.html")

@login_required#用戶登陸校驗,必須登陸之後才能訪問,如果沒有登陸,就自動跳轉到setting.py裏面LOGIN_URL=‘/home‘設定的地址
def index(request):
    return render(request,"index.html")#同一個頁面的跳轉可以使用render

def login_view(request):
    context = {}
    if request.method == POST:#此處必須校驗是post方法提交過來的請求
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)#這個時候Django認證模塊會在數據庫django_session表中添加一條session數據
                request.session[username]=username
                return HttpResponseRedirect("/index")#這裏不使用render的方式是由於render方式跳轉後,瀏覽器地址欄的url不會隨之變化,可能影響後面的url跳轉
            else:
                context["msg"] = "用戶已被鎖定,請聯系管理員"
                return render_to_response("login.html",context)
        else:
            context["msg"] = "用戶名或密碼錯誤"
            return render_to_response("login.html",context)

@login_required
def logout_view(request):
    logout(request)#此時Django認證模塊會將數據庫的session數據給清空
    return HttpResponseRedirect("/home")

7、login.html

<form role="form" action="/login_view" method="post"><!--此處method中的url一定要前面一定要加/,後面/是否要加取決於urls.py的配置-->
    <input name="username" type="text" autofocus>
    <input name="password" type="password" value="">
    <div class="form-group">{{ msg }}</div>
    <button>登陸</button>
</form>

8、logout

<a href="/logout_view">退出登錄</a>

9、清理session數據,自此django的認證登陸登出功能完成,但是此處有個問題,就是當用戶在手動關閉瀏覽器的時候,session數據不會自動失效,數據庫的session數據也不會自動刪除,所以需要在setting.py中加一些配置,然後寫一個定時清理該表過期session數據的腳本

SESSION_COOKIE_AGE = 60*30#設置session過期時間為30分鐘
SESSION_EXPIRE_AT_BROWSER_CLOSE =  True#當瀏覽器被關閉的時候將session失效,但是不能刪除數據庫的session數據
SESSION_SAVE_EVERY_REQUEST = True#每次請求都要保存一下session

Django開發之登陸和登出