8.用户认证组件-创新互联
                                            1.用户认证
1.1auth模块
from django.contrib import auth
这个模块中提供了许多方法1.1.1authenticate()
user = authenticate(username='someone',password='somepassword')
验证用户名与密码是否正确,一般需要username和password两个关键字参数。
认证通过,返回值是一个User对象。用户名或密码不正确,返回None。
用户名和密码正确
    user.is_authenticated=True
    user.is_anonymous=false
authenticate()会在User对象上设置一个属性,标识后端认证了该用户,而且该属性在后面的登录过程中也是需要的。
如果我们直接从数据库中使用filter()取出User对象(不使用authenticate()方法获取User对象),是不能使用的。1.1.2login(HttpRequest,user)
该函数接受一个HttpRequest对象和通过authenticate()验证过的User对象。
该函数使用django的session框架给已经认证的用户加上session id等信息
from django.contrib.auth import authenticate, login
def my_view(request):
  username = request.POST['username']
  password = request.POST['password']
  user = authenticate(username=username, password=password)
  if user is not None:
    login(request, user)
    # Redirect to a success page.
    ...
  else:
    # Return an 'invalid login' error message.
    ...1.1.3logout(request)注销用户
from django.contrib.auth import logout
def logout_view(request):
  logout(request)
  # Redirect to a success page.
该函数接受一个HttpRequest对象,没有返回值。
当调用该函数时,当前请求的session信息会被全部删除。
该用户即使没有登陆,使用该函数也不会报错。1.2User对象
User对象属性:username,password(用hash算法保存到数据库中)1.2.1user.is_authenticated
检查用户是否suthenticate验证过。
user = auth.authenticate(username=user,password=pwd)
print(user.is_authenticated)
print(user.is_anonymous)
用户名和密码正确,
    user.is_authenticated=True,
    user.is_anonymous=False要求:
1.用户登录后,才能访问其他页面
2.如果没有登陆,就跳转到登录页面
3.用户在登录页面登录后,自动跳转到之前访问的地址
方法一:
def index(request):
# 没有登陆过,第一次访问index页面,request.user状况如下
    print(request.user) # AnonymousUser
    print(request.user.is_anonymous) # true
    print(request.user.is_authenticated) # false
    # 如果用户登录成功,is_authenticated会返回true,request.user.is_anonymous返回false
    if request.user.is_authenticated:
        return render(request,"index.html")
    else:
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
                # /login/登录成功后,可以在login中通过return redirect(request.GET.get("next", "/index/"))会重定向到/index/
                #request.GET.get("next", "/index/")是如果没有next这个key,设置默认值为/index/
方法二:
# 使用这个装饰器,就不需要像index方法那样,手动判断用户是否登录了。
# 如果用户没有登陆,自动跳转到settings.py中配置的LOGIN_URL路径。此时url为http://127.0.0.1:8000/login/?next=/order/
# /login/登录成功后,可以在login中通过return redirect(request.GET.get("next", "/index/"))会重定向到/order/
@login_required
def order(request):
    return HttpResponse("order")
settings.py中配置
LOGIN_URL = "/login/"1.2.2创建用户
from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')1.2.3user.check_password()
当用户修改密码的时候,要让用户输入旧密码,验证输入的旧密码正确,才允许修改密码。
输入的旧密码正确,返回True,否则返回false。1.2.4修改密码
user = request.user
user.set_password(new_password)
user.save1.2.5简单示例
"注册"
def sign_up(request):
    state = None
    if request.method == 'POST':
        password = request.POST.get('password', '')
        repeat_password = request.POST.get('repeat_password', '')
        email=request.POST.get('email', '')
        username = request.POST.get('username', '')
        if User.objects.filter(username=username):
                state = 'user_exist'
        else:
                new_user = User.objects.create_user(username=username, password=password,email=email)
                return redirect('/book/')
    content = {
        'state': state,
        'user': None,
    }
    return render(request, 'sign_up.html', content)"修改密码"
@login_required
def set_password(request):
    user = request.user
    state = None
    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:
                state = 'empty'
            elif new_password != repeat_password:
                state = 'repeat_error'
            else:
                user.set_password(new_password)
                user.save()
                return redirect("/log_in/")
        else:
            state = 'password_error'
    content = {
        'user': user,
        'state': state,
    }
    return render(request, 'set_password.html', content)1.3完整小案例
views.py
为潮南等地区用户提供了全套网页设计制作服务,及潮南网站建设行业解决方案。主营业务为成都做网站、网站制作、潮南网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        # 验证用户名和密码是否正确,如果正确,返回user对象
        user = auth.authenticate(username=user,password=pwd)
        if user:
            auth.login(request, user)
                        # 用户在登录页面登录后,自动跳转到之前访问的地址
            # 如果当前访问/order/,会跳转到login,此时url中为http://127.0.0.1:8000/login/?next=/order/
            # 所以可以通过request.GET.get("next", "/index/")获取刚刚访问的路径,
            # 如果当前直接访问的是login,则为http://127.0.0.1:8000/login/,访问成功后,跳转到/index/
            next_url = request.GET.get("next", "/index/")
            return redirect(next_url)
    # get请求时,返回login页面
    return render(request, "login.html")
def index(request):
    # 如果用户登录成功,is_authenticated会返回true,request.user.is_anonymous返回false
    if request.user.is_authenticated:
        return render(request,"index.html")
    else:
        return redirect("/login/")
# 使用这个装饰器,就不需要像index方法那样,手动判断用户是否登录了。
# 如果用户没有登陆,自动跳转到settings.py中配置的LOGIN_URL路径。
@login_required
def order(request):
    return HttpResponse("order")
def logout(request):
    auth.logout(request)
def reg(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        user = User.objects.create_user(username=user, password=pwd)
        return redirect("/login/")
    return render(request, "reg.html")settings.py
LOGIN_URL = "/login/"login.html
    
    Title 
reg.html
    
    Title 
index.html
    
    
     
     
{#后端返回request对象,在前段获取用户名#}
当前用户{{ request.user.username }}
注销
"首先注册账户,访问reg"

"login"
"登录成功"
"完整项目查看本人的git哦!!!!!!"另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
本文题目:8.用户认证组件-创新互联
标题来源:http://www.scyingshan.cn/article/pgeod.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 
