zoukankan      html  css  js  c++  java
  • 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
    

    源码

  • 相关阅读:
    SQL Server之4:游标原理和使用方法
    .Net MVC3之2:前台异步获取json数据的实例(2)
    通过url读取页面内容
    SharePoint 在页面查看错误信息
    添加列表时修改Title字段报错
    滚动新闻
    视频列表
    自定义列表部署
    SharePoint 2010 使用”日历重叠“功能(转)
    沙盒解决方案与场解决方案之间的差异(转)
  • 原文地址:https://www.cnblogs.com/lulujunsir/p/usercheck.html
Copyright © 2011-2022 走看看