Django 判断用户是否登录

判断用户是否登录

效果图

当用户未登录时,逻辑上是不允许访问某些页面的。比如用户中心页面。因此就需要对某些页面做登录验证,而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

源码

原文地址:https://www.cnblogs.com/junsircoding/p/15665126.html