14,Django-auth模塊登陸-註銷-狀態驗證-auth中間件-註冊

14,Django-django的認證系統,

https://www.cnblogs.com/maple-shaw/articles/9537320.htmljavascript

 

筆記:html

day78
1. 內容回顧
    form組件
        1. form組件乾的事:
            1. 自動生成input框
            2. 對提交的數據進行校驗
            3. 有錯誤的信息
        2. 定義一個form組件
            from django import forms
            class RegForm(forms.Form):
                username = forms.CharField()
                pwd = forms.CharField()
            
        3. 使用
            後端使用:
                form_obj = RegForm()
                return render(request,'reg.html',{'form_obj':form_obj})
                
                form_obj = RegForm(request.POST)
                form_obj.is_vaild()
                
                form_obj.cleaned_data   ——》 字典  存放全部已經經過校驗的字段和值
                        
            前端使用:
                {{ form_obj.as_p }}                 ——》生成全部的input框
                
                {{ form_obj.username }}          ——》username的input框
                {{ form_obj.username.label }}    ——》username的標籤顯示文字
                {{ form_obj.username.id_for_label }}    ——》input框的ID
                {{ form_obj.username.errors    }}   ——》當前字段的全部錯誤
                {{ form_obj.username.errors.0    }}   ——》當前字段的第一個錯誤
                
                {{ form_obj.errors}}             ——》form表單的全部錯誤
                
        4. 字段類型和參數
            1. 
                CharField()
                ChoiceField()
            2.     參數
                label       顯示的文本
                initail     初識化的值
                min_length  最小長度
                max_length  最大長度
                required    是否必須
                error_messages = {"min_length":"過短了",'required': ""}
                widget  =  forms.widgets.PasswordInput(
                        attrs:{"class":"form_control"}
                    )
                validators = [驗證器1,驗證器2]
            3. 驗證
                1. 內置的驗證
                    min_length
                    max_length
                    required
                2. 自定義驗證器
                    validators = [驗證器1,驗證器2]
                    
                    
                    from django.core.validators import RegexValidator
                    RegexValidator(r'1[3-9]\d{9}', '手機號不正經')
                    
                    定義函數
                    def check(value):
                        if "alex" in value:
                            raise ValidationError('含有非法字符')
                    
                3. 鉤子函數
                    1. 局部鉤子
                        clean_字段名(self):
                        經過校驗:返回當前校驗的值
                        不經過: raise ValidationError('不經過')
                    2. 全局鉤子
                        clean(self):
                            經過校驗:self.cleaned_data
                            不經過: 
                                self.add_error('re_pwd', '兩次密碼不一致!!!!')
                                raise ValidationError('不經過')
                    
                
            
2. 今日內容
    1. auth認證
        from django.contrib import auth
        
        1. 註冊超級用戶
            python manage.py createsuperuser 
        2. 認證用戶
            user = authenticate(request, username=username, password=pwd)
        3. 保存登陸狀態
            寫入到session中
            login(request,user)
            
        4. 註銷
            刪除用戶的session
            logout(request)
        5. 登陸狀態
            request.user.is_authenticated()
            
        6. login_required
            登陸以後才能訪問視圖
            
        
        7. create_user()
        8. create_superuser()
        9. check_password(password)
        10. set_password(password)
        
        11. 擴展表
            from django.contrib.auth.models import AbstractUser
            class UserInfo(AbstractUser):
                """
                用戶信息表
                """
                nid = models.AutoField(primary_key=True)
                phone = models.CharField(max_length=11, null=True, unique=True)
                
            
            # 引用Django自帶的User表,繼承使用時須要設置
            AUTH_USER_MODEL = "app名.UserInfo"
                
                
                
            
整理筆記

 

 /前端

 

/java

/python

 

 

User對象的屬性

User對象屬性:username, passwordsql

 

is_active : 是否容許用戶登陸, 設置爲 False,能夠在不刪除用戶的前提下禁止用戶登陸。數據庫

 

 is_staff : 若是是1,就是可使用賬號密碼登陸admin,可是登陸後界面以下,若是是0,壓根就不能登陸admin,django

 

 

新建項目,直接,migrate
而後把sqlit3拖過去,拖到數據庫的位置,
命令:python manager.py createsuperuser後端


django自帶管理後臺 在app文件夾下,admin.py文件裏面,瀏覽器

 

建立用戶

 

 

 

登陸後臺地址:

http://127.0.0.1:8000/admin

 

取消自動填充,

<form action='' method='post' autocomplete='off' novalidate>

 

 

novalidate:取消瀏覽器給作校驗,實際上應該作校驗,減少服務器壓力,

 

認證,須要導入模塊,

from django.contrib.auth import authenticate

 

顯示輸出的obj,

from django.contrib.auth import authenticate

def login(request):
    if request.method=='POST':
        username=request.POST.get('username')
        pwd=request.POST.get('pwd')
        #對提交的數據進行認證,會返回一個對象,沒有的話會返回一個none
        obj=authenticate(request,username=username,password=pwd)
        # 此處obj輸出的是註冊的用戶名,
        print(obj)
        return redirect('/admin/')
    return render(request,'login.html')

 

 

引入的區別

# from django.contrib.auth import authenticate
from django.contrib import auth

 

寫session數據

 if obj:
            # 往數據庫的session表裏寫數據,  認證須要依賴session的中間件,
 auth.login(request,obj) return HttpResponse('ok')
        else:
            error_msg='用戶名或密碼錯誤,'

 

session的設置

 

同一個瀏覽器登陸多個賬號,只能保留最後一個的session,而不一樣瀏覽器的賬號登陸,則能夠保存多個session,他是認瀏覽器 的,

 

兩個瀏覽器登陸同一個賬號,session_key是不一樣的,可是session_data是相同的,

 

 執行了auth.logout(request)以後,session表裏的數據也被清空了.

 

is_authenticated()

用來判斷當前請求是否經過了認證。

 

 

login_required

進行登陸驗證,相似於加裝飾器的功能,須要先引入,

from django.contrib.auth.decorators import login_required

顯示加了驗證的

@login_required
def index(request):
    print(request.user.is_authenticated())
    return render(request,'index.html')

 

經過加了裝飾器以後,再請求,沒有登陸的話,會顯示,須要跳轉的地址,手動修改url地址,修改成:

 

url(r'^accounts/login/', views.login),可是這樣很差,須要修改settings文件,

如今修改settings文件,仍是用原來的url路徑,
sttings文件的修改
STATIC_URL = '/static/'
LOGIN_URL='/login/'  #這裏配置成項目登陸頁面的路由,

 

 django裏的settings文件裏的中間件順序是有要求的,不能隨意更改中間件的順序,

 

 

 

註冊:

在app01文件夾下新建一個formspy文件,來使用forms組件,

from django import forms

class RegForm(forms.Form):
username=forms.CharField(
label='用戶名'

)
password=forms.CharField(
label='密碼',
widget=forms.widgets.PasswordInput() #確保密碼是密文的形式,
)

re_password=forms.CharField(
label='確認密碼',
widget=forms.widgets.PasswordInput()
)

 

 

views代碼,

def reg(request):
# 進行實例化一個對象,傳給前端,
form_obj=RegForm()
if request.method=='POST':
form_obj=RegForm(request.POST)
# 須要引入模塊,from django.contrib.auth.models import User
if form_obj.is_valid(): #進行校驗,
# 進行取值,中括號裏的內容就是forms文件裏定義的,至關於鍵值對的key
username=form_obj.cleaned_data['username']
password=form_obj.cleaned_data['password']
# 進行建立用戶,username是數據庫裏的字段,
# User.objects.create(username=username,password=password)
# 以上create是建立的密碼是明文形式,且不能用於登陸,
# create_user建立的用戶密碼是密文形式,
User.objects.create(username=username,password=password)
return render(request,'ret.html',{'form_obj':form_obj})

 

進行改進後的版本,將cleaned_data數據進行了修改,

# 改進後,在進行cleaned_data處進行改進,
def reg(request):
    # 進行實例化一個對象,傳給前端,
    form_obj=RegForm()
    if request.method=='POST':
        form_obj=RegForm(request.POST)
    # 須要引入模塊,from django.contrib.auth.models import User
        if form_obj.is_valid(): #進行校驗,
            form_obj.cleaned_data.pop('re_password')
            # 建立普通用戶,
            # User.objects.create_user(**form_obj.cleaned_data)
            # 建立超級用戶,建立超級用戶時,email是空,因此下面須要寫爲空,或者給定一個郵箱地址,
            User.objects.create_superuser(**form_obj.cleaned_data,email='')

    return render(request,'ret.html',{'form_obj':form_obj})

 

註冊後,直接跳到指定頁面,

def reg(request):
    # 進行實例化一個對象,傳給前端,
    form_obj=RegForm()
    if request.method=='POST':
        form_obj=RegForm(request.POST)
    # 須要引入模塊,from django.contrib.auth.models import User
        if form_obj.is_valid(): #進行校驗,
            form_obj.cleaned_data.pop('re_password')
            # 建立普通用戶,
            User.objects.create_user(**form_obj.cleaned_data)
            # 建立超級用戶,建立超級用戶時,email是空,因此下面須要寫爲空,或者給定一個郵箱地址,
            # User.objects.create_superuser(**form_obj.cleaned_data,email='')

            # 建立用戶後跳到登陸界面
            # return redirect('/login/')

            # 或者進行登陸驗證後跳到index界面
            obj=auth.authenticate(request,**form_obj.cleaned_data)
            auth.login(request,obj)
            return redirect('/index/')

    return render(request,'ret.html',{'form_obj':form_obj})
註冊後跳到指定頁面

 

 

 

擴展默認的auth_user表,要是使用擴展表的話,要先寫這個.

這內置的認證系統這麼好用,可是auth_user表字段都是固定的那幾個,我在項目中無法拿來直接使用啊!

好比,我想要加一個存儲用戶手機號的字段,怎麼辦?

聰明的你可能會想到新建另一張表而後經過一對一和內置的auth_user表關聯,這樣雖然能知足要求可是有沒有更好的實現方式呢?

答案是固然有了。

咱們能夠經過繼承內置的 AbstractUser 類,來定義一個本身的Model類。

這樣既能根據項目需求靈活的設計用戶表,又能使用Django強大的認證系統了。

 

這是在models文件裏寫的,

複製代碼
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用戶信息表
    """
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username
複製代碼

注意:

按上面的方式擴展了內置的auth_user表以後,必定要在settings.py中告訴Django,我如今使用我新定義的UserInfo表來作用戶認證。寫法以下:

# 引用Django自帶的User表,繼承使用時須要設置
AUTH_USER_MODEL = "app名.UserInfo"

再次注意:

一旦咱們指定了新的認證系統所使用的表,咱們就須要從新在數據庫中建立該表,而不能繼續使用原來默認的auth_user表了。

 

對應的須要做出改變:

 

 

 

 

 

 

 

 

在admin.py文件裏面添加內容,以後纔會在後臺管理裏面看到對應內容

 

 

而後在管理後臺會進行對應顯示,

相關文章
相關標籤/搜索