cookie:

1.cookie出现的原因:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。
2.如果服务器返回了cookie给浏览器,那么浏览器下次再请求相同的服务器的时候,就会自动的把cookie发送给浏览器,这个过程,用户根本不需要管。
3.cookie是保存在浏览器中的,相对的是浏览器。

session:

1.session介绍:session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。
2.使用session的好处:

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

flask中的session工作机制:

1.flask中的session机制是:把敏感数据经过加密后放入session中,然后再把session存放到cookie中,下次请求的时候,再从浏览器发送过来的cookie中读取session,然后再从session中读取敏感数据,并进行解密,获取最终的用户数据。
2.flask的这种session机制,可以节省服务器的开销,因为把所有的信息都存储到了客户端(浏览器)。
3.安全是相对的,把session放到cookie中,经过加密,也是比较安全的,这点大家放心使用就可以了。

操作session:

1.session的操作方式:

    * 使用`session`需要从`flask`中导入`session`,以后所有和`sessoin`相关的操作都是通过这个变量来的。
    * 使用`session`需要设置`SECRET_KEY`,用来作为加密用的。并且这个`SECRET_KEY`如果每次服务器启动后都变化的话,那么之前的`session`就不能再通过当前这个`SECRET_KEY`进行解密了。
    * 操作`session`的时候,跟操作字典是一样的。
    * 添加`session`:`session['username']`。
    * 删除:`session.pop('username')`或者`del session['username']`。
    * 清除所有`session`:`session.clear()`
    * 获取`session`:`session.get('username')`

2.设置session的过期时间:

    * 如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束
    * 如果设置了session的permanent属性为True,那么过期时间是31天。
    * 可以通过给`app.config`设置`PERMANENT_SESSION_LIFETIME`来更改过期时间,这个值的数据类型是`datetime.timedelay`类型。

代码:

#encoding: utf-8

from flask import Flask,session
import os
from datetime import timedelta

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)

# 添加数据到session中
# 操作session的时候,跟操作字典是一样的
# SECRET_KEY

@app.route('/')
def hello_world():
    session['username'] = 'admin'
    # 如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束
    # 如果设置了session的permanent属性为True,那么过期时间是31天。
    session.permanent = True
    return 'Hello World!'

@app.route('/get/')
def get():
    # sesssion['username']
    # session.get('username')
    print session.get('username')
    return 'sucess'

@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中的所有数据
    session.clear()
    print session.get('username')
    return 'success'

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

GET请求和POST请求:

1.GET请求:

    * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求。
    * 传参:get请求传参是放在url中,并且是通过`?`的形式来指定key和value的。

2.POST请求:

    * 使用场景:如果要对服务器产生影响,那么使用post请求。
    * 传参:post请求传参不是放在url中,是通过`form data`的形式发送给服务器的。

GET和POST请求获取参数:

  1. get请求是通过flask.request.args来获取。
  2. post请求是通过flask.request.form来获取。
  3. post请求在模板中要注意几点:
    • input标签中,要写name来标识这个value的key,方便后台获取。
    • 在写form表单的时候,要指定method='post',并且要指定action='/login/'
  4. from示例代码:
        <form action="{{ url_for('login') }}" method="post">
            <table>
                <tbody>
                    <tr>
                        <td>用户名:</td>
                        <td><input type="text" placeholder="请输入用户名" name="username"></td>
                    </tr>
                    <tr>
                        <td>密码:</td>
                        <td><input type="text" placeholder="请输入密码" name="password"></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td><input type="submit" value="登录"></td>
                    </tr>
                </tbody>
            </table>
        </form>

flask源码

#encoding: utf-8

from flask import Flask,render_template,request

app = Flask(__name__)

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

@app.route('/search/')
def search():
    # arguments
    #  GET参数获取
    q = request.args.get('q')
    return u'用户提交的查询参数是:%s' % q

# 默认的视图函数,只能采用get请求
# 如果你想采用post请求,那么要写明
@app.route('/login/',methods=['GET','POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        # 获取POST的值
        username = request.form.get('username')
        password = request.form.get('password')
        print 'username:',username
        print 'password:',password
        return 'post request'

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

保存全局变量的g属性:

g:global
1.g对象是专门用来保存用户的数据的。
2.g对象在一次请求中的所有的代码的地方,都是可以使用的。

示例代码:

g_demo.py


#encoding: utf-8

from flask import Flask,g,render_template,request
from utils import login_log
app = Flask(__name__)

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

@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')
        if username == 'admin' and password == '111111':
            # 就认为当前这个用户的用户名和密码正确
            # 全局变量
            g.username = 'admin'
            g.ip = 'xx'
            login_log()
            return u'恭喜!登录成功!'
        else:
            return u'您的用户名或密码错误!'

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

utils.py

# 可以直接使用g.username
def login_log():
    print u'当前登录用户是:%s' % g.username

钩子函数(HOOK):

1.before_request:

    * 这个装饰器变量是在请求之前执行
    * 是在视图函数执行之前执行的
    * 这个函数只是一个装饰器,他可以把需要设置为钩子函数的代码放到视图函数执行之前来执行

示例代码

# before_requst:在请求之前执行的
# before_request是在视图函数执行之前执行的
# before_request这个函数只是一个装饰器,他可以把需要设置为钩子函数的代码放到视图函数执行之前来执行

@app.before_request
def my_before_request():
    # user_id = session.get('user_id')
    # user = User.query.filter(User.id==user_id).first()
    # g.user = user
    print 'hello world'
    if session.get('username'):
        g.username = session.get('username',username='admin')

2.context_processor:

    * 上下文处理器应该返回一个字典。字典中的`key`会被模板中当成变量来渲染。
        * 上下文处理器中返回的字典,在所有页面中都是可用的。
        * **被这个装饰器修饰的钩子函数,必须要返回一个字典,即使为空也要返回。**

示例代码:

# 上下文处理器应该返回一个字典。字典中的`key`会被模板中当成变量来渲染。
@app.context_processor
def my_context_processor():
    # username = session.get('username')
    # if username:
    #     return {'username':username}
    return {'username':'111111'}

【Python】Flask系列-cookie和session笔记的更多相关文章

  1. 【Python】Flask系列-URL和视图笔记

    1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...

  2. flask中cookie和session介绍

    flask中cookie和session介绍 一.cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.co ...

  3. flask中cookie和session设置

    flask中cookie和session介绍   一.cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户. ...

  4. Python Flask,cookie,session ,设置、获取、删除

    使用Response类的set_cookie()方法可以设置cookie: Response.set_cookie( key, //键 value='', //值 max_age=None, //秒为 ...

  5. Flask:cookie 和 session (0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 Cookie是什么?有什么用? 某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常 ...

  6. Flask中cookie和session设置与csrf原理攻防

    Flask之操作cookie app.py from flask import Flask, request, Response app = Flask(__name__) @app.route('/ ...

  7. Python爬虫之Cookie和Session

    关于cookie和session估计很多程序员面试的时候都会被问到,这两个概念在写web以及爬虫中都会涉及,并且两者可能很多人直接回答也不好说的特别清楚,所以整理这样一篇文章,也帮助自己加深理解 什么 ...

  8. python 终极篇 cookie与session

    ()cookie与session---------->>>>>>>>>>>>>>>>>>&g ...

  9. Java开发系列-Cookie与Session会话技术

    概述 会话技术:当用户打开浏览器的时候,访问不同的资源,直到用户将浏览器关闭,可以认为这是一次会话.会话技术产生是由于Http请求是一个无状态的协议,它不会记录上次访问的内容,用户在访过程中难免产生一 ...

随机推荐

  1. 《Linux内核分析》第五周学习总结 扒开系统调用的三层皮(下)

    扒开系统调用的三层皮(下) 郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给Men ...

  2. Linux内核分析第一周——计算机是如何工作的

    冯诺依曼体系结构 核心思想 1.冯诺依曼是:数字计算机的数制采用二进制:计算机应该按照程序顺序执行. 2.采用二进制作为计算机数值计算的基础,以0.1代表数值.不采用人类常用的十进制计数方法,二进制使 ...

  3. 第五周可执行代码 以及 Canvas 制作个人PSP分类饼图

    第五周可执行代码已经上传github,地址是https://github.com/yanyige/CourseWork/tree/master/Week4.以及效果在http://yanyige.gi ...

  4. 解决sublime text3下中文无法输入的问题(Ubuntu)

    sublime-text-imfix,非常无脑.就喜欢这样的.

  5. Delphi窗体部分属性

    Align属性:控制窗体显示时的对齐方式(注:是相对于父窗体的对齐方式.如果该窗体是主窗体则没有父窗体)(与anchor不同在于,anchor定义的对齐是固定到边界的距离) 默认值为alNone.其他 ...

  6. http——解读梳理

    (1)在客户端与服务器建立准确连接传输之前,先讲一讲三次握手 第一次握手:建立连接时,客户端发送syn包[同步序列编号(Synchronize Sequence Numbers).是TCP/IP建立连 ...

  7. LOJ2542 PKUWC2018随机游走(概率期望+容斥原理)

    如果直接dp,状态里肯定要带上已走过的点的集合,感觉上不太好做. 考虑一种对期望的minmax容斥:其中Max(S)为遍历完S集合的期望步数,Min(S)为遍历到S集合中一个点的期望步数.当然才不管怎 ...

  8. 题解 P1030 【求先序排列】

    题解 P1030 [求先序排列] 旧题新解~ 今天做这个题,发现还是没有AC,于是滚回来用了一大堆数据结构A了这个题目,好像复杂度还挺高...... #include <iostream> ...

  9. Codeforces Round #426 (Div. 1) B The Bakery (线段树+dp)

    B. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  10. 如何设置Java虚拟机JVM启动内存参数

    Tomcat默认的Java虚拟机JVM启动内存参数大约只有64MB或者128MB,非常小,远远没有利用现在服务器的强大内存,所以要设置Java虚拟机JVM启动内存参数.具体设置方法为: Tomcat修 ...