一. Flask的启动
from flask import Flask app = Flask(__name__) app.run()
from flask import Flask app = Flask(__name__) @app.route("/index") # 路由 def index(): # 视图 return "Hello World!" app.run()
二. Flask的响应
from flask import template_render, redirect
1. 和djangp对应的response
HTTPResponse return 返回字符串
render template_render 返回html页面
redirect redirect 重定向
2. Flask封装的response
send_file("src") 打开并返回文件内容, 响应头Content-Type: 文件类型/格式
jsonify({k:v}) 返回一个json格式字符串, Content-Type:application/json
三. Flask的请求
from flask import request
request.method 请求方式get post
request.args 获取url中的参数, 本质上可以理解为字典 to_dict()
request.form 获取FormData中的数据, 本质上可以理解为字典 to_dict()
request.files 获取FormData中的文件数据, 是一个FileStorage对象 save(文件路径)
request.values 获取请求体中的原始数据, byte类型
request.path 获取当前访问路径
四. Flask的模板Jinja2
{{ 变量 }}
{% 逻辑 %}
五. Flask的路由
1. 创建路由的两种方式
from flask import Flask app = Flask(__name__) @app.route("/index") # 第一种添加路由的方式 def index(): return "This is index" app.add_url_rule("/index", view_func=index) if __name__ == "__main__": app.run()
from flask import Flask, views app = Flask(__name__) class Index(views.MethodView): methods = [] decorators = [] def get(self): return "get请求" def post(self): return "post请求" app.add_url_rule("/index", view_func=Index.as_view(name=""index)) app.run()
2. 路由的配置参数
methods = [get, post] 允许执行视图函数的请求方式
endpoint = "xxx" 路由Mapping, 类似别名, url_for(endpoint), 反向解析url地址
strict_slashes=True 是否严格遵循路由匹配 - "/"结尾 默认值是 True 必须严格遵循
defaults={"nid":3} 默认路由参数 - 视图函数中必须有一个nid(key)的形参接收
redirect_to="/index" 永久重定向 301/?308 - 不进入试图函数处理,直接跳转
3. 路由的动态参数
@app.route("/getImg/<path>/<filename>") def get_img(path, filename): file_path = os.path.join(path, filename) return send_file(file_path)
六. Flask的配置
1. Flask初始化配置
app = Flask(__name__)
template_folder="templates" 指定模板存放路径
static_folder="static" 指定静态文件存放路径
static_url_path=None 指定静态文件访问路径, 前端拼路径时用, 默认为 "/" + static_folder
static_host=None 静态文件的存放服务器
2. Flask对象配置
app.default_config 默认配置, ImmutableDict类型
app.config["DEBUG"] = True 配置DEBUG
app.config.from_object(Obj) 从Obj类属性种导入
class Obj: DEBUG = Ture default_config = ImmutableDict({ 'ENV': None, 'DEBUG': None, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12), 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': False, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093, })
七. Flask的蓝图
蓝图Blueprint, 就是一个不能run的flask对象
1. 创建蓝图
from flask import Blueprint bp = Blueprint("bp", __name__, url_prefix="/bp") @bp.route("/index") def index(): return "这是bp蓝图中的index"
2. 注册蓝图
app.register_blueprint(pb)
八. Flask的特殊装饰器
1. 三个特殊装饰器
@app.before_request 执行视图函数之前, 所要装饰的函数
@app.after_request 执行完视图函数之后, 发出响应之前, 索要装饰的函数
@app.errorhandler(405) 重新定义错误返回信息, 只能定义错误状态码
2. 执行顺序
正常执行顺序: before_request1 => before_request2 => view_function => after_request2 => after_request1
异常执行顺序: before_request1 => after_request2 => after_request1