python学习-Django8、Session、登陆与注销、注册

Django关于Session配置手册

用户登陆与注销登陆

修改views.py中login函数

def login(request: HttpRequest) -> HttpResponse:
	 hint = ''
	 if request.method == 'POST':
		 username = request.POST.get('username')
		 password = request.POST.get('password')
		 if username and password:
			 password = gen_md5_digest(password)
			 user = User.objects.filter(username=username,password=password).first()
			 if user:
				 request.session['userid'] = user.no            #登陆成功,服务器session将存入客户编号
				 request.session['username'] = user.username    #服务器session存入客户名字
				 return redirect('/')                           #登陆成功,重定向到首页
			else:        
 				hint = '用户名或密码错误'
 		else:
			 hint = '请输入有效的用户名和密码'
	return render(request, 'login.html', {'hint': hint})





修改subjects.html(首页)

    <div id="container">
    <div class="user">
        {% if request.session.userid %}                      //加入分支结构
            <span>{{ request.session.username }}</span>      //如果不为空,则拿到用户的名称,显示在前端
            <a href="/logout/">注销</a>                      //添加logout为方便注销登陆
        {% else %}
        <a href="/login/">用户登录</a>
        {% endif %}
        <a href="/register/">快速注册</a>
    </div>
##做完此步用户可直接登陆成功,下面在比对验证码






修改get_captcha函数

def get_captcha(request: HttpResponse) ->HttpResponse:
    captcha_text = gen_code()
    request.session['captcha'] = captcha_text.lower()         #将生成的验证码存入session中,小写
    image_data = Captcha.instance().generate(captcha_text)
    return HttpResponse(image_data,content_type='image/png')






修改login函数

def login(request: HttpResponse) -> HttpResponse:
    hint = ''
    if request.method == 'POST':
        captcha_from_serv = request.session.get('captcha','0')       #从session中拿验证码
        captcha_from_user = request.POST.get('captcha','1').lower()  #从请求中拿验证码,小写
        if captcha_from_serv == captcha_from_user:                   #比对验证码
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username and password:
                password = gen_md5_digest(password)
                user = User.objects.filter(username=username,password=password).first()
                if user:
                    request.session['userid'] = user.no
                    request.session['username'] = user.username
                    return redirect('/')
                else:
                    hint = '用户名或密码错误'
            else:
                hint = '用户名密码不能为空'
        else:
            hint = '请输入正确的验证码'
    return render(request,'login.html',{'hint':hint})
#先判断请求,在比对验证码,在判断用户名和密码,登陆成功存储客户信息






注销登陆(在views.py中添加函数)
def logout(request:HttpResponse) ->HttpResponse:
	 #注销
    request.session.flush()          #session.flush()方法为清洗session数据
    return redirect('/')







添加注销到urls.py中
path('logout/',logout),         #注意需要导入





#Session默认存活两周,关闭浏览器不会注销,可以更改Django配置文件来修改Session存活
SESSION_EXPIRE_AT_BROWSER_CLOSE = True    #默认Flase,改为True为关闭浏览器则注销登陆
SESSION_COOKIE_AGE = 86400                #存活为1天,默认为120900(秒)为两周
详情在Django官网可查看

让登陆过后的用户才可以进行投票

修改views.py中praisa_or_criticize函数(加上分支结构)
def praise_or_criticize(request: HttpResponse)  ->HttpResponse:
    if request.session.get('userid'):                    #判断userid是否为空
        try:
            tno = request.GET.get('tno')
            teacher = Teacher.objects.get(no=tno)
            if request.path.startswith('/praise/'):
                teacher.gcount += 1
                count = teacher.gcount
            else:
                teacher.bcount += 1
                count = teacher.bcount
            teacher.save()
            data = {'code':20000,'mesg':'投票成功','count':count}

        except (ValueError,Teacher.DoesNotExist):
            data = {'code':20001,'mesg':'投票失败'}
    else:
        data = {'code':20002,'mesg':'请先登陆'}       #如果为空返回json串
    return JsonResponse(data)



修改teachers.html(中js代码)

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    $('.comment>a').on('click',(evt) => {
        evt.preventDefault()
        let url = $(evt.target).attr('href')
        $.getJSON(url,(json) => {
            if (json.code === 20000) {
                $(evt.target).next().text(json.count)
            }else {
                alert(json.mesg)
                if (json.code === 20002){               //如果code为20002则跳转登陆页面
                    location.href = '/login/'
                }
            }
        })
    })
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值