Gun's Blog

flask学习

Word count: 1.4kReading time: 5 min
2019/08/09 Share

   因为 HTTP 协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式 Web 应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于 HTTP 的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,所以 Cookie 就是用来绕开 HTTP 的无状态性的“额外手段”之一。服务器可以设置或读取 Cookies 中包含信息,借此维护用户跟服务器会话中的状态。
   在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段 Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把 Cookie 发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段 Cookie 里追加新的商品信息。结帐时,服务器读取发送来的 Cookie 就行了。
  Cookie 另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的 Cookie 到用户的硬盘上。第二次登录时,如果该 Cookie 尚未到期,浏览器会发送该 Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

session:


1.session介绍:session 与 cookie 的作用类似,都是为了存储用户相关信息,不同的是,cookie 是存储在本地浏览器,而 session 存储在服务器。存储在服务器的数据会更加安全,不容易窃取

  1. 使用session的好处:

    敏感数据不直接发送给浏览器,而是发送回一个session_id,服务器将session_id与敏感数据做映射存储在session(存储在服务器中),更加安全。
    session可以设置过期时间,保证了用户的账号安全。


1.flask 中的 cookie 与 session 机制:把敏感数据经过加密后放入session中,然后再把session存放到cookie中 ,下次请求的时候,再从浏览器发送过来的cookie中读取session,然后再从session中读取敏感数据并进行解密,获取用户的数据。
2.flask 的这种session机制可以节省服务器端的开销,因为把所有的信息都存储到了客户端。

  1. 安全是相对的,把session放到cookie中是比较安全的。

flask 中操作session


1.session 的操作方式:

from flask import session, 以后与session相关的操作都是通过session完成的。
使用session需要设置SECRET_KEY, 作为加密算法使用。并且SECRET_KEY的值在每次服务器启动只够都会变化。那么之前的session就不能通过当前的session值进行解密了。
操作session可以类似字典的操作。
添加session:session['username']
删除session:session.pop('username')或者del.session['uesrname']
彻底清空session:session.clear()
获取session:session.get('username')

2.例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from flask import Flask,session
import os
app=Flask(__name__)
app.config['SECRET_KEY']=os.urandom(24)


@app.route('/')
def index():
session['username']='Gun'
return 'hello word'

@app.route('/get/')
def get():
print(session.get('username'))
return session.get('username')
@app.route('/delete')
def delete():
print(session.get('username'))
session.pop('username')
print(session.get('username'))
return "success"

@app.route('/clear')
def clear():
print(session.get('username'))
session.clear()
print(session.get('username'))
print("clear success")

if __name__=='__main__':
app.run(debug=True)

设置session的过期时间




可以看出,如果没有设置session的到期时间,则默认浏览器关闭后到期。如果设置了session.permanent=True则有效期为一个月。

如果想要自定义为其他的时间,则需要通过

1
2
app.config['PERMANENT_SESSION_LIFETIME']=timedelta(days=7)
session.permanent=True

get请求和post请求


get请求:

使用场景:向服务器请求资源。
传参:get请求的参数放在url中,并且通过?key:value的形式传入url中请求资源。
get请求是通过flask.request.args来获取。

post请求:

使用场景:向指定的资源提交要被处理的数据
传参:通过form data的形式发送给服务器
post请求是通过flask.request.form来获取
post请求和get请求在使用过程中应注意:

  • input标签中,应标明name属性以便后台获取post参数。
  • 试图函数默认的请求方法为GET,所以在写form表单时,需要设置method='POST'。示例如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    from flask import Flask,url_for,render_template,request
    app=Flask(__name__)

    @app.route('/')
    def index():
    return render_template('index.html')

    @app.route('/search/')
    def search():
    q=request.args.get('q')
    return "用户查询的参数是:{}".format(q)

    @app.route('/login/',methods=['GET','POST'])
    def login():
    if request.method=='GET':
    return render_template("login.html")
    else:
    username=request.form.get("username")
    password=request.form.get("password")
    print(username,password)
    return "success"

    if __name__=='__main__':
    app.run(debug=True)
    login.html文件:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>login</title>
    <style>
    html,body{
    margin: 0;
    height: 100%;
    }
    .header{
    display: flex;
    flex-direction: column;
    justify-content: space-around;
    }
    input{
    text-indent: 2em;
    border:2px solid black;
    border-radius: 8px;
    margin: 20px;
    width: 40%;
    height: 80px;
    }
    </style>
    </head>
    <body>
    <form class="header" action="" method="post">
    <input type="text" placeholder="请输入账户名:" name="username">
    <input type="password" placeholder="请输入密码:" name="password">
    <input text-align="center" type="submit" value="登陆">
    </form>
    </body>
    </html>
CATALOG
  1. 1. cookie:
  2. 2. session:
  3. 3. flask 中的 cookie 与 session 机制
  4. 4. flask 中操作session
  5. 5. 设置session的过期时间
  6. 6. get请求和post请求
    1. 6.1. get请求:
    2. 6.2. post请求: