前提
from django.contrib.auth.models import User from django.contrib import auth
auth_user
其中auth_user为django框架为我们提供用于存储登录用户和密码等信息的用户表,在我们使用此django认证系统时,必须使用此表,不可以另外创建用户表,且表中的内容不可以直接在表中添加,因为其存储密码为加密的的字符串。其中username和password字段是必须存入内容的字段。auth_user表格添加数据两种方式如下:
方式一:(通过如下的命令添加超级用户信息)
pyhton3 manage.py createsuperuser # 其中username和password字段是必须存入内容的字段。
方式二:
通过create_user()或者create_superuser()(与上述创建超级用户效果一样)方法添加用户信息,如下注册用户函数的应用实例:
def register(request): if request.method=="POST": username=request.POST.get("username") userpswd1=request.POST.get("userpswd1") userpswd2=request.POST.get("userpswd2") if userpswd1==userpswd2: User.objects.create_user(username=username,password=userpswd1) #username和password为User表的关键字段 return redirect("/login/")
注意点:
author模块方法
authenticate()
提供了用户认证,即验证用户名以及密码是否正确,一般需要username password两个关键字参数,如果认证信息有效,会返回一个 user 对象。具体使用见如下登录函数实例:
这里的pwd会经过加密再去数据库判断所以存在数据库的密码是加密后的密码
from django.shortcuts import render,redirect from django.contrib import auth def log_in(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") # username,password是auth_user表的字段名 # user,pwd 是用户填写的数据 # 验证成功,返回user对象 user = auth.authenticate(username=user,password=pwd) if user: # 登陆成功 # sesson写操作 相当于request.session["user"]=user.username auth.login(request,user) # 需要传2个参数,request,和当前用户对象 return redirect("/index/") return render(request,"login.html")
login(HttpRequest, user)
该函数接受一个HttpRequest对象,以及一个认证了的user对象,此函数使用django的session框架给某个已认证的用户附加上session id等信息。即上述登录实例中设置session用法。
logout(request)
该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。如下注销当前登录用户的session实例:
def login_out(request): auth.logout(request) # 清除当前登录用户的session,相当于request.session.flush() return redirect("/login/")
user对象方法
is_authenticated()
返回值为bool值,主要用于判断user对象是否完成登录验证,如用在要求用户登录以后才能访问某些网址,否则跳转到登录页面完成登录。见如下页面函数访问前的验证实例:(登录验证有两种方式
# 登陆成功跳转 def index(request): # 加验证,需要登陆 print(request.user) # jassin 取到当前的用户名 print(type(request.user) ) # user是一个对象<class 'django.utils.functional.SimpleLazyObject'> # 方法1:验证有没有登陆 # if not request.user.id: # 为空:没有用户登陆 # return redirect("/login/") # 方法二:返回fool值 user = request.user if not user.is_authenticated()d(): return redirect("/login/") return render(request,"index.html",locals())
set_password()
使用 set_password() 来修改密码,见如下修改密码函数实例:
def modify(request): if request.method=="POST": username=request.POST.get("username") pre_userpswd=request.POST.get("pre_userpswd") new_userpswd=request.POST.get("new_userpswd") user=auth.authenticate(username=username,password=pre_userpswd) if user: user.set_password(new_userpswd) user.save() return redirect("/login/")
create_user
创建新用户,注册(数据库)
实例
from django.contrib.auth.models import User # 创建用户,注册 # 注意点:存的时候,会先将密码加密后再存到数据库 def reg(request): User.objects.create_user(username="lishi",password="1220")
Django常用命令
在django框架中常用的命令总结如下,注以下命令是在终端执行:
# 查看django版本
python -m django --version
# 创建项目,名为mysite
django-admin startproject mysite
# Django项目环境终端
python manage.py shell
# 创建应用程序,确保和 manage.py 是同一目录
python manage.py startapp app01
# 启动django
python manage.py runserver
python manage.py runserver 8080
python manage.py runserver 0.0.0.0:8000
# 数据库迁移
python manage.py makemigrations
python manage.py migrate
# 同步数据库
python manage.py syncdb
# 清空数据库(保留空表)
python manage.py flush
# 认证User表创建超级用户
python manage.py createsuperuser
# 修改用户密码
python manage.py changepassword username
small demo(每个人都能进入index页面,看到的主页不同)
views.py
from django.shortcuts import render,redirect from django.contrib import auth from django.contrib.auth.models import User def log_in(request): if request.method == "POST": print("=================") user = request.POST.get("user") pwd = request.POST.get("pwd") # username,password是auth_user表的字段名 # user,pwd 是用户填写的数据 # 验证成功,返回user对象, 否则返回None user = auth.authenticate(username=user,password=pwd) if user: # 登陆成功 # sesson写操作 相当于request.session["user"]=user.username auth.login(request,user) # 需要传2个参数,request,和当前用户对象 return redirect("/index/") else: return redirect("/index/") return render(request,"login.html") # 登陆成功跳转 def index(request): # 加验证,需要登陆 print(request.user) # jassin 取到当前的用户名 print(type(request.user) ) # user是一个对象<class 'django.utils.functional.SimpleLazyObject'> # 方法1:验证有没有登陆 # if not request.user.id: # 为空:没有用户登陆 # return redirect("/login/") # 方法二:返回fool值 # user = request.user # if not user.is_authenticated(): # return redirect("/login/") return render(request,"index.html",locals()) #注销 def log_out(request): auth.logout(request) return redirect("/login/") # 需要导入from django.contrib.auth.models import User # 创建用户,注册 # 注意点:存的时候,会先将密码加密后再存到数据库 def reg(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") User.objects.create_user(username=user,password=pwd) return redirect("/login/") return render(request,"reg.html") # 修改密码 def modify(request): if request.method == "POST": user = request.POST.get("user") pre_pwd = request.POST.get("pre_pwd") new_pwd = request.POST.get("new_pwd") user = auth.authenticate(username=user,password=pre_pwd) if user:# 符合原来用户的密码 user.set_password(new_pwd) user.save() return redirect("/login/")
修改页面:mdify.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> </head> <body> <form action="modify.html" method="post"> {% csrf_token %} <p>用户名 <input type="text" name="user"></p> <p>密码 <input type="password" name="pwd"></p> <input type="submit"> <a href="/login/">确定</a> </form> </body> </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> <h3>this is INDEX </h3> <p>hello {{ user }}</p> {% if request.user.is_authenticated %} <a href="/logout/">注销</a> <a href="/modify/">修改密码</a> <h3>hell {{ request.user.username }}</h3> {% else %} <a href="/login/">登陆</a> <a href="/reg/">注册</a> {% endif %} </body> </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> </head> <body> <form action="login.html" method="post"> {% csrf_token %} <p>用户名 <input type="text" name="user"></p> <p>密码 <input type="password" name="pwd"></p> <input type="submit"> <button><a href="/reg/">注册</a></button> </form> </body> </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> </head> <body> <h4>注册新用户页面</h4> <form action="reg.html/" method="post"> {% csrf_token %} <p>用户名 <input type="text" name="user"></p> <p>密码 <input type="password" name="pwd"></p> <input type="submit"> </form> </body> </html>