模板
# 之前学的完全一样,for,if, # 模板语言支持函数加括号执行 # 模板有没有处理xss攻击,在页面显示标签,内部怎么实现的? -1 模板层 要渲染的字符串|safe -2 后端:Markup('<input type="text">') # Markup等价django的mark_safe , # extends,include一模一样
定义全局模板公共方法
注意:在蓝图中注册时候,应用范围只有本蓝图。
mb_test.py
from flask import Flask, render_template app=Flask(_name_,) @app.template_global() # 模板中调用方法:{{ func("赵海宇") }} def func(arg): return'海狗子' + arg @app.template_filter() # 模板中调用方法:{{ "赵海宇"|x1() }} def x1(arg): return'海狗子' + arg @app.route('/md/hg') def index(): return render_template('md_hg.html') if __name__ == 'main': app.run()
md_hg.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>MDHG</h1> {{ func("赵海宇") }} {{ "赵海宇"|x1() }} </body> </html>
flask特殊装饰器
before_request 请求来的时候先执行before_request装饰的函数,再执行视图,不能有返回值
after_request 请求走的时候执行,需要返回值response
from flask import Flask, render_template app = Flask(__name__) @app.before_request def f1(): print('f1') @app.after_request def f10(response): print('f10', '----->', response) return response @app.route('/index') def index(): print('index') return render_template('index.html') if __name__ == '__main__': app.run()
注意:before和after request可以在蓝图中定义,在蓝图中定义的话,作用域只在本蓝图。
装饰器小细节
from flask import Flask, render_template app = Flask(__name__) @app.before_request def f1(): print('f1') @app.after_request def f10(args): print('f10', '----->', args) return args def x1(): print('x1') app.before_request(x1) # before_request或者after_request也可以这样玩 @app.route('/index') def index(): print('index') return render_template('index.html') if __name__ == '__main__': app.run()
request对象的属性和方法
参考:https://www.cnblogs.com/pure3417/p/14799899.html
# request.method 提交的方法 # request.args get请求提及的数据,使用:request.args.get('pk') # request.form post请求提交的数据,使用:request.form.get('name') # request.values post和get提交的数据总和 # request.cookies 客户端所带的cookie # request.headers 请求头 # request.path 不带域名,请求路径 # # request.full_path 不带域名,带参数的请求路径 # request.url 带域名带参数的请求路径 # request.base_url 带域名请求路径 # request.url_root 域名 # request.host_url 域名 # request.host 127.0.0.1:500 # request.files # obj = request.files['the_file_name'] # obj.save('/var/www/uploads/' + secure_filename(f.filename))
响应对象方法
# 响应对象 # 响应相关信息 # return "字符串" # return render_template('html模板路径',**{}) # return redirect('/index.html') # 对着django,JsonResponse # return jsonify({'k1':'v1'}) aa='hello world' res=make_response(aa) res.set_cookie('xxx','lqz') # 往响应头中放东西 res.headers['X-Something'] = 'A value' print(type(res)) from flask.wrappers import Response return res # response = make_response(render_template('index.html')) # response是flask.wrappers.Response类型 # response.delete_cookie('key') # response.set_cookie('key', 'value') # response.headers['X-Something'] = 'A value' # return response # return 'hello'
补充:
varchr :65535个字节的数据 -utf8:中文2个字节,varchar(300) -utf8mb4:3个字节,varchar(300) # 快速导出requestment.txt pip3 install pipreqs # pipreqs ./ --encoding=utf-8
cookie和session
res=make_response('hello world') res.set_cookie('xxx','lqz') # 设置cookie res.delete_cookie('key') # 删除 # 全局导入 # 视图函数中 session['key']=value # 删除:session.pop('key') # 取:session['key'] # open_session # save_session 注意事项: # session需要配置secret_key app.secret_key = 'sdfsdf' 示例: from flask import Flask,session app = Flask(__name__) app.secret_key = 'sdfsdf' @app.route('/') def index(): session['k1'] = 'v1' if __name__ == '__main__': app.run()
请求扩展
# 请求扩展类似django中的中间件 # 1 请求来了就会触发,类似于django的process_request, 如果有多个,顺序是从上往下 @app.before_request def before(*args, **kwargs): if request.path=='/login': return None else: name=session.get('user') if not name: return redirect('/login') else: return None # 2 # 请求走了就会触发,类似于django的process_response,如果有多个,顺序是从下往上执行 @app.after_request def after(response): print('我走了') return response #3 before_first_request 项目启动起来第一次会走,以后都不会走了,也可以配多个(项目启动初始化的一些操作) @app.before_first_request def first(): print('我的第一次') # 4 每次视图函数执行完了都会走它,# 用来记录出错日志 @app.teardown_request # 用来记录出错日志 def ter(e): print(e) print('我是teardown_request ') # 5 errorhandler绑定错误的状态码,只要码匹配,就走它 @app.errorhandler(404) def error_404(arg): return render_template('error.html',message='404错误') # 6 全局标签 @app.template_global() def sb(a1, a2): return a1 + a2 # 在模板中:{{ sb(3,4) }} # 7 全局过滤器 @app.template_filter() def db(a1, a2, a3): return a1 + a2 + a3 # 在模板中{{ 1|db(2,3)}} 1 before_request 请求来时执行,和django中间件中的process_request类似 2 after_request,请求走时执行,接收response参数,需要return response 3 注意有多个的情况,执行顺序;before_request 从上往下;after_request从下网上 4 before_request请求拦截后,也就是有return值,如果返回一个response对象则直接返回不在往下执行,但是所有的after_request都会执行。这一点和django中间件的process_response不同