1. 程式人生 > >Django使用者驗證方法

Django使用者驗證方法

前言

這部分主要是需要保證網站的一些敏感頁面不被普通遊客訪問到,需要一整套使用者系統

環境

  • windows10
  • pycharm2017.3.3 professional edition
  • python3.6.4
  • django2.0.2

方法

  1. 建立登陸頁面,與普通HTML頁面建立方法相同,比如下面這個最基本的登陸頁面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登陸</title>
    </head
    >
    <body> <form action="
    {% url 'login_check' %}" method="POST"> {% csrf_token %} <label> <input type="text" name="username"> </label> <label> <input type="password" name="password"> </label
    >
    <input type="submit" value="登陸"> </form> <p>
    {{ message }}</p> </body> </html>

    login_check和{% csrf_token %}這兩部分後面會介紹

  2. 寫登入頁函式,以便於在其他頁面使用跳轉到登入頁。在views.py檔案下增加

    def login(request):
        return render(request, "login.html", {"message": "請輸入使用者名稱和密碼!"})

    別忘了新增到urls.py檔案

    path('login/', views.login, name="login"),

    跳轉方法

    <a href="{% url 'login' %}"></a>
  3. 以上部分和建立一個普通頁面的方法基本相同,接下來重頭戲開始:使用者登陸與驗證。在views.py檔案內建立登陸驗證函式。若賬號密碼通過,則登陸並返回;否則留在登入頁並顯示 “登入名或密碼錯誤!”字樣

    from django.contrib import auth
    from django.shortcuts import render, redirect
    
    def login_check(request):
        username = request.POST.get("username", "")
        password = request.POST.get("password", "")
        user = auth.authenticate(request, username=username, password=password)
        if user is not None:
            auth.login(request, user)
            return redirect("/dashboard/")
        else:
            return render(request, "login.html", {"message": "登入名或密碼錯誤!"})

    同樣不要忘記將函式寫入urls.py檔案

    path('login_check', views.login_check, name="login_check"),
  4. 未登入使用者強制跳轉,防止未登入使用者看到資料,在需要設定訪問限制的網頁加入以下函式,比如table,判斷使用者登陸狀況,若使用者已登入,則允許跳轉到table頁面,否則強制跳轉到登入頁面

    def table(request):
        # 判斷登入情況,未登入強制跳轉
        if request.user.is_authenticated:
            return render(request, "table.html")
        else:
            return render(request, "login.html", {"message": "請輸入使用者名稱和密碼!"})

備註

  • CSRF(Cross-site request forgery)跨站請求偽造。Django為了防止CSRF攻擊有一些保護措施,因此我們在使用POST時會出現django csrf token missing or incorrect的錯誤,因此需要在POST表單中加入 {% csrf_token %},原理部分此時先不做深究,因為我也沒有研究這方面
  • 關於render的一些問題,因為render本身自帶一個request引數,這個引數其實包含有很多資訊,其中就有使用者資訊,因此在使用render時,即便我們沒有向網頁傳遞任何引數,網頁依然可以訪問到使用者資訊,比如使用{{user}}就可以顯示使用者名稱,這就是request起到的作用