flask综合整理2
session功能
首先我们知道session可以理解是一把钥匙,它存在在服务器上,其实在flask中也有session
1.系统自带的session
from flask import session import json app=Flask(__name__,template_folder='templates',static_path='/static/',static_url_path='/static/') app.debug=True #设置session加密 app.secret_key='sjehfjeefrjewth43u' #指定json编码格式 如果为False 就不使用ascii编码, app.config['JSON_AS_ASCII']=False app.config['JSONIFY_MIMETYPE'] #指定浏览器渲染的文件类型,和解码格式;="application/json;charset=utf-8" @app.route('/login/',methods=['GET','POST']) def login(): msg = '' if request.method=='POST': name=request.values.get('user') pwd=request.values.get('pwd') if name =='zhanggen' and pwd=='123.com': session['user']=name #设置session的key value return redirect('/index/') else: msg='用户名或者密码错误' return render_template('login.html',msg=msg) @app.route('/index/',methods=['GET','POST']) def index(): user_list = ['张根', 'egon', 'eric'] user=session.get('user') #获取session if user: user=['alex','egon','eric'] return jsonify(user_list) else: return redirect('/login/') if __name__ == '__main__': app.run() Flask自带session功能
2.第三方session插件
安装 pip install flask-session
from flask import session, Flask,request,make_response,render_template,redirect,jsonify,Response #引入第三方session from flask.ext.session import Session import json app=Flask(__name__,template_folder='templates',static_path='/static/',static_url_path='/static/') app.debug=True #设置session加密 app.secret_key='sjehfjeefrjewth43u' app.config['JSON_AS_ASCII']=False #指定json编码格式 如果为False 就不使用ascii编码, app.config['JSONIFY_MIMETYPE'] ="application/json;charset=utf-8" #指定浏览器渲染的文件类型,和解码格式; app.config['SESSION_TYPE']='redis' from redis import Redis #引入连接 redis模块 app.config['SESSION_REDIS']=Redis(host='192.168.0.94',port=6379) #连接redis Session(app) @app.route('/login/',methods=['GET','POST']) def login(): msg = '' if request.method=='POST': name=request.values.get('user') pwd=request.values.get('pwd') if name =='zhanggen' and pwd=='123.com': session['user']=name #设置session的key value return redirect('/index/') else: msg='用户名或者密码错误' return render_template('login.html',msg=msg) @app.route('/index/',methods=['GET','POST']) def index(): user_list = ['张根', 'egon', 'eric'] user=session.get('user') #获取session if user: user=['alex','egon','eric'] return jsonify(user_list) else: return redirect('/login/') if __name__ == '__main__': app.run() 把session存到redis
蓝图
蓝图你可以理解为是一个启动不了了的flask的实例,不多说上实例自己看
这个是我们的蓝图目录
#views.py文件中写 from flask import Blueprint # 导入 Flask 中的蓝图 Blueprint 模块 from flask import render_template sv = Blueprint("sv", __name__, template_folder="sv_template", # 每个蓝图都可以为自己独立出一套template模板文件夹,如果不写则共享项目目录中的templates static_folder="sv_static" # 静态文件目录也是可以独立出来的 ) # 实例化一个蓝图(Blueprint)对象(切记!!!!!!注册!!!!!!!!!!!!!!!!) @sv.route("/svlist") def view_list(): return render_template("svlist.html")
#s4app.html中写入 from flask import Blueprint # 导入 Flask 中的蓝图 Blueprint 模块 from flask import render_template sv = Blueprint("sv", __name__, template_folder="sv_template", # 每个蓝图都可以为自己独立出一套template模板文件夹,如果不写则共享项目目录中的templates static_folder="sv_static" # 静态文件目录也是可以独立出来的 ) # 实例化一个蓝图(Blueprint)对象 @sv.route("/svlist") def view_list(): return render_template("svlist.html")
这样我们打开浏览器看到的就是我们的页面,这就是蓝图,他有自己的模板文件,只要被注册了就一定会生效,当然了,蓝图内部的视图函数route不雅重复,这是前辈踩的坑,不信你自己试试
message (闪现)
message是一个基于Session实现的用于保存数据的集合,其特点是:一次性。
特点:和labada匿名函数一样不长期占用内存
from flask import Flask,request,flash,get_flashed_messages app = Flask(__name__) app.secret_key = 'some_secret' @app.route('/set/') def index2(): flash('Disposable') #在message中设置1个个值 return 'ok' #--------------------------------------------------------------------------------- @app.route('/') def index1(): messages = get_flashed_messages() #获取message中设置的值,只能获取1次。(1次性) print(messages) return "Index1" if __name__ == "__main__": app.run() flask_message
中间件
flask也有中间件功能和Django类似,不同的是使用的是使用3个装饰器来实现的;
1.@app.before_first_request :请求第1次到来执行1次,之后都不执行;
2.@app.before_request:请求到达视图之前执行;(改函数不能有返回值,否则直接在当前返回)
3.@app.after_request:请求 经过视图之后执行;(最下面的先执行)
#!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, Request, render_template app = Flask(__name__, template_folder='templates') app.debug = True @app.before_first_request #第1个请求到来执行 def before_first_request1(): print('before_first_request1') @app.before_request #中间件2 def before_request1(): Request.nnn = 123 print('before_request1') #不能有返回值,一旦有返回值在当前返回 @app.before_request def before_request2(): print('before_request2') @app.errorhandler(404) def page_not_found(error): return 'This page does not exist', 404 @app.route('/') def hello_world(): return "Hello World" @app.after_request #中间件 执行视图之后 def after_request1(response): print('after_request1', response) return response @app.after_request #中间件 执行视图之后 先执行 after_request2 def after_request2(response): print('after_request2', response) return response if __name__ == '__main__': app.run()
参考地址:https://www.cnblogs.com/heshun/p/10256443.html