Django 用戶認證

內置用戶認證

django 的用戶分爲三類,匿名用戶,普通用戶,超級用戶html

    1. 普通用戶是沒法登陸admin 後臺的的,所以咱們的普通視圖使用這個用戶來管理python

    1. 超級用戶是最高權限,能夠登陸admin後臺,能夠使用python manage.py createsuperuser 來建立一個超級用戶django

    內置用戶類型

    1. 匿名用戶.dom

    2. 普通類型post

      普通用戶是沒法登陸admin 後臺的的,所以咱們的普通視圖使用這個用戶來管理
      def create_user(self, username, email=None, password=None, **extra_fields):
          extra_fields.setdefault('is_staff', False)
          extra_fields.setdefault('is_superuser', False)
          return self._create_user(username, email, password, **extra_fields)
    3. 超級用戶ui

      超級用戶是最高權限,能夠登陸admin後臺,能夠使用python manage.py createsuperuser 來建立一個超級用戶
      def create_superuser(self, username, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

    用戶認證模式 -1: 用戶名

    1. 咱們在用戶註冊界面使用的是用戶名稱url

    2. 使用內值的form from django.contrib.auth.forms import UserCreationFormcode

    3. 建立對應的模板文件signup.htmlorm

      <h2>Sign up</h2>
         <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Sign up</button>
       </form>
      1. :views.pycsrf

        def signup(request):
        """
        使用用戶名來註冊
        :param request:
        :return:
        """
        if request.method == 'POST':
            form = UserCreationForm(request.POST)
            if form.is_valid():
                form.save()
                username = form.cleaned_data.get('username')
                raw_password = form.cleaned_data.get('password1')
                user = authenticate(username=username, password=raw_password)
                login(request, user)
                return redirect('article-list')
        else:
            form = UserCreationForm()
        return render(request, 'pre_user/signup.html', {'form': form})
    4. 截圖以下

    用戶認證模式2: 有附加字段

    在某些特殊狀況下咱們可能會在用戶註冊的時候須要輸入生日這個樣子的字段,可是User 並不包含該字段,所以咱們須要擴展User 模型
    1. models.py

      class Profile(models.Model):
         """  多餘字段註冊 """
         user = models.OneToOneField(User, on_delete=models.CASCADE)
         bio = models.TextField(max_length=500, blank=True)
         location = models.CharField(max_length=30, blank=True)
         birth_date = models.DateField(null=True, blank=True)
      
      
      
      @receiver(post_save, sender=User)
      def update_user_profile(sender, instance, created, **kwargs):
        if created:  
            Profile.objects.create(user=instance)
        instance.profile.save()
    1. forms.py

      class SignUpForm(UserCreationForm):
          birth_date = forms.DateField(help_text='Required. Format: YYYY-MM-DD')
          class Meta:
              model = User
              fields = ('username', 'birth_date', 'password1', 'password2', )
    1. views.py

    1. django.contrib.auth import login, authenticate

    2. django.shortcuts import render, redirect

    3. pre_user.forms import SignUpForm

    4. signup(request):
      if request.method == 'POST':

      form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save()
            user.refresh_from_db()  # load the profile instance created by the signal
            user.profile.birth_date = form.cleaned_data.get('birth_date')
            user.save()
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            login(request, user)
            return redirect('article-list')

      else:

      form = SignUpForm()

      return render(request, 'pre_user/signup.html', {'form': form})

    4 . 模板文件不須要修改

    1. 截圖

    用戶認證模式2: 郵箱註冊

    這是最多見的用戶註冊模式
    1. 擴展用戶建立的forms.py

    class SignUpForm(UserCreationForm):
        """ 使用郵箱註冊"""
        email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')
    
        class Meta:
            model = User
            fields = ('username', 'email', 'password1', 'password2', )
    1. views.py

    (1) 註冊視圖

    def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            current_site = get_current_site(request)
            subject = 'Activate Your MySite Account'
            message = render_to_string('pre_user/account_activation_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user),
            })
            # user.email_user(subject, message) # 給該用戶發送郵件
            user.email_user(subject=subject, message='message',html_message=message) # 給該用戶發送郵件
            return redirect('account_activation_sent')
            # return HttpResponse("郵箱已經發送,請前往驗證")
    
    else:
        form = SignUpForm()
    return render(request, 'pre_user/signup.html', {'form': form})

    (2) 用戶激活郵箱

    def activate(request, uidb64, token):
        try:
            uid = force_text(urlsafe_base64_decode(uidb64))
            user = User.objects.get(pk=uid)
        except (TypeError, ValueError, OverflowError, User.DoesNotExist):
            user = None
    
        if user is not None and account_activation_token.check_token(user, token):
            user.is_active = True
            user.profile.email_confirmed = True
            user.save()
            login(request, user)
            return redirect('article-list')
        else:
            return render(request, 'pre_user/account_activation_invalid.html')

    (3) 註冊連接
    urls.py

    urlpatterns = [
        url(r'^signup/$', views.signup),
        url(r'^login/$', auth_views.login,
            {'template_name': 'pre_user/login.html', 'authentication_form': LoginForm}),
        url(r'^activate/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
            views.activate, name='activate'),
    url(r'^account_activation_sent/$', views.account_activation_sent, name='account_activation_sent'),
    
    ]

    (4)模板
    account_activation_email.html

    {% extends 'pre_user/base.html' %}
    
    {% block content %}
    
        <div class="container">
            <div class="row">
                <div class="jumbotron">
                    {% autoescape off %}
                        Hi {{ user.username }},
    
                        Please click on the link below to confirm your registration:
    
                        http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
                    {% endautoescape %}
                </div>
            </div>
        </div>
    {% endblock %}

    account_activation_sent.html

    {% extends 'pre_user/base.html' %}
    
    {% block content %}
    
        <div class="container">
            <div class="row">
                <div class="jumbotron">
                郵件已經發送
                              </div>
            </div>
        </div>
    {% endblock %}

    account_activation_invalid.html

    {% extends 'pre_user/base.html' %}
    
    {% block content %}
    
       <div class="container">
           <div class="row">
               <div class="jumbotron">
                              
                              郵件格式不合法
           </div>
       </div>
    {% endblock %}
    相關文章
    相關標籤/搜索