django-认证

官网链接

https://docs.djangoproject.com/zh-hans/2.2/topics/auth/default/

https://docs.djangoproject.com/zh-hans/2.2/ref/contrib/auth/#django.contrib.auth.models.User

 

一 user对象

 创建普通用户

使用 create_user() 方法

 

from django.contrib.auth.models import User
user = User.objects.create_user('用户名','邮箱','密码')
user.save()

 

创建超级用户

python manage.py createsuperuser 

 

更改密码

使用 set_password()方法

from django.contrib.auth.models import User
user = User.objects.get(username='wangys')
user
<User: wangys>
user.set_password('新密码')
user.save()

 

验证用户

  • authenticate
  • 认证失败返回 None
  • 认证成功返回user对象

 

from django.contrib import auth
user = auth.authenticate(username='wangys',password='123456')
print(user)
None
user = auth.authenticate(username='wangys',password='654321')
print(user)
wangys

 

保持用户会话(session)

  • login方法

 

路由

from django.contrib import admin
from django.urls import path
from app1 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login), # 登陆
    path('index/', views.index), # 首页
]

 

form表单

from django import forms

class LoginFrom(forms.Form):
    username = forms.CharField(max_length=32,label='用户名')
    password = forms.CharField(max_length=16,label='密码')

 

视图

from django.shortcuts import render,redirect
from django.http import JsonResponse
from .forms import LoginFrom
from django.contrib import auth
# Create your views here.


def login(request):
    # POST请求
    if request.method == 'POST':
        loginform = LoginFrom(request.POST)
        # 如果表单数据有效
        if loginform.is_valid():
            username = loginform.cleaned_data['username']
            password = loginform.cleaned_data['password']
            # 认证
            user = auth.authenticate(username=username,password=password)
            if user:
                # 保持会话,将user对象做为request.user属性
                auth.login(request,user)
                return  redirect('/index/')
    # GET请求
    else:
        loginform = LoginFrom()
    return render(request,'login.html',{ 'loginform': loginform })


def index(request):
    user = request.user
    return JsonResponse({'view': 'index','user': user.username})

  

模板

login.html

<body>
<form action="/login/" method="post">
    {% csrf_token %}
    {% for field in loginform %}
        <div class="c1" >
            <label for="{{ field.id_for_label }}">{{ field.label }}</label>
            {{ field }} {{ field.errors.0 }}
        </div>
    {% endfor %}
    <input type="submit" value="提交">
</form>
</body>

 

注销

  • django.contrib.auth.logout()方法
  • 参数为HttpRequest对象
  • 会将当前用户的会话数据全部清除

 

from django.shortcuts import redirect
from django.contrib import auth

def logout(request):
    auth.logout(request)
    return redirect('/login/')

 

限制未登录用户访问

限制访问的方式有很多

 

login_required装饰器

  • login_required(redirect_field_name='next',login_url=None)
  • 如果认证失败,我们需要制定登陆url,需要指定如下
  • 如果不想在每个视图上指定,我们可以在setting文件中指定全局的 LOGIN_URL
from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')
def index(request):
    user = request.user
    return render(request,'index.html')

 

 

 

二: 扩展user表

 

扩展方式有很多

 

继承的方法

  • django.contrib.auth.models.AbstractUser
  • 所有牵扯到User表的用自定义表代替就可以了  该对象其他方法都可以直接用

 

model

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.


class UserInfo(AbstractUser):

    phone = models.CharField(max_length=32)
    address = models.CharField(max_length=128)

 

setting的配置

AUTH_USER_MODEL = 'app名称.自定义用户表'

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-09-22 18:52  择一事,终一生  阅读(98)  评论(0)    收藏  举报