天天看點

Django開發之登陸和登出

使用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      

轉載于:https://www.cnblogs.com/gangdou/p/7900264.html