设为首页 收藏本站
查看: 1589|回复: 0

[经验分享] 从零开始学Python-day9

[复制链接]

尚未签到

发表于 2018-8-15 13:42:41 | 显示全部楼层 |阅读模式
  Python-day9
  学习要有定位,明确目标地去学习。坚持下去,就会有所收获---leaves。(ps:现在思路已经稍微清晰点了,加油,时间不等人!!)
  python08 -- 登录模块,Session以及初识jQuery
  一、登录模块
  1.1 登录模块MVC思路讲解
  I:前端html
  a.登录页面首次默认GET方式,返回一个待填写的表单;
  b.输入用户名密码后,点击表单按钮以POST方式向逻辑端发起请求,并把表单数据传递给逻辑端
  II:逻辑端
  a.逻辑端判断前端发起的是POST表单提交还是GET方式。如果为GET请求,说明为第一次发起,返回对应的html即可;如果为POST请求,说明是为了提交表单数据,通过request.form获取表单数据。
  b.逻辑端查询数据库数据,判断前端传来的数据是否在数据库中存在,如果存在,表示登录成功,生成session,将用户需要的信息存入session即可,如果不存在,则跳转到登录页面重新输入用户名密码
  III:数据端
  a.对数据进行增删改查,并返回结果。
  1.2 登录的代码
  login_user = dict( (k,v[0]) for k ,v in dict(request.form).items())
  ##一步高阶代码将用户名密码转换为字典
  1.2.1 flask代码
@app.route('/login',methods = ["GET","POST"])  
def login():
  
        if request.method == "GET":
  
                return render_template("login.html")
  
        if request.method == "POST":
  
                login_user = dict( (k,v[0]) for k ,v in dict(request.form).items())
  
                tmp = ["name",'password']
  
                all_sql = "select %s from users " %','.join(tmp)
  
                cur.execute(all_sql)
  
                res = cur.fetchall()
  
                all_user = [ dict((v,row[k]) for k ,v in enumerate(tmp)) for row in res]
  
                #all_user==>[{'password': u'aa', 'name': u'KK'}, {'password': u'123456', 'name': u'TT'}, {'password': u'XX123as', 'name': u'XX'}, {'password': u'123as', 'name': u'Xman'}, {'password': u'123VV', 'name': u'AA'}]
  
                userName = [ x['name'] for x in all_user]
  
                if not login_user['name'] or not login_user['password']:
  
                        errmsg = "Name or Password not Null"
  
                        return render_template("login.html",result = errmsg)
  
                if  login_user['name'] not in userName:
  
                                                                                                    39,2-16       15%
  
                        errmsg = "Name is not exit"
  
                        return render_template("login.html",result = errmsg)
  
                else :
  

  
                        password = [ x['password'] for x in all_user if x['name'] == login_user['name']][0]
  
                        if  login_user['password'] != password:
  
                                errmsg = "Password is not exist "
  
                                return render_template("login.html",result = errmsg)
  
                        #return render_template("login.html",result = 'login Success')
  
                        else:
  
                                session['name'] = login_user['name']
  
                                return redirect('/user/userlist')
  1.2.2 前端html代码
[root@xiaowei blog]# cat templates/login.html  
<html>
  
<head>
  
<meta charset='utf-8'>
  
<title>login</title>
  
</head>
  
<body>
  
<table>
  
<form action='/login' method="POST">
  <tr><td>Name<input id ="name"  type='text' name='name'> </td></tr>
  <tr><td>Password<input id ="password" type='password' name='password'> </td></tr>
  <tr><td><input id ="loginbtn" type='submit' value='login'></td></tr>
  </form>
  {% if result %}
  <div style = "color:red">
  {{ result }}
  </div><!--定义div标签使报错信息为红色-->
  {% endif %}<!--判断是否存在报错信息-->
  
</table>
  1.2.3 登录功能演示
  情况一:用户名密码都为空
DSC0000.png

  情况二:用户名不存在
DSC0001.png

  情况三:密码不正确
DSC0002.png

  情况四:用户名密码正确,跳转用户列表界面
DSC0003.png

  1.3 登录注意事项
  判断用户名密码时优先使用get(方法)。
  if not login_user['name'] or not login_user['password']: ===>更改为login_user.get('name',None)以防name字段不存在产生的报错终止程序运行
  二、Session讲解
  2.1 session定义
  session就是一个全局的字典,在整个flask页面中都能调用,一般在登录成功后生成session。session[key] = value。举例说明:整个flask页面就相当于一家大公司有很多栋楼,每个楼层都有门卫,Session就是第一个门卫给你发的一个通行证,带着这个通行证就能各个楼层转了。
  2.2 为什么需要session
  session的主要作用是状态保持,http请求是无状态的。(从第一个门进去之后,每个门卫都是不可能都认识你,所以每次都要询问你下)
  2.3 Session的工作流程
  1.登录成功生成session,用户带着session(通行证)去各个页面
  2.各个页面都有个门卫,专门检查session(通行证),有则放行。
  3.出门的时候就会收回通行证
  2.4 session的主要功能
  1.创建session
  2.删除session
  3.验证
  3.1 验证用户是否登录,如果没有登录则跳转回登录页面
  3.2 验证权限、验证角色。不同的角色操作不同的方法。
  2.5 session实现思路
  1.用户登录后在全局大字典session里面加一个值
  eg:session['name'] = 'wd',这个全局大字典在逻辑端任何地方都可以调用
  2.每个增删改查操作前,都判断下session里面有没有name这个字段值,如果有就表示已经登录;没有就表示未登录,跳转到登录页面。
  2.6 session操作实例
  1.导入session
  from flask import session
  app.secret_key = "asdasd!@#" #给加密字符串赋值
  2.session赋值
  session就是一个全局的字典,在整个flask页面中都能调用,一般在登录成功之后生成session.session[key] = value
  本片中登录模块Session赋值为session['name'] = login_user['name']
  3.session 验证
  登录成功后,其他所有的操作都必须基于session认证后实现。即session存在,允许操作;否则,跳转回登录界面。
  本例中session验证为在其他监听路由下添加以下代码:
  if not session.get('name',None):
  return redirect('/login')
  4.session注销
  session注销有两种方式
  1.根据时间,生成session是带上时间参数,对比时间过期,session自动注销。(目前了解,暂无实现思路)
  2.手动注销Session
  新建loginout路由,手动注销session
@app.route('/loginout')  
def loginout():
  
        session.pop('name')
  
        return redirect('/login')
  2.7 session的效果图
  1.session不存在的话,任何增删改查操作都会跳转回登录页面
DSC0004.png

  2.session存在的情况下,可以进行任意跳转,进入任何路由
DSC0005.png

DSC0006.png

  三、初识jQuery
  3.1 jQuery定义
  jQuery是一个"写的更少,但是做的更多"的轻量级JavaScript库。包含内容为:
  HTML元素选取
  HTML元素操作
  CSS操作
  HTML事件函数
  JavaScript特效和动画
  HTML DOM遍历和修改
  AJAX
  3.2 jQuery准备工作
  1.在项目目录中创建static/js目录 ==>mkdir -p static/js
  2.下载jQuery插件 ==> wget https://code.jquery.com/jquery-3.1.0.min.js
  3. 检查目录结构为:
  [root@xiaowei ketang]# tree  static/
  static/
  └── js
  └── jquery-3.1.0.min.js
  3.3 jQuery三步走
  jQuery格式: $selector().action()
  1. $ 美元符,表示jQuery
  2. selector 选择器(选定HTML元素),这个是重点。很多种选择方式,id等
  3. action()选定后对这个元素的操作
  jQuery的基本三步走策略:
  I:选择器--找到需要操作的元素
  II:操作 -- DOM元素进行增删改查
  2.1 操作HTML文档内容--常用元素table、form、 div
  2.2 操作HTML元素属性 ---常见属性
  2.3 操作HTML元素式样 ---CSS(其实也属于属性)
  III:事件---什么情况下触发jQuery的操作,ajax等
  3.4 第一个jQuery程序
  在login.html中添加以下内容
<script src = "/static/js/jquery-3.1.0.min.js"></script> #定义js文件内容  
<script>
  
alert('di yi ge jQuery')
  

  
</script>
  执行效果截图:
DSC0007.png

  3.5 jQuery实现对HTML元素的操作
  jQuery实现对HTML元素进行取值,在login.html文件中将form及其内部标签添加id元素。具体html代码如下
  jQuery选择器之ID:是html元素的唯一标识,同一个页面中不能出现重名的idName
<html>  
<head>
  
<meta charset='utf-8'>
  
<title>login</title>
  
</head>
  
<body>
  
<table>
  
<!--<form action='/login' method="POST">-->
  
<form id="loginForm">
  
        <tr><td>Name<input id ="name"  type='text' name='name'> </td></tr>
  
        <tr><td>Password<input id ="password" type='password' name='password'> </td></tr>
  
        <tr><td><input id ="loginbtn" type='submit' value='login'></td></tr>
  
        </form>
  
        {% if result %}
  
        <div style = "color:red">
  
        {{ result }}
  
        </div>
  
        {% endif %}
  
<script src = "/static/js/jquery-3.1.0.min.js"></script>
  
<script>
  
alert('di yi ge jQuery')
  

  
</script>
  
</table>
  验证:运行程序,在login.html界面中输入用户名密码,在console中输入以下命令看能否获取值。ps:form标签的id值为 loginForm,input标签中用户名密码的id分别为name和password。也可以通过id值对html元素值进行修改。$('#loginForm').serialize()执行结果为"name=nihao&password=asdfa"  可以用来拼接html的url.
  jQuery中对数据的操作
  1.val()  操作表单数据
  2.html()  操作元素
  3.attr()  操作属性
$('#loginForm').serialize()  
"name=aaaa&password=dddd"
  
$('#loginForm').serialize()
  
"name=aaaa&password=dddd"
  
$('#name').val()
  
"aaaa"
  
$('#password').val()
  
"dddd"
  通过id修改元素值
DSC0008.png

  3.6 jQuery实现登录模块
  jQuery实现登录需要注意的知识点:
  1.flask逻辑端return 返回字典类型数据:eg : return json.dumps({'code':0,'result': "login success "}) ,对应的需要import json模块。
  2.html中script标签内的回调函数。要jQuery代码逻辑。
  3.6.1 jQuery实现登录的前后端代码:
##flask逻辑端代码(仅登录模块)  
##注意在开始要import json
  

  
@app.route('/login',methods = ["GET","POST"])
  
def login():
  
        if request.method == "GET":
  
                return render_template("login.html")
  
        if request.method == "POST":
  
                data = dict( (k,v[0]) for k ,v in dict(request.form).items())
  
                tmp = ["name",'password']
  
                all_sql = "select %s from users " %','.join(tmp)
  
                cur.execute(all_sql)
  
                res = cur.fetchall()
  
                all_user = [ dict((v,row[k]) for k ,v in enumerate(tmp)) for row in res]
  
                #all_user==>[{'password': u'aa', 'name': u'KK'}, {'password': u'123456', 'name': u'TT'}, {'password': u'XX123as', 'name': u'XX'}, {'password': u'123as', 'name': u'Xman'}, {'password': u'123VV', 'name': u'AA'}]
  
                userName = [ x['name'] for x in all_user]
  
                if not data.get('name',None)  or not data.get('password',None):
  
                        errmsg = "Name or Password not Null"
  
                        #return render_template("login.html",result = errmsg)
  
                        return json.dumps({'code':1,'result': errmsg})
  
                if  data.get('name',None) not in userName:
  
                        errmsg = "Name is not exit"
  
                        #return render_template("login.html",result = errmsg)
  
                        return json.dumps({'code':1,'result': errmsg})
  
                else :
  

  
                        password = [ x['password'] for x in all_user if x['name'] == data['name']][0]
  
                        if  data.get('password',None) != password:
  
                                errmsg = "Password is not exist "
  
                                #return render_template("login.html",result = errmsg)
  
                                return json.dumps({'code':1,'result': errmsg})
  
                        #return render_template("login.html",result = 'login Success')
  
                        else:
  
                                session['name'] = data['name']
  
                                #return redirect('/user/userlist')
  
                                return json.dumps({'code':0,'result': "login success "})
  

  
##login.html前端HTML中代码
  
<html>
  
<head>
  
<meta charset='utf-8'>
  
<title>login</title>
  
</head>
  
<body>
  
<table>
  
<!--<form action='/login' method="POST">-->
  
<form id="loginForm">
  
        <tr><td>Name<input id ="name"  type='text' name='name'> </td></tr>
  
        <tr><td>Password<input id ="password" type='password' name='password'> </td></tr>
  
        <tr><td><input id ="loginbtn" type='submit' value='login'></td></tr>
  
        </form>
  
        {% if result %}
  
        <div style = "color:red">
  
        {{ result }}
  
        </div>
  
        {% endif %}
  
<script src = "/static/js/jquery-3.1.0.min.js"></script>
  
<script>
  
//alert('di yi ge jQuery') <!--Test jQuery-->
  
$('#loginbtn').on('click',function(){
  
        var str = $('#loginForm').serialize()
  
        console.log(str)
  
        $.post('/login',str,function(data){   //回调函数,注意function(data)中data参数不能丢
  
                console.log(data)
  
                data = JSON.parse(data)
  
                console.log(data)
  
                if (data['code'] == 0){
  
                        alert(data['result'])
  
                        location.href='/user/userlist'
  
                }else{
  
                        $('errmsg').html(data['errmsg'])
  
                }
  
        })
  
        return  false
  

  
})
  

  
</script>
  
</body>
  
</table>
  3.6.2 jQuery登录效果截图
  1.错误信息截图
DSC0009.png

  2.正常登录效果图(点击确认后跳转到userlist界面)
DSC00010.png

DSC00011.png

  3.6.2 jQuery实现登录重点
  回调函数:function(data为回调函数)(ps:flask 端代码无需更改,只是将html中事件响应更改为jQuery。)
  ##login.html
  <script>
  //alert('di yi ge jQuery') <!--Test jQuery-->
  $('#loginbtn').on('click',function(){
  var str = $('#loginForm').serialize()
  console.log(str) ##实现记录$('#loginForm').serialize()的值
  $.post('/login',str,function(data){
  console.log(data)
  data = JSON.parse(data)
  console.log(data)
  if (data['code'] == 0){
  alert(data['result']) #事件触发以及展示信息
  location.href='/user/userlist' ##事件完成后跳转到用户列表
  }else{
  // $('errmsg').html(data['errmsg']) #console窗口打印$('#loginForm').serialize()内容
  //以下更改使得报错信息也在jQuery弹框中显示。
  alert(data['result'])
  location.href='/login'
  }
  })
  return  false
  })
  </script>
  四、其他注意事项及知识点:
  1.对数据库的操作,try except 方便排错
  2.flask代码组织结构有两种方式      包 + 蓝图
  3.session后期可以通过使用装饰器来包装

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-552285-1-1.html 上篇帖子: Python 函数式编程,从入门到放弃 下篇帖子: 源码包安装python2.7.6和ipython1.2.1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表