从零开始学Python-day9

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代码

[[email protected] 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 登录功能演示

情况一:用户名密码都为空

情况二:用户名不存在

情况三:密码不正确

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

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 = "[email protected]#" #给加密字符串赋值

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不存在的话,任何增删改查操作都会跳转回登录页面

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

三、初识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. 检查目录结构为:

[[email protected] 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>

执行效果截图:

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修改元素值

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.错误信息截图

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

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后期可以通过使用装饰器来包装

时间: 2024-08-09 10:44:18

从零开始学Python-day9的相关文章

学习《从零开始学Python网络爬虫》PDF+源代码+《精通Scrapy网络爬虫》PDF

学习网络爬虫,基于python3处理数据,推荐学习<从零开始学Python网络爬虫>和<精通Scrapy网络爬虫>. <从零开始学Python网络爬虫>是基于Python 3的图书,代码挺多,如果是想快速实现功能,这本书是一个蛮好的选择. <精通Scrapy网络爬虫>基于Python3,深入系统地介绍了Python流行框架Scrapy的相关技术及使用技巧. 学习参考: <从零开始学Python网络爬虫>PDF,279页,带目录,文字可复制: 配套

数据分析学习资料《利用Python进行数据分析第2版》+《Python数据分析与挖掘实战》+《从零开始学Python数据分析与挖掘》

数据分析涉及统计学.线性代数.图形分析绘制.数据挖掘等知识,推荐系统学习电子资料<利用Python进行数据分析第2版>.<Python数据分析与挖掘实战>.<从零开始学Python数据分析与挖掘>电子书和代码测试. <利用Python进行数据分析第2版>电子书代码,每一章之间有递进关系,适合在Python入门<Python编程从入门到实践>电子书之后阅读,本专门针对数据分析领域的.我细致地读了一遍,敲了一遍代码,一开始没有头绪,进展缓慢,后来逐渐

从零开始学Python程序设计(Python 3.5以上)中文pdf扫描版[172MB]高清下载

Python语言是面向对象的模块化设计语言,它易于学习.易于维护.可读性强,适合初学者作为入门程序设计语言. <从零开始学Python程序设计>以Python3.5版本作为教学版,针对初学者的特点,分为五篇内容进行全面讲解:第壹篇为基础入门篇(第1-3章),介绍Python语言的基本功能:第二篇为有序和无序篇(第4-6章),介绍控制台应用程序和窗口应用程序:第三篇为标准函数篇(第7和8章),介绍标准函数库的应用:第四篇为面向对象篇(第9-11章),介绍封装.继承和多态:第五篇为高级篇(第12-

从零开始学python

自从20世纪90年代初Python语言诞生至今,它已被广泛应用于系统管理任务的处理和Web编程.今天就来给大家看看学Python的五大优势吧! NO.1 全球三大主流编程语言之一 python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库.它已经成为继Java.C++之后的第三大语言,相对于其他语言,它的特点是:简单易学.可移植.可扩展.可嵌入. 丰富的库.免费开源等, Python难度低于java,更适合初学编程者. NO.2 高效可靠的编程语言 我相信任何使用过 Python

从零开始学Python第八周:网络编程基础(socket)

Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 套接字是一个双向的通信信道的端点.套接字可能在沟通过程,进程之间在同一台机器上,或在不同的计算机之间的进程 要创建一个套接字,必须使用Socket模块的socket.socket()方法 在socket模块中的一般语法: s = socket.

Python重要文献参考_摘自从零开始学Python

开发相关网站: stackoverflow.com --在这里可以提问,可以查看答案.一般如果有问题,先在这里查找,多能找到非常满意的结果,至少有很大启发:在某国有时候有些地方可能不能访问,需要科学上网.好东西,一定不会让你轻易得到,也不会让任何人都得到. Python 中的 staticmethod 和 classmethod 的差异(题名). 原载: http://pythoncentral.io/difference-between-staticmethod-and-classmethod

从零开始学Python第一周:Python基础(上)

Python语法基础(上) 一,Python的变量 (1)创建变量 变量的含义:存储信息的地方 创建变量并赋值 x = 1 print x x = 123 #再次赋值 print x (2)使用变量 x = 1 y = 2 z = 3 print x,y,x*y,z (3)变量的命名规则 由字母,数字,下划线组成 不能以数字开头 不能使用Python关键字 错误的变量命名举例: #name = 1 3k = 1 print = 1 英文字母大小写敏感,例如:m与M不同 m = 1 print M

从零开始学Python数据分析

第1章 Python环境搭建与使用 1.1 Anaconda的安装和使用 1.1.1 Anaconda的安装 1.1.2 Anaconda的使用 1.包管理 2.环境管理 1.2 Jupyter Nottebook的使用 1.2.1 更改工作空间 1.2.2 界面介绍与 1 1 + 2 2 # 输出:3 1 for i in range(5): 2 print(i) 3 # 输出:0 4 1 5 2 6 3 7 4 原文地址:https://www.cnblogs.com/wssys/p/102

从零开始学JAVA DAY9

包 关键字: package 一个包就相当于一个文件夹 包必须写在该包里面所有类的上方 格式: package demopackage(包名全小写):(分号) 如果手写dos命令那么需要用命令来创建一个包 javac -d .....(文件路径) + 编译的主类(注意如果位置不同要将包所在的路径定义到classpath里面) set classpath = ,,,, 四个关键字的作用域 public > proteted > default > private proteted 受保护的

小白从零开始学编程--python安装与环境搭建

前言 从2020年3月份开始,计划写一系列文档--<小白从零开始学编程>,记录自己从0开始学习的一些东西. 第一个系列:python,计划从安装.环境搭建.基本语法.到利用Django和Flask两个当前最热的web框架完成一个小的项目 第二个系列:可能会选择Go语言,也可能会选择Vue.js.具体情况待定,拭目以待吧... python安装与配置 python2 在2020年初开始已经不再维护,所以学习只讨论python3 windows环境 下载python3安装包 到官方网站下载选择合适