django的auth認證,is_authenticate 和裝飾器的2個方法,注銷的功能,


在django中創建表,會自動創建一些django自帶的表,先了解用戶認證,

認證登錄  先要引用  ,

from django.contrib import auth

有很多方法,

網站先有登錄和認證,

authenticate(),提供用戶認證,驗證用戶名和密碼是否正確,一般需要username ,password兩個關鍵字參數,

認證信息有效,返回有一個User對象。authrenticate()會在User對象上設置一個屬性標識,認證了該用戶,

創建一個Book表,然后生成數據庫

from django.db import models

# Create your models here.


class Book(models.Model):

    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5,decimal_places=2)

 

在pycharm里命令台terminal 里創建一個超級用戶  root, 密碼  root123456

C:\Users\lenovo\PycharmProjects\auth_gu>python manage.py createsuperuser
Username (leave blank to use 'lenovo'): root
Email address:
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
Password:
Password (again):
Superuser created successfully.

然后在auth_user 表中就有了剛才創建的信息

 

 可以看到django是做了一層加密,

創建login頁面,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>

<form action="/login/" method="post">

{#    #}
   {% csrf_token %}
<p>姓名:<input type="text" name="user"></p> <p>密碼:<input type="password" name="pwd"></p> <input type="submit" value="提交"> </form> </body> </html>

當我提交的時候,會出現forbidden的情況,get請求不會出現這種情況,

因為在setting文件的中間件,不允許出現跨站請求,

別的網站第一次訪問我就發送post 請求,我的網站就拒絕,怎么拒絕,要區分第一次和第二次,y用cookie, 在cookie里加上csrf-token,下次請求時,cookie就有csrf-token ,就知道,已經登錄過了,不會再被forbidden掉了,

在form表單中添加 {% csrf_token %},

在前端頁面,檢查元素,就可以看到有了crsf-token ,是隱藏的狀態,

------

在ajax請求的時候,也要加上csrf-token,

$.ajax({

  data:{csrfmiddlewaretoken:'{{csrf-token}}'  },

}), 

 -----

在views文件,使用authenticate()方法,從前端獲取用戶登錄的信息進行驗證,

def login(request):

    if request.method == "POST":

        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        #使用authenticate()方法
        auth.authenticate(username=user,password=pwd)
        print("user",user)
        print("pwd",pwd)

        return HttpResponse("ok")


    return render(request,"login.html")

在前端頁面,輸入剛才注冊的超級用戶,和密碼,登錄成功,后台進行打印出用戶名和密碼,

user root
pwd root123456
[05/Dec/2017 10:04:41] "POST /login/ HTTP/1.1" 200 2

但現在存在一個問題,沒有cookie和session,如果換個瀏覽器,登錄index頁面,還是能直接直接登錄,

所以現在就可以直接用,login(request,User),就相當於設置了cookie和session, 在跳轉到index頁面親,跳轉

修改login函數,因為與django里login()重名了,

def index(request):


    return render(request,'index.html')

#用django的認證方法,
def log_in(request):

    if request.method == "POST":

        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        #使用authenticate()方法
        auth.authenticate(username=user,password=pwd)
        print("user",user)
        print("pwd",pwd)

        if user is not None:#如果有這個用戶,跳轉到index頁面

            auth.login(request,user)       -------------------

            return redirect("/index/")

    return render(request,"log_in.html")

關於裝飾器login_required 和is_authenticated ()的功能一樣,就是不用判斷了

from django.shortcuts import render,HttpResponse,redirect

from django.contrib.auth.decorators import login_required
#與is_authenticate的工程一樣,

# Create your views here.

from django.contrib import auth
#auth 的3個方法,
#authenticate()
#login(HttpResquest,user)
#logout(request)



# @login_required,與is_authenticate 的功能一樣,就不用判斷,

#舉例說明
@login_required
def index2(request):
    # 可以加一個裝飾器,與is_authenticated()的功能一樣,@login_required
    # 先導入 from django.contrib.auth.decorators import login_required
    return render(request,"index.html")

#如果用戶沒有登錄,者跳轉到django默認的登錄URL"accounts/login/" ,可以以
#通過settings文件通過LOGIN_URL進行修改,並傳遞當前訪問的url的絕對路徑

def index(request):
    #打印一個user對象,利用user對象的is_tuthenticated方法做判斷,是否驗證過,返回布爾值,,做判斷
    #用戶登錄后才能訪問某些頁面,
    #沒有登錄就訪問,就直接跳到登錄頁面,
    #用戶跳轉到登錄頁面完成登錄,自動訪問跳轉到之前訪問的地址,
    print("=====>",request.user.is_authenticated())
    #=====> root
    # ,如果換個瀏覽器,就是AnonymousUser匿名,

    if request.user.is_authenticated():#已登錄

        return render(request,"index.html")
    else:
        return redirect("/log_in/")

    #登錄之前先驗證,

    return render(request,'index.html')



#用django的認證方法,
def log_in(request):

    if request.method == "POST":

        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        #使用authenticate()方法,得到一個User對象,做user驗證,
        user = auth.authenticate(username=user,password=pwd)
        print("user",user)
        print("pwd",pwd)

        if user is not None:#如果有這個用戶,跳轉到index頁面

            auth.login(request,user)#auth下的login() 方法,就相當於session+cookie,在跳轉到index頁面還要實現做判斷,

            return redirect("/index/")

    return render(request,"log_in.html")

-------------------------------

現在寫一個注冊功能,url路由

from django.conf.urls import url
from django.contrib import admin

from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^log_in/', views.log_in),
    url(r'^index/', views.index),
    url(r'^reg/', views.reg),
    url(r'^log_out/', views.log_out),
]

再寫一個reg頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>

<h1>注冊頁面</h1>

<h4>{{ error_message }}</h4>

<form action="/reg/" method="post">
    
    {% csrf_token %}
    <p>姓名:<input type="text" name="user"></p>
    <p>密碼:<input type="password" name="pwd"></p>
    <p>確認密碼:<input type="password" name="repeat_pwd"></p>
    <input type="submit">
</form>



</body>

</html>

 

在views 視圖函數中,

#注冊頁面
def reg(request):

    error_message = ""#放在全局
    if request.method=="POST":
        #獲取用戶輸入的數據,存到數據庫前,要先判斷
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        repeat_pwd = request.POST.get("repeat_pwd")


        #密碼不能為空,
        if not pwd or not repeat_pwd :
            error_message="密碼不能為空"

        elif not user :
            error_message="用戶名不能為空"

        elif repeat_pwd != pwd:
            error_message = "密碼不一致"
        elif User.objects.filter(username = user):

            error_message = "用戶已存在"

        else:
            #把用戶輸入的用戶名和密碼存到數據庫,但django做了一次加密,
    #所以就不能直接用,create的方法,要用User表的方法,create_user()
            User.objects.create_user(username = user,password = pwd)

            #注冊成功后,跳到登錄頁面
            return redirect("/log_in/")


    return render(request,"reg.html",{"error_message":error_message})

auth下的注銷功能,直接挑用logout()方法,

#注銷功能,清除掉cookie和session,
def log_out(request):
    #登錄的時候,用到了login()函數,

    auth.logout(request)#清除了cookie和session,清除了當前的用戶,

    return redirect("/log_in/")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM