首页 > 代码库 > Flask 高效开发实战-flask1

Flask 高效开发实战-flask1

在模板渲染中,使用Markup转换变量中的特殊字符

from flask import Markup

Markup函数对字符串进行转移处理再传递给render_template()函数

在浏览器中显示标签代码

路由地址的反响生成

通过函数名获得与其绑定的Url地址

需要使用url_for函数进行反向解析

with app.text_request_context()
    print(url_for(f_root)) # 输出:/
app.text_request_context()方法告诉解释器为在其作用域中的代码模拟一个HTTP请求上下文,使其好像被一个HTTP请求所调用

使用Context上下文
他是服务器端获得应用及请求相关信息的对象
1、会话上下文
会话(session)是一种客户端与服务器端保持状态的解决方案,会话上下文是用来实现这种解决方案的存储结构
from flask import Flask,session
from datetime import datetime

app = Flask(__name__)

app.secret_key = SET_ME_BEFORE_USE_SESSION


@app.route(/)
def hello_world():
    return Hello World!

@app.route(/write_session)
def wirteSession():
    session[key_time]=datetime.now().strftime(%Y-%m-%d %H:%M:%S)# 将当前时间保存在Session中
    return session[key_time] # 返回当前时间
@app.route(/read_session)
def readSession():
    return session.get(key_time)# 获取上次调用wirteSession时写入的时间并返回

除了正常的数据保存和读取,flask.session对象还维护自身的状态,通过

new 判断本次请求的Session是否时新建的

modified 判断本次请求中是否修改过Session键值

@app.route(/write_session)
def wirteSession():
    session[key_time]=time.time() # 将当前时间保存在Session中
    return session.modified # 因为之前进行了Session设置,所以判断本次请求是否被修改过(modified)返回TRUE

应用全局对象

from flask import Flask,g

class MYDB():
    def __init__(self):
        print(一个数据库链接已经建立)

    def close(self):
        print(数据库已经关闭)

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 # 存入Flask.g对象中
    return db

@app.teardown_request # 在请求结束时自动被Flask框架调用
def teardown_db(response):
    db = getattr(g,_database,None)# 从Flask.g对象中获取对象,检查是否有链接数据库对象,如果有则关闭
    if db is not None:
        db.close()
可以在请求处理函数的任何地方调用get_db()
class MYDB():
    def __init__(self):
        print(一个数据库链接已经建立)

    def close(self):
        print(数据库已经关闭)

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 # 存入Flask.g对象中
    return db

@app.teardown_request
def teardown_db(response):
    db = getattr(g,_database,None)# 从Flask.g对象中获取对象
    if db is not None:
        db.close()
def login():
    db=get_db()  # 第一次调用getdb  创建数据库链接
    session[has_login]=True
    # 使用db检查数据库中的用户名和密码
def view_list():
    if has_login not in session:
        login()
    db = get_db() # 第二次调用get_db()# 直接复用之前建立的链接
    # 使用db 从数据库查询数据,返回teardown_db()将会被自动调用

请求上下文

主要是在服务端获得从客户端提交的数据,包括url参数,表单数据,cookies等

from flask import Flask,request,url_for,redirect

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

request的属性

下面是request可使用的属性,其中黑体是比较常用的。

  • form 
    一个从POST和PUT请求解析的 MultiDict(一键多值字典)。

  • args 
    MultiDict,要操作 URL (如 ?key=value )中提交的参数可以使用 args 属性:

searchword = request.args.get(‘key‘, ‘‘)
  • values 
    CombinedMultiDict,内容是formargs。 
    可以使用values替代form和args。

  • cookies 
    顾名思义,请求的cookies,类型是dict。

  • stream 
    在可知的mimetype下,如果进来的表单数据无法解码,会没有任何改动的保存到这个·stream·以供使用。很多时候,当请求的数据转换为string时,使用data是最好的方式。这个stream只返回数据一次。

  • headers 
    请求头,字典类型。

  • data 
    包含了请求的数据,并转换为字符串,除非是一个Flask无法处理的mimetype。

  • files 
    MultiDict,带有通过POST或PUT请求上传的文件。

  • environ 
    WSGI隐含的环境配置。

  • method 
    请求方法,比如POST、GET。

  • path

  • script_root
  • url
  • base_url
  • url_root 
    如果用户请求如下URL: 
    http://www.example.com/myapplication/page.html?x=y 
    以上的参数内容如下:
名称内容
path /page.html
script_root /myapplication
base_url http://www.example.com/myapplication/page.html
url http://www.example.com/myapplication/page.html?x=y
url_root http://www.example.com/myapplication/
    • is_xhr 
      如果请求是一个来自JavaScript XMLHttpRequest的触发,则返回True,这个只工作在支持X-Requested-With头的库并且设置了XMLHttpRequest

    • blurprint 
      蓝本名字。

    • endpoint 
      endpoint匹配请求,这个与view_args相结合,可是用于重构相同或修改URL。当匹配的时候发生异常,会返回None。

    • get_json(force=False, silent=False, cache=True)

    • json 
      如果mimetypeapplication/json,这个参数将会解析JSON数据,如果不是则返回None。 
      可以使用这个替代get_json()方法。

    • max_content_length 
      只读,返回MAX_CONTENT_LENGTH的配置键。

    • module 
      如果请求是发送到一个实际的模块,则该参数返回当前模块的名称。这是弃用的功能,使用blueprints替代。

    • on_json_loading_failed(e)
    • routing_exception = None 
      如果匹配URL失败,这个异常将会/已经抛出作为请求处理的一部分。这通常用于NotFound异常或类似的情况。

    • url_rule = None 
      内部规则匹配请求的URL。这可用于在URL之前/之后检查方法是否允许(request.url_rule.methods) 等等。 
      默认情况下,在处理请求函数中写下 
      print(‘request.url_rule.methods‘, request.url_rule.methods) 
      会打印:

      request.url_rule.methods {‘GET’, ‘OPTIONS’, ‘HEAD’}

    • view_args = None 
      一个匹配请求的view参数的字典,当匹配的时候发生异常,会返回None。

Flask 高效开发实战-flask1