flask 基础语法学习
回顾
#6行flask from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "HelloWorld!!" app.run()
1.response
from flask import render_template,redirect,send_file,jsonify return =httpresponse render_template redirect 特殊返回值 1.send_file(文件路径) 打开文件并返回文件内容 Content-Type 文件类型 自动识别 2.jsonify({k:v}) Content-Type:application/json app.config["JSONIFY_MIMETYPE"]
2.request
request.method 请求方式 request.args url参数 print(request.args.to_dict())#转换成字典 request.form FormData 数据 request.json #请求头 Content-Type:application/json 数据序列化至此 request.data 只要请求体中有内容 b"” request.files 接收FormData中的文件
3.session
from flask import session app.secret_key="123213" session["user"]="username"
4.路由
动态参数 @app.route("/detail/<stu_id>") def detail(stu_id) 1.endpoint Flask Mapping 路由和视图的指向 2.methods 允许进入视图函数的请求方式
5.初始化配置
Flask(__name__) 中 1.template_folder 模版存放路径 2.static_folder 静态文件存放路径 3.static_url_path 金泰文件访问路径
6.config对象 正式测试环境
2.Flask对象配置 app.config == app.default_config 查看默认配置 及 配置项 class Obj(object): DEBUG = True app.config.from_object(Obj) # 记住
7.蓝图
Flask蓝图 Blueprint: bp.py from flask import Blueprint # 把Blueprint理解为 不能被 Run 的 Flask 对象 bp = Blueprint("bp",__name__,url_prefix="/user") @bp.route("/bp",methods=["GET","Post"]) def my_bp(): return "I am bp in user.py" __init__py from flask import Flask from .views import add def create_app(): app=Flask(__name__) app.register_blueprint(add.add) return app app.py: from flask import Flask from user import bp from acc import acc app = Flask(__name__) app.register_blueprint(bp) app.register_blueprint(acc) if __name__ == '__main__': app.run(debug=True)
8.特殊装饰器 中间件
@app.before_request # 在请求进入视图函数之前 @app.after_request # 结束视图函数之后,在响应返回客户端之前 def af5(ret): 正常 be1 - be2 - vf - af5 - af4 - af3 - af2 - af1 异常 be1 - af5 - af4 - af3 - af2 - af1 @app.errorhandler(404) def error404(error_message):
9.CBV
from flask import views class Login(views.MethodView): def get(self): pass def post(self): pass app.add_url_rule("/login",endpoint=None,view_func=Login.as_view(name="login")) endpoint == as_view(name="login") 中的 "login"
jianjin2 模版
{{}} 引用 执行函数 {%%} 逻辑代码 {{ stu_list[0].name }}{{ stu_list.0.age }} {{ stu_dict }} {% for stu in stu_list %} <p>{{ stu.name }}{{ stu.get("age") }}{{ stu["gender"] }}</p> {% endfor %} #if判断 {% if v["gender"] == "中" %} 男 {% else %} {{ v["gender"] }} {% endif %} 自定义标签simple_tag @app.template_global()#全局使用 可选 def ab(a,b): return a+b html中引入 {{ ab(4,4) }} 前端执行html @app.route("/") def index(): tag = "<input type='text' name='user' value='xiao'>" return render_template("index.html",tag=tag) <body> {{ tag|safe }} </body> 后端执行html from flask import Markup # 导入 flask 中的 Markup 模块 @app.route("/") def index(): tag = "<input type='text' name='user' value='xiao'>" # Markup帮助咱们在HTML的标签上做了一层封装,让Jinja2模板语言知道这是一个安全的HTML标签 markup_tag = Markup(tag) print(markup_tag,type(markup_tag)) return render_template("index.html", tag=markup_tag) 母板 index.html <body> <h1>Welcome to My</h1> <h2>下面的内容是不一样的</h2> {% block content %} {% endblock %} <h2>上面的内容是不一样的,但是下面的内容是一样的</h2> <h1>My is Good</h1> </body> login.html {% extends "index.html"%} {% block content %} {% endblock %} include jinja2 login.html <h4>欢迎登陆</h4> <form> 用户名:<input type="text" name="user"> 密码:<input type="text" name="pwd"> <input type="submit" value="提交"> </form> index.html 文件中的内容 <body> <h1>Welcome to My</h1> {% include "login.html" %} <h2>上面的内容是不一样的,但是下面的内容是一样的</h2> <h1>My is Good</h1> </body>
flask 上下文管理
分为3个阶段
1,请求进来时,将请求相关的数据放入上下问管理中
2,在视图函数中,要去上下文管理中取值
3,请求响应,要将上下文管理中的数据清除
详细点
请求刚进来, 将request,session封装在RequestContext类中,app,g封装在AppContext类中
并通过LocalStack将requesttext和appcontext放local类中
2,视图函数中,通过localproxy-->偏函数-->locastack-->local取值
3,请求响应时,先执行save.session()在各自执行pop(),将local中的数据清楚
http://www.cnblogs.com/zhaopanpan/p/9457343.html
不怕大牛比自己牛,就怕大牛比自己更努力