用户登陆与注销登陆
修改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>