9.Django之登陸註冊驗證登出

Alpaca_發表於2018-05-21
該文章僅供學習,如有錯誤,歡迎指出

最近自己的部落格網站也快完成了,學了好久的bootstrap,之後我會把自己寫bootstrap的一些模組貼上來

一個開放的網站當然不僅僅只是單個使用者訪問,也不是單個使用者可以使用,我們需要容納更多的使用者來體驗的網站

但是!

為了網站的一定安全,我們需要使用者來登陸我們的網站,讓管理員能夠記錄並進行適當的管理

Django很好的為我們設計了一個自帶的User使用者

建立超級使用者!

有一定基礎的人一定知道,Django自帶一個後臺管理系統admin,而要進入這個系統,首先我們需要建立一個超級管理員使用者

python manage.py createsuperuser 
複製程式碼

之後在瀏覽器位址列中輸入http://127.0.0.1:8000/admin 就可以訪問自己的後臺管理系統

建立使用者

Django內建了一個User

models.py

from django.contrib.auth.models import User
# Create your models here.
class Users(User):
    name = models.CharField(max_length=20)  #可以自己再新增其他的欄位
    message =  models.CharField(max_length=20)
    emails = models.EmailField(default=0)
複製程式碼
再次進入後臺管理系統的時候我們會發現

9.Django之登陸註冊驗證登出

這裡有兩種使用者

很顯然上面的是我們應用程式下面的使用者, 下面的是超級使用者管理

9.Django之登陸註冊驗證登出

但應用程式下的用在手動增加時出現了於超級使用者同樣的介面

9.Django之登陸註冊驗證登出

勾選這個,即立刻變身成為超級使用者

9.Django之登陸註冊驗證登出

勾選這個,即立刻可以登陸後臺管理系統

9.Django之登陸註冊驗證登出

這個其實就是,你可以在你的系統下建立多個超級使用者並且讓他管理這個站點,但是某段時間你不想讓他再來管理這個站點,你就可以將這個有效勾去並儲存,該使用者在你下次勾選之前即使有了其他的特權也無法進入該站點

報錯原因

很多人會發現自己在後臺手動新增的使用者登不上去,其實不難發現的是

9.Django之登陸註冊驗證登出

這裡的密碼加密無法識別,你只需要修改密碼就可以完全加密了。也可以實現功能了

登陸

9.Django之登陸註冊驗證登出

這是我的目錄

from django.shortcuts import render
from django.contrib.auth.models import  auth
from django.contrib.auth import authenticate,login,logout

# Create your views here.



def auth_test(request):
    if request.method =="POST":
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request,username=username,password=password)
        if user is not None:
            login(request,user)
            return render(request,'polls/load.html')
        else:
            print("登陸錯誤")
            return render(request,'polls/index.html')
    else:
        return  render(request,"polls/index.html")

def index(request):
    return  render(request,'polls/index.html')
複製程式碼

Django自帶了登陸、註冊、驗證、登出等功能

我們只需要引入 django.contrib.auth下的模組

同樣的我們之前在管理平臺下注冊的使用者可以在這裡實現登陸的功能

註冊的問題

之前我們做了一遍在後臺管理系統下注冊的功能,但是使用者註冊當然不可能進入後臺去註冊,那隻能作為後臺管理員做的工作

那麼我們在自己的Template下佈置一個註冊頁面

/views.py


from django.shortcuts import render
from django.contrib.auth.models import  auth
from django.contrib.auth import authenticate,login,logout
from django.contrib.auth.hashers import make_password
from .models import Users
def auth_inload(request):
   # user_zhuce = Users.objects.all()
    #print(user_zhuce)
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        email = request.POST['email']
        password = make_password(password) # 將密碼轉換成為雜湊法加密
        Users.objects.create( username = username  ,password=password,name=username,message=password,emails=email)  #用我們自己定義的Users去建立一個
        contact = {
            'alert': username+password+email
        }
        return  render(request,'polls/index.html',context=contact)
    else:
        return  render(request,'polls/inload.html')
複製程式碼

我們自己寫的Users是繼承至User的,因此他可以使用User裡面的內容,我們ctrl+左鍵進去看看他有什麼

class User(AbstractUser):
    """
    Users within the Django authentication system are represented by this
    model.

    Username, password and email are required. Other fields are optional.
    """
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'
複製程式碼

他繼承至AbstractUser

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    """
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    email = models.EmailField(_('email address'), blank=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        abstract = True

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    def get_full_name(self):
        """
        Return the first_name plus the last_name, with a space in between.
        """
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        """Return the short name for the user."""
        return self.first_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        """Send an email to this user."""
        send_mail(subject, message, from_email, [self.email], **kwargs)
複製程式碼

很顯然,他的原始碼裡面有各種定義,其中username就是我們的使用者名稱,password是我們密碼,is_active就是我們之前的是否活躍 is_staff就是我們的是否為職員,可不可以登陸我們的後臺管理系統等等

總結:

我們只需要在前臺使用者輸入自己先要註冊的賬號密碼郵箱以及其他的內容(自定義),使用post傳到後臺,後臺獲取相應資料使用模型類users儲存到為一個使用者,那麼這個使用者就會進入到我們的系統中。

小結:

關於django使用者登陸驗證等等的外掛還有好多,像django-allauth等,之後會陸續補上,在這裡先立個flag哈哈哈哈!

相關文章