flask基本使用1
一、flask获取以及传递参数给浏览器
request.args # get方法获取参数 request.form # post方法获取参数 传递参数(与django只能传递字典有些不同) request render_template("login.html", error="y用户名或密码错误") request render_template("login.html", **{"error":"y用户名或密码错误"})
二、flask自设置配置文件
app.py程序文件 from flask import Flask, render_template, request,redirect, session app = Flask(__name__) app.config.from_object("settings.Dev") if __name__ == '__main__': app.run() # from_object引用配置文件里的配置。 settings.py配置文件 class Base: DEBUG = True class Dev(Base): DEBUG = True TEST = True class Pro(Base): DEBUG = False TEST = False # settings.py配置文件设置基本的参数,不同环境再通过继承的方式修改或添加相应的配置,不同的环境可通过class的名称区分。
三、flask的路由
反射生成url(endpoint+url_for)
from flask import Flask from flask import url_for app = Flask(__name__) @app.route("/index",methods=["GET"],endpoint="n1") def index(): print(url_for("n1")) return "index" 或者不写endpoint,直接指向函数名称 @app.route("/index",methods=["GET"]) def index(): print(url_for("index")) return "index" # flask的endpoint相当于django urls.py文件中的name,url_for相当于reverse
四、url传参
from flask import Flask, render_template, request,redirect, session, url_for app = Flask(__name__) app.config.from_object("settings.Dev") @app.route("/index/<int:nid>",methods=["GET"]) def index(nid): print(nid) # 直接取出参数 print(url_for("index", nid=777)) # 取出参数后,再加上反射 return "index" # 访问http://127.0.0.1:5000/index/1111111 # console返回 1111111 /index/777
默认有以下五种传参方式
@app.route("<str>") @app.route("<int:nid>") @app.route("<float:post_id>") @app.route("<path:path>") @app.route("/login",methods=["GET","POST"]) # django2.0以后同样也可采用此方式
请求的基本参数
# 请求相关信息 # request.method # request.args # request.form # request.values # request.cookies # request.headers # request.path # request.full_path # request.script_root # request.url # request.base_url # request.url_root # request.host_url # request.host # request.files # obj = request.files['the_file_name'] # obj.save('/var/www/uploads/' + secure_filename(f.filename))
五、响应头
返回json obj = {"id":1,"name":"jack"} return josonify(obj) 自定制响应头 obj = make_respone("") obj.headers["xxxx"] = 123 return obj # 在response header中添加自定义响应头 设置cookie @app.route('/set_cookie') def set_cookie(): response=make_response('Hello World'); response.set_cookie('Name','Hyman') return response
#获取cookie
@app.route('/get_cookie')
def get_cookie():
name = request.cookies.get('passwd')
return name
#删除cookie
@app.route('/del_cookie')
def del_cookie():
resp = make_response('delete_cookie')
resp.delete_cookie('passwd')
return resp
#设置cookie
@app.route('/set_cookie')
def set_cookie():
resp = make_response('set_cookie')
resp.set_cookie('passwd', '123456')
return resp
六、添加登陆
版本一:# 一般不用 @app.route('/index') def index(): if not session.get('user'): return redirect(url_for('login')) return render_template('index.html',stu_dic=STUDENT_DICT) 版本二:# 如果需要对个别地址添加登陆,需要使用此方法 import functools def auth(func): @functools.wraps(func) # 将装饰的方法的属性返回,而不是返回装饰器内部函数的属性 def inner(*args,**kwargs): if not session.get('user'): return redirect(url_for('login')) ret = func(*args,**kwargs) return ret return inner @app.route('/index') @auth def index(): return render_template('index.html',stu_dic=STUDENT_DICT) 应用场景:比较少的函数中需要额外添加功能。 版本三:before_request @app.before_request def xxxxxx(): if request.path == '/login': return None if session.get('user'): return None return redirect('/login')
七、session
当请求刚到来:flask读取cookie中session对应的值:eyJrMiI6NDU2LCJ1c2VyIjoib2xkYm95,将该值解密并反序列化成字典,放入内存以便视图函数使用。 视图函数: @app.route('/ses') def ses(): session['k1'] = 123 session['k2'] = 456 del session['k1'] return "Session"
当请求结束时,flask会读取内存中字典的值,进行序列化+加密,写入到用户cookie中。
八、闪现
在session中存储一个数据,在取出时,用pop取出并且移除;可以将数据分组,并且按照分组取出
from flask import flash, get_flashed_messages @app.route("/f1") def fla(): flash("这是一个闪现","error") flash("hahahha","error") flash("123123123","info") return "flash1" @app.route("/f2") def fla2(): print(get_flashed_messages(category_filter=["error"])) print("--------------------------") return "flash2" 先访问/f1,在访问/f2 返回结果: ["这是一个闪现","hahahha"]
九、中间件
- call方法,当用户发起请求时候,执行__call__方法,此前一直处于端口监听状态
class Middleware(object): def __init__(self,old): self.old = old def __call__(self, *args, **kwargs): ret = self.old(*args, **kwargs) return ret if __name__ == '__main__': app.wsgi_app = Middleware(app.wsgi_app) app.run() # 将flask的wsgi继承,并重新修饰
常见的中间件
- before_request # 谁先定义,谁先执行 - after_request # 谁后定义,谁先执行 - before_first_request # 在函数处理前执行,只执行一次 - template_global - template_filter - errorhandler(404)
# 一个请求处理中,中间件可以有多个before_request和after_request
flask中before_request和after_request的执行顺序。
django1.10之前,如果x1直接return返回结果,中间件的执行顺序和flask相同,>=1.10之后,对请求的处理如紫色箭头表示,flask如绿色箭头所示。