这两天稍微接触了一点 Flask 框架,所以分享点基础
1. 配置文件
from flask import Flask app = Flask(__name__) # 使用自定义的配置文件 app.config.from_object('settings.Config') """
# 内部原理 : con = 'settings.Config' - a,b = con.rsplit('.',maxsplit=1) # 将字符分割 - m = importlib.import_module(a) # 导入settings模块 - class = getattr(m.b) # 拿到settings下的类 """ @app.route('/index') def index(): return 'index' if __name__ == '__main__': # print(app.config) # 打印 Flask 下的配置属性 app.run() ################### 配置文件.py #################### class Config(object): DEBUG = False class ProductionConfig(Config): # 线上环境使用的配置 DEBUG = False class DevelopmentConfig(Config): # 开发环境下使用 DEBUG = True
2. 路由系统
from flask import Flask,render_template,request,redirect,session,url_for app = Flask(__name__) """ endpoint=名字 这个名字就指代了当前视图函数的 url 地址 如果不写 endpoint 那么 url_for 反向解析的默认值就是当前视图函数的名字 - url_for('index') """ # @app.route('/index',methods=['GET','POST'],endpoint='q1') @app.route('/index/<int:nid>',methods=['GET','POST']) def index(nid): """ nid -- 接收上面 url 中的参数 接收参数类型: - @app.route('/index<username>') # 字符 - @app.route('/index<int:nid>') # 整数 - @app.route('/index<float:nid>') # 浮点 - @app.route('/index<path:path>') # 路径 :param nid: :return: """ # print(url_for('q1')) # 反向解析 url : /index # print(url_for('index')) # 默认 函数名 : /index # print(url_for('index',nid=333)) # /index/333 return 'INDEX' if __name__ == '__main__': app.run()
3. 请求和响应
from flask import Flask, render_template, request, redirect, session, url_for, jsonify, make_response app = Flask(__name__) @app.route('/index', methods=['GET', 'POST']) def index(): """ 常用 响应方式 return 'INDEX' return jsonify({'k1':k2}) return render_template() return redirect() :return: """ # 设置响应头 obj = make_response('Index') # 把要返回的字符串,封装到对象中 obj.headers['headers_q'] = 'xxx' obj.set_cookie('k1','v1') return obj if __name__ == '__main__': app.run()
4. 模板
""" 模板渲染: - 1. 标签解析: 方式一:{{txt|safe}} 方式二:MarpUp -- Markup("<input type='text' />") - 2. 在模板进行函数调用 方式一:自定义一个函数,然后变成参数传递 -- {{fn(7)}} 方式二:使用 @app.template_global() 来定义一个全局的函数,在所有模板都可用(加括号) -- {{fn1(1,2)}} 方式二:使用 @app.template_filter() 来定义一个全局的函数,在所有模板都可用(加括号) -- {{4|fn2(6,7)}} - 3. 模板继承: - 父模板:{% block content %} {% endblock %} - 子模版:{% extends 'base.html' %} {% block content %} {% endblock %} - 4. 在模块中定义 宏 {% macro a(name,type='text',value='') %} <h1>宏</h1> <input type="{{type}}" name="{{name}}" value="{{value}}"> {% endmacro %} {{a('q')}} """ from flask import Flask,render_template,request,redirect,session,url_for,jsonify,make_response,Markup,flash,get_flashed_messages app = Flask(__name__) # 全局函数(加括号) - 可以任何模板中使用 @app.template_global() def fn1(a1,a2): return a1+a2 # 参数放的方式不一样,可以用于判断条件 @app.template_filter() def fn2(a1,a2,a3): return a1+a2+a3 def fn(arg): return arg @app.route('/index',methods=["GET","POST"]) def index(): print('index') info = { 'lis':[1,2,3], 'txt':"<input type='text' />", 'txt1':Markup("<input type='text' />"), 'fn':fn } return render_template('models.html',**info) if __name__ == '__main__': app.run()
5. session 简单了解
""" # 当请求刚到来的时:flask 读取cookie 中对应的值,将值解密,并放反序列化成字典,放入内存,以便视图函数使用 # 当请求结束时,flask 会读取内存中字典的值,进行序列化和加密,写入 Cookie 中 - 只能取一次 session 值: from flask import Falsk, flash, get_fiashed_messages flash('k1') -- 存放一个值到 session 中 - 可以分类: flash('k1','error') flash('k2','error') flash('k3','info') get_flashed_messages() -- 只能获取一次 session 的值 - 可以只拿分类中的数据 get_flashed_messages(category_filter=['error']) """
6. 特殊装饰器 -- 类似于 Django 中的中间件
from flask import Flask app = Flask(__name__) """ 执行顺序: 1. before -> Index -> after 2. before1 -> before2 -> Index -> after2 -> after1 3. before1(如果return) --> after2 -> after1 定制错误页面: @app.errorhandler(404) def not_found(arg): return xxx.html """ @app.before_request def x1(): print('before') @app.after_request def x2(response): print('after') return response @app.route('/index') def index(): print('index') return 'Index' if __name__ == '__main__': app.run()
7. 中间件
""" - call 触发条件: - 用户发起请求时执行 """ from flask import Flask app = Flask(__name__) 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()
持续更新...