Context 上下文
上下文(context)是web编程中一个相当重要的概念,它是服务器端获得应用和请求相关信息的对象。
会话上下文是web服务器上基于cookie对象,它提供了为同一个客户端在多次请求之间共享信息的方式。
应用全局对象:提供了在一次请求的多个处理函数中共享信息的方式。
请求上下文(request context)是web服务器管理单次用户web服务器发送的数据
- 会话上下文
会话(session)是一种客户端和服务器端保持状态的解决方案,在服务器的程序端,会话上下文是用来实现这种解决方案的。每个不同的用户连接将会得到不同的会话,也就是说会话和用户之间是一一对应的关系,会话在用户进入网站时用服务器自动产生。并在用户正常离开时释放,同一个用户在多次请求中共享一个会话。
原理:
在服务器收到客户端请求的时候,检查该客户端时候设置的标志sessionID的cookie,如果不存在sessionID或者sessionID无效,则认为该请求是一个新的会话。
当服务器端识别到新的会话时,生成一个新的sessionID并通过cookie传送给客户端
客户端在下一次请求时提交之前获得的sessionID,此时服务器认为该请求与之前生成的sessionID的请求属于同一个会话。
在flask框架中,开发者无需针对上述原理进行编程,因为flask会自动对这些细节进行处理,开发者只需要在需要时将会话保存或者读取信息即可。开发者可以通过flask.session对象操作会话。
会话上下文代码:
from datetime import datetime
from flask import Flask, session
app = Flask(__name__)
app.secret_key = 'af42j'
@app.route('/write_session')
def writeSession():
session['key_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return session['key_time']
@app.route('/read_session')
def readSession():
print(session.modified) ##判断session 是否有修改
return session.get('key_time')
分别访问url:
http://127.0.0.1:5000/read_session
http://127.0.0.1:5000/write_session
查看cookie中的信息,session的信息是已经经过加密的,写入的session值和读的值是一样的。
除了正常的数据保存和读取,falsk.session对象还维护自身的状态,这通过如下两个属性来判断:
session.new 判断本次请求的session是否是新建的 bool类型
session.modified 判断本次请求中是否修改过session的键值 bool类型
- 请求上下文
请求上下文:主要是服务器端获得从客户端提交的数据,这些数据包括: url参数,form表单数据,cookie, html头信息, url等。
访问url参数和路径:
与url相关的数据包括url参数和url路径, 比如:http://localhost/test?next=http://www.jd.com/&data=abc 中, url参数包括next=http://www.jd.com和data=abc, url的根路径是:http://localhost/test
from flask import request, url_for, redirect, Flask
app = Flask(__name__)
@app.route('/redirect_url')
def redirect_url():
next = request.args.get("next") or url_for('index')
return redirect(next)
@app.route('/echo_url')
def echo_url():
return request.base_url
flask.request常用的属性有:
示例:url: http://127.0.0.1:5000/app/page.html?x=y
base_url: 全路径
path: /page.html
script_root: /app
url: 全url
url_root: http://localhost:5000/app/page.html
其他客户端数据的访问方法:
args:访问url中的查询参数, 可以通过get方法获取不同的参数
cookie: 访问从客户端传送的cookie,以键值对的方式读写
headers: 以键值对的方式读写
data: 当以Flask位置的MIMETYPE类型提交数据时, data属性用于以字符串形式保存锁提交的数据。
Files: 访问通过http post或者put请求想服务器上传的文件信息。由于一次提交可以上传多个文件,所以本属性是FileStorage类型对象的集合。可以直接调用FileStorage的save()函数将上传的文件数据保存在文件系统中。
method: 获取本地访问的http请求方式。
json: 如果客户端提交的是JSON数据,则可以通过本方法进行解析。可以通过http头mimetype来判断所提交的数据是否是json格式,当mimetype=“application/json”时, 数据为json类型
- 应用全局对象
应用全局对象是通过flask.g来实现的。可以在其中保存开发者需要的任何数据。
数据库的链接是一个典型的应用,在一个网站中,通常需要实现如下的逻辑:
(1)在请求中第一次需要使用数据库的时候,建立数据库连接对象,并进行使用;
(2)在同一个请求后的额任何需要用到数据库的操作,都是前面已经建立好的数据库连接进行操作;
(3)当请求完成时,框架自动关闭数据库连接,有效的使用系统资源。
from flask import g
from flask import Flask, render_template, redirect, abort, request
app = Flask(__name__)
class MyDB():,
def __init__(self):
print("create connect mysql.")
def close(self):
print("close connect database.")
def connect_to_database():
return MyDB()
def get_db():
db = getattr(g, '_database', None)
if db is None:
db = connect_to_database()
g._database = db
return db
@app.teardown_request
def teardown_db(response):
db = getattr(g, "_database", None)
if db is not None:
db.close()
before_request :在请求收到之前绑定一个函数做一些事情。
after_request: 每一个请求之后绑定一个函数,如果请求没有异常。
teardown_request: 每一个请求之后绑定一个函数,即使遇到了异常。
比如,before_request 的时候创建一个 db 连接,然后 teardown_request 的时候断开这个连接.
本文由 Mr Gu 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 8, 2018 at 12:05 pm