Flash网站微架构学习(二)

in Python with 0 comment

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值和读的值是一样的。
1.png

2.png

除了正常的数据保存和读取,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 的时候断开这个连接.

Responses