zoukankan      html  css  js  c++  java
  • auth,Django自带的用户认证

    # auth
    
    
    # --settings.py
    ...
    LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由
    AUTH_USER_MODEL = "app01.UserInfo"   # 使用的数据库,这个不是路径
    
    # --url.py
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^login/', views.login),
        url(r'^index/', views.index),
        url(r'^logout/', views.logout),
        url(r'^reg/', views.reg),
    ]
    
    
    # --models.py
    from django.db import models
    
    from django.contrib.auth.models import AbstractUser
    
    class UserInfo(AbstractUser):
        phone = models.CharField(max_length=11, )
    
    	
    #login.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
    	#以上代码告诉IE浏览器,IE8/9及以后的版本都会以最高版本IE来渲染页面
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    </head>
    <body>
    <form action="" method="post" autocomplete="off" novalidate>
        {% csrf_token %}
        <p>
            用户名:
            <input type="text" name="username">
        </p>
        <p>
            密码:
            <input type="password" name="pwd">
        </p>
        <p>
            <button>登录</button>
        </p>
        <p>
            <span>{{ error_msg }}</span>
        </p>
    </form>
    </body>
    </html>
    
    
    #reg.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    </head>
    <body>
    
    <form action="" method="post">
        {% csrf_token %}
        {{ form_obj.as_p }}   # 使用了form组件
        <button>注册</button>
    </form>
    
    </body>
    </html>
    
    # form.py
    # 创建form组件的inut标签
    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.py
    from django.shortcuts import render, HttpResponse, redirect
    from django.contrib import auth
    from django.contrib.auth.decorators import login_required
    from app01.forms import RegForm
    from django.contrib.auth.models import User,AbstractUser
    
    
    def login(request):
        error_msg = ''
        if request.method == 'POST':
            username = request.POST.get('username')  # 获取form表单的username
            pwd = request.POST.get('pwd')
            # 对提交的数据进行认证
            obj = auth.authenticate(request, username=username, password=pwd)   # 第一个username是关键字,第二个username是变量
            #authenticate提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。
    		#如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。
    		#authenticate会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
    		if obj:
                # 登录成功
                auth.login(request, obj)   # login实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。
                return redirect('/index')
            else:
                error_msg = '用户名或密码错误'
    
        # 返回一个页面让登录
        return render(request, 'login.html', {'error_msg': error_msg})
    
    
    @login_required    #login_requierd(), auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。
    def index(request):
        print(request.user.is_authenticated())
    	#is_authenticated用来判断当前请求是否通过了认证。
        return render(request, 'index.html')
    
    
    def logout(request):
    	#该函数接受一个HttpRequest对象,无返回值。
    	#当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
        auth.logout(request)
        return redirect('/login/')
    #若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。
    #如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。
    #LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由
    
    
    
    def reg(request):
        form_obj = RegForm()
        if request.method == 'POST':
            form_obj = RegForm(request.POST)
            if form_obj.is_valid():
                form_obj.cleaned_data.pop('re_password')  # 获取校验过的username password,这里pop删除了re_password
                # 创建普通用户
                User.objects.create_user(**form_obj.cleaned_data)    # form_obj.cleaned_data是字典这样的{'username': 'alexdsb', 'password': 'alex123'}    **form_obj.cleaned_data将字典打散为关键字参数
                # create_user用法 :user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)
    			# 注意:这里的User是auth表的User,如果使用了扩展表即再model.py中重写了User类并改成名字UserInfo,这时需要引用我们自己写的这个数据库,使用下面代码 
               # from app01.models import UserInfo   
                # UserInfo.objects.create_user(**form_obj.cleaned_data)
    			
    			#创建超级用户,这里需要写email
    			# User.objects.create_superuser(**form_obj.cleaned_data,email='')
                # return redirect('/login/')
    			
    			#认证用户,login写入session,相当于注册后自动登录了
                obj = auth.authenticate(request, **form_obj.cleaned_data)
                auth.login(request, obj)
                return redirect('/index/')
    
        return render(request, 'reg.html', {'form_obj': form_obj})
    
    	
    	
    
    
    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. 扩展表写在models.py中,添加其他字段
    		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表,继承使用时需要设置,在settings中添加
    		AUTH_USER_MODEL = "app名.UserInfo"
    		
    

      

     

    check_password(password)
    #auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。密码正确返回True,否则返回False
    用法:(常用在修改密码时再次确认密码)
    from django.contrib.auth.models import User
    user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
    
    
    set_password(password)
    auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。
    注意:设置完一定要调用用户对象的save方法!!!
    用法:
    user.set_password(password='')
    user.save()
    
    一个修改密码功能的简单示例
    @login_required
    def set_password(request):
        user = request.user
        err_msg = ''
        if request.method == 'POST':
            old_password = request.POST.get('old_password', '')
            new_password = request.POST.get('new_password', '')
            repeat_password = request.POST.get('repeat_password', '')
            # 检查旧密码是否正确
            if user.check_password(old_password):
                if not new_password:
                    err_msg = '新密码不能为空'
                elif new_password != repeat_password:
                    err_msg = '两次密码不一致'
                else:
                    user.set_password(new_password)
                    user.save()
                    return redirect("/login/")
            else:
                err_msg = '原密码输入错误'
        content = {
            'err_msg': err_msg,
        }
        return render(request, 'set_password.html', content)
    
    User对象的属性
    User对象属性:username, password
    is_staff : 用户是否拥有网站的管理权限.
    is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录
    

      

  • 相关阅读:
    PHP实现简易的模板引擎
    三种实现PHP伪静态页面的方法
    转 php简单伪静态实例
    Function mysql_db_query() is deprecated 错误解决
    PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)--续
    PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
    mysql添加DATETIME类型字段导致Invalid default value错误的问题
    ASP程序中调用Now()总显示“上午”和“下午”,如何解决?
    解决程序开发中时间格式不对造成的问题
    “隐藏已知文件类型的扩展名”选项失败问题
  • 原文地址:https://www.cnblogs.com/perfey/p/9703745.html
Copyright © 2011-2022 走看看