首页 > 其他分享 >12- 项目梳理-登录页面--users

12- 项目梳理-登录页面--users

时间:2023-02-14 18:13:48浏览次数:46  
标签:username 12 users err -- request login password name

1. 创建视图函数,get返回页面

# 登陆视图
class LoginView(View):
    # 打开登录页面
    def get(self, request):
        return render(request, 'users/login.html')

2. 创建路由

# 登陆
    re_path(r'login/$', LoginView.as_view(), name="login"),
# 退出登录
    re_path(r'logout/$', LogoutView.as_view(), name="logout"),

3. 创建html(users.html)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>喵喵商城-登录</title>
    <link rel="stylesheet" type="text/css" href="{{ static('css/reset.css') }}">
    <link rel="stylesheet" type="text/css" href="{{ static('css/main.css') }}">
    <script type="text/javascript" src="{{ static('js/vue-2.5.16.js') }}"></script>
    <script type="text/javascript" src="{{ static('js/axios-0.18.0.min.js') }}"></script>

</head>
<body>
<div class="login_top clearfix">
    <a href="{{ url('shouye:index') }}" class="login_logo"><img src="{{ static('images/logo02.png') }}"></a>
</div>
<div class="login_form_bg" id="app">
    <div class="login_form_wrap clearfix">
        <div class="login_banner fl"></div>
        <div class="slogan fl">欢迎光临 · 喵喵商城</div>
        <div class="login_form fr">
            <div class="login_title clearfix">
                <a href="javascript:;" class="cur">账户登录</a>
            </div>
            <div class="form_con">
                <div class="form_input cur">
                    <form method="post" class="login-form" @submit="denglu" v-cloak>
                        {{ csrf_input }}
                        <input type="text" name="username" class="name_input" placeholder="请输入用户名或手机号"
                               v-model="username" @blur="check_name">
                        <div class="user_error" v-show="err_name_flag">{[ err_name_msg ]}</div>
                        <input type="password" name="password" class="pass_input" placeholder="请输入密码"
                               v-model="password" @blur="check_pwd">
                        <div class="pwd_error" v-show="err_pwd_flag">{[ err_pwd_msg ]}</div>
                        <div class="more_input clearfix">
                            <input type="checkbox" name="remembered" v-model="remembered">
                            <label>记住登录</label>
                        </div>
                        {% if login_err_msg %}
                                <div class="pwd_error">{{ login_err_msg }}</div>
                        {% endif %}
                        <input type="submit" value="登 录" class="input_submit">
                    </form>
                </div>
            </div>
            <div class="third_party">
                <a href="{{ url('users:zhuce') }}" class="register_btn">立即注册</a>
            </div>
        </div>
    </div>
</div>
<div class="footer no-mp">
    <div class="foot_link">
        <a href="#">关于我们</a>
        <span>|</span>
        <a href="#">联系我们</a>
        <span>|</span>
        <a href="#">招聘人才</a>
        <span>|</span>
        <a href="#">友情链接</a>
    </div>
    <p>CopyRight © 2018 北京*******有限公司 All Rights Reserved</p>
    <p>电话:010-******* 京ICP备********号</p>
</div>
</body>
<script type="text/javascript" src="{{ static('js/login.js') }}"></script>

</html>

4. 创建longin,js

var v = new Vue({
    el: "#app",
    delimiters: ["{[", "]}"],
    data: {
        username: "",
        err_name_msg: "请输入5-18位的用户名",
        password: "",
        err_pwd_msg: "请输入6-16位的密码",
        remembered: "",


        //标记
        err_name_flag: false,
        err_pwd_flag: false,

    },
    methods: {
        //校验用户名
        check_name() {
            //用户名效验正则
            let re = /^[a-zA-Z0-9_-]{5,18}$/;
            if (re.test(this.username)) {
                this.err_name_flag = false;
            } else {
                this.err_name_flag = true;
            }
        },
        //校验密码
        check_pwd() {
            let re = /^[0-9A-Za-z]{6,16}$/;
            if (re.test(this.password)) {
                this.err_pwd_flag = false;
            } else {
                this.err_pwd_flag = true;
            }

        },

        //登陆提交数据
        denglu() {
            this.check_name();
            this.check_pwd();

            if (this.err_name_flag == true || this.err_pwd_flag == true) {
                //不提交事件
                window.event.returnValue = false
            }
        }
    }


})

5. 视图函数处理用户提交的post请求

# 登陆视图
class LoginView(View):
    # 打开登录页面
    def get(self, request):
        return render(request, 'users/login.html')

    # 登陆接口
    def post(self, request):
        # 1. 获取请求参数
        username = request.POST.get("username")
        password = request.POST.get("password")
        remembered = request.POST.get("remembered")

        # 2. 效验参数
        if not all([username, password]):
            return HttpResponseForbidden("缺少必填参数")

        if not re.match(r'^[a-zA-Z0-9_-]{5,18}$', username):
            return HttpResponseForbidden("请输入5-18位用户名")
        if not re.match(r'^[0-9A-Za-z]{6,16}$', password):
            return HttpResponseForbidden("请输入6-16位的密码")

        # 3. 登陆
        # 用户认证(用户登录)的方法user = authenticate(username=username, password=password, **kwargs)
        yonghu = authenticate(username=username, password=password)
        if yonghu is None:  # 没有用户,表示用户名或密码错误
            return render(request, "users/login.html", context={"login_err_msg": "用户名或密码错误"})

        # 4. 认证通过,登陆成功,状态保持
        login(request, yonghu)

        # 5. 通过是否勾选记住登陆 确定session有效期
        if remembered != "on":
            # 会话结束则过期,默认两周,0:会话结束就过期
            request.session.set_expiry(0)
        else:
            # 记住 设置成None,两周后过期
            request.session.set_expiry(None)

        # 6. 成功之后,重定向到首页
        # resp = redirect(reverse("shouye:index"))
        '''
        登陆view成功后,不一定去首页
        next中记录登陆之前的那个路径,所以需要在登陆成功之后通过这个路径进入该页面
        如果没有next进入首页
        '''
        next = request.GET.get("next")
        if next:
            resp = redirect(next)
        else:
            resp = redirect(reverse("shouye:index"))

        # 7. 设置cookie
        resp.set_cookie("username", yonghu.username, max_age=7 * 24 * 3600)
        return resp


# 退出登录
class LogoutView(View):
    def get(self, request):
        # 退出登陆,清理session
        # Django用户认证系统提供了logout()
        # 方法, 封装了清理session的操作,帮助我们快速实现登出一个用户, 当然我们也需要将cookie中用户名清除
        logout(request)
        # 响应 重定向首页,清除cookie信息
        response = redirect(reverse("shouye:index"))
        response.delete_cookie("username")
        return response


标签:username,12,users,err,--,request,login,password,name
From: https://www.cnblogs.com/kh-1314/p/17120471.html

相关文章

  • pandas里使用map函数并且是自定义函数来实现规则的方式def
      现在我的问题是,有一堆数据,用一些字符串开头,然后换成数字  原本我用的死办法,直接先做字典,然后用字典的内容作为map的映射规则但是由于这些字符太多了,做字典很......
  • 用简单的代码,将小程序文件直传到腾讯云COS实践
    简介本文介绍如何不依赖SDK,用简单的代码,在小程序直传文件到腾讯云COS的存储桶。注意:本文档内容基于XML版本的API。前期条件登录 对象存储控制台 ,创建存储桶,......
  • 使用express设置静态目录,创建服务,响应get请求
    //1、引入expressconstexpress=require('express');//在node应用中载入express//2、创建应用对象constapp=express();//建立一个express实例constexpres......
  • qqq
    HashMap1.HashMap介绍基于哈希表的Map接口的实现。此实现提供了所有可选的映射操作,并允许null值和null键。(HashMap类大致相当于Hashtable,除了它是不同步的并且允许......
  • fiddler在软件测试中的使用
    1.抓包,辅助定位bug(web中类似谷歌浏览器F12开发调试工具)合格的软件测试工程师,不仅仅需要能够发现bug,还需要能透过bug表象,分析出问题根本原因,从而提升bug的解决效率,通过fid......
  • PHP上传大文件的三种解决方案
    ​PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。1.file_uploads=on/off 是否允许通过http方式上传文件2.max_execution_time=30 允许脚本最大执行时间......
  • 开学测试
    今天下午进行了软件工程科目的开学测试,是上个学期内容的一个回顾吧。题目:     2021级《软件工程》课前测试试卷(180分钟) 河北省环保监测中心网络新闻发布系统(卷......
  • 智慧医院系统开发应用有哪些优势?
     “智慧医院”是一个信息化的概念,不是技术堆积,也不是功能的代名词。智慧医院是具备信息化、互联网化、智能化特征的医院。是运用互联网,物联网、大数据等信息化的技术,让电......
  • 恒创科技:香港机房部分地区无法访问是什么情况?
    香港机房部分地区无法访问?在租用香港服务器、香港云服务器等过程中,总会经历各种问题,除了常见的速度慢等问题,还有一种问题也是比较头疼的,那就是所有地区都可访问,唯独某......
  • 外贸行业crm软件最有价值的4个功能
    外贸行业crm软件即客户关系管理,是指企业为提高核心竞争力,利用相应的信息技术以及互联网技术协调企业与顾客间在销售、营销和服务上的交互,从而提升其管理方式,向客户提供创新......