判断用户是否登录
效果图
当用户未登录时,逻辑上是不允许访问某些页面的。比如用户中心页面。因此就需要对某些页面做登录验证,而Django封装了这个方法。
用户中心前端页面:
<h2>用户中心</h2>
<div id="app" v-cloak>
<table>
<tr>
<td>当前登录用户:</td>
<td>{{ request.user.username }}</td>
<td><a href="/logout/">退出</a></td>
<td><a href="/info/">用户中心</a></td>
</tr>
</table>
<h2>基本信息</h2>
<table>
<tr>
<th>用户名</th>
<th>联系方式</th>
<th>邮箱</th>
</tr>
<tr>
<td>[[ username ]]</td>
<td>[[ mobile ]]</td>
<td v-if="set_email">
<input v-model="email" @blur="check_email" type="email" name="email">
<input @click="save_email" type="button" value="保 存">
<input @click="cancel_email" type="reset" value="取 消">
<span v-show="error_email">邮箱格式错误</span>
</td>
<td v-else>
<input v-model="email" type="email" name="email" readonly>
<span v-if="email_active">已验证</span>
<span v-else>待验证</span>
<input @click="save_email" :disabled="send_email_btn_disabled" type="button"
:value="send_email_tip">
</td>
</tr>
</table>
</div>
对应于此页面的VUE:
var vm = new Vue({
el:'#app',
delimiters:['[[', ']]'],
data:{
host:host,
username:username,
mobile:mobile,
email:email,
email_active:email_active,
set_email:false,
error_email:false,
error_email_message:'',
send_email_btn_disabled:false,
send_email_tip:'重新发送邮件',
},
mounted(){},
methods:{
// 检查email格式
check_email(){
// 匹配正则
var re = /^[a-z0-9][w.-]*@[a-z0-9-]+(.[a-z]{2,5}){1,2}$/;
if(re.test(this.email)){
this.error_email = false;
}
else{
this.error_email_message = '邮箱格式错误';
this.error_email = true;
return;
}
},
// 保存email
save_email(){
// 检查email格式
this.check_email();
if(this.error_email == false){
var url = this.host + '/emails/';
axios.put(url, {
email:this.email
}, {
headers:{
'X-CSRFToken':getCookie('csrftoken')
},
responseType:'json'
}).then(response=>{
if(response.data.code == '0'){
this.set_email = false;
this.send_email_btn_disabled = true;
this.send_email_tip = '已发送验证邮件';
}
else if(response.data.code == '4101'){
location.href = '/login/?next=/info/';
}
else{
this.error_email_message = response.data.errmsg;
this.error_email = true;
}
}).catch(error=>{
console.log(error.response)
});
}
},
// 取消保存email
cancel_email(){
this.email = '';
this.error_email = false;
},
}
});
从视图函数接收变量:
let username = "{{ username }}";
let mobile = "{{ mobile }}";
let email = "{{ email }}";
let email_active = "{{ email_active }}";
工具js:
// 获取cokie
function getCookie(name){
var r = document.cookie.match("\b" + name + "=([^;]*)\b");
return r ? r[1] : undefined;
}
视图函数:
class UserInfoView(LoginRequiredMixin, View):
def get(self, request):
return render(request, 'user_center_info.html')
Django的LoginRequiredMixin类中封装了验证用户登录的代码,可以直接使用。
原始代码为:# 判断是否登录 if request.user.is_authenticated: # 已登录 return render(request, 'user_center_info.html') else: # 未登录 return redirect('/login/')
还需要在配置文件中指定被拦截之后重定向的页面:
LOGIN_URL = '/login/'
登录之后返回刚才浏览的页面:
在VUE中有这样一段代码:
location.href = '/login/?next=/info/';
这里指定了登录之后,重定向的页面是“info”。
所以在登录的视图函数接收一下这个参数,重定向的页面改一下就可以了。
# 接收重定向参数
next_url = request.GET.get('next', '/')
# 有两个参数,如果有next这个参数,则返回next指定的页面,若没有,则返回“/”
...
response = redirect(next_url)
response.set_cookie('username', user.username, max_age=60 * 60 * 24 * 14)
return response