首页 > 代码库 > 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,内容是form
和args
。
可以使用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
如果mimetype
是application/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