经典案例:Django登录、退出登录、登陆后才能访问某方法

登录方法:
1、views.py文件:
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponse
from django.shortcuts import render, redirect
from front.forms import LoginForm
from django.contrib.auth.decorators import login_required


def my_login(request):
    # 如果是GET方法,渲染到登录页面,如果是POST方法,进行登录判断
    if request.method == 'GET':
        return render(request, 'front/index.html')
    else:
        form = LoginForm(request.POST)
        if form.is_valid():
            telephone = form.cleaned_data.get('telephone')
            password = form.cleaned_data.get('password')
            remember = form.cleaned_data.get('remember')
            # 验证账号密码是否正确
            user = authenticate(request, username=telephone, password=password)
            if user is not None:
                # 判断用户是否被冰冻
                if user.is_active:
                    login(request, user)
                    # 判断是否记住密码
                    if remember:
                        # 设置为None,则表示使用全局的过期时间
                        request.session.set_expiry(None)
                    else:
                        # 设置浏览器关闭之后就过期
                        request.session.set_expiry(0)
                        # 这里的设置网址有next后缀的处理方法
                        next_url = request.GET.get('next')
                        if next_url:
                            # 重定向到设置好的登录页面
                            return redirect(next_url)
                        else:
                            return HttpResponse("登录成功!")

                        return HttpResponse("登录成功!")
                else:
                    return HttpResponse("用户已冰冻!")
            else:
                return HttpResponse("用户名或密码错误!")
        else:
            return HttpResponse("登录失败!")

2、新建forms.py文件:
from django.contrib.auth import get_user_model
from django import forms  # 注意导入的是django下的forms

class LoginForm(forms.ModelForm):
    telephone = forms.CharField(max_length=11)
    remeber = forms.IntegerField(required=False)
    class Meta:
        model = get_user_model()
        fields = ['password']

3、新建index.html,登录页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <link rel="stylesheet" href="{% static 'index.css' %}">
</head>
<body>
<form action="" method="post">
    设置权限,否则页面无法提交数据
    <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
    用户名:<input type="text", name="telephone">
    密  码:<input type="password" name="password">
    记住我:<input type="checkbox" name="remember" value="1">
    <input type="submit" value="登录">
</form>
</body>
</html>
2、退出登录方法
def my_logout(request):
    logout(request)
    return HttpResponse("退出登录成功!")


3、有时候,某个视图函数是需要经过登录后才能访问的。那么我们可以通过login_required装饰器来实现。
# 在验证失败后,会跳转到/accounts/login/路由。
# (需要修改为自己的登录页面@login_required(login_url='/login/'))
@login_required(login_url='/login/')
def profile(request):
    return HttpResponse("这是个人中心,只有登陆后才能看到!")
urls.py文件:
urlpatterns = [

    path('index/', views.index),
    path('login/', views.my_login),
    path('logout/', views.my_logout, name='logout'),
    path('profile/', views.profile, name='profile'),

]

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值