1.Flask app对象创建
参数初始化
# 创建flask的应用对象
# __name__表示当前的模块名字
# 模块名,flask以这个模块所在的目录为总目录,默认这个目录中的static为静态目录,templates为模板目录
app = Flask(__name__,
static_url_path="/python", # 访问静态资源的url前缀, 默认值是static
static_folder="static", # 静态文件的目录,默认就是static
template_folder="templates", # 模板文件的目录,默认是templates
)
配置文件的导入使用
# 1. 使用配置文件
app.config.from_pyfile("config.cfg")# 2. 使用对象配置参数
class Config(object):
DEBUG = True
SECRET_KEY = "qwertyuio"
app.config.from_object(Config)# 3. 直接操作config的字典对象
app.config["DEBUG"] = True
2.视图
视图中读取配置文件
from flask import Flask, current_app app.config.get() 或者 current_app.config.get() @app.route("/") def index(): """定义的视图函数""" # 读取配置参数 # 1. 直接从全局对象app的config字典中取值 # print(app.config.get("SECRET_KEY ")) # 2. 通过current_app获取参数 print(current_app.config.get("SECRET_KEY ")) return "hello flask"
methods 限定请求方式
@app.route("/post", methods=["GET", "POST"]) def post(): return "post page"
url_for 反解析
@app.route("/register") def register(): # url = "/" 使用url_for的函数,通过视图函数的名字找到视图对应的url路径 url = url_for("index") return redirect(url)
redirect() 重定向
from flask import redirect ,url_for @app.route("/register") def register(): #return redirect( "www.baidu.com") #return redirect(url_for("index"))
render_template() 重定向模板
from flask import render_template @front.route('/', methods=['GET', 'POST']) def index(): ... return render_template("index.html", form=form, essays=essays, pagination=pagination)
动态路由
要给 URL 添加变量部分,你可以把这些特殊的字段标记为 <variable_name> , 这个部分将会作为命名参数传递到你的函数。规则可以用 <converter:variable_name> 指定一个可选的转换器
#@front.route('/post/<id>', methods=['GET', 'POST']) #不加转换器类型 @front.route('/post/<int:id>', methods=['GET', 'POST']) #int 冒号后面的值为动态的 def post_essay(id): return
转换器有下面几种:
int | 接受整数 |
float | 同 int ,但是接受浮点数 |
path | 和默认的相似,但也接受斜线 |
abort()函数和异常的捕获
如果在视图函数执行过程中,出现了异常错误,我们可以使用abort函数立即终止视图函数的执行。通过abort函数,可以向前端返回一个http标准中存在的错误状态码,表示出现的错误信息。
使用abort抛出一个http标准中不存在的自定义的状态码,没有实际意义。如果abort函数被触发,其后面的语句将不会执行。其类似于python中raise。
from flask import Flask,abort @app.route('/') def hello_itcast(): abort(404) return 'hello itcast',999 #在Flask中通过装饰器来实现捕获异常,errorhandler()接收的参数为异常状态码。 #视图函数的参数,返回的是错误信息 @app.errorhandler(404) def error(e): return '您请求的页面不存在了,请确认后再次访问!%s'%e
获取请求参数
from flask import request
就是 Flask 中表示当前请求的 request 对象,request对象中保存了一次HTTP请求的一切信息
form表单 和data
# 127.0.0.1:5000/index?city=shenzhen&country=china 查询字符串 QueryString @app.route("/index", methods=["GET", "POST"]) def index(): # request中包含了前端发送过来的所有请求数据 # form和data是用来提取请求体数据 # 通过requset.form可以直接提取请求体中的表单格式的数据, 是一个类字典的对象 # 通过get方法只能拿到多个同名参数的第一个 name = request.form.get("name") age = request.form.get("age") name_li = request.form.getlist("name") # 如果是请求体的数据不是表单格式的(如json格式),可以通过request.data获取 print("request.data: %s" % request.data) # args是用来提取url中的参数(查询字符串) city = request.args.get("city") return "hello name=%s, age=%s, city=%s, name_li=%s" % (name, age, city, name_li)
cookies
# coding:utf-8 from flask import Flask, make_response, request app = Flask(__name__) @app.route("/set_cookie") def set_cookie(): resp = make_response("success") # 设置cookie, 默认有效期是临时cookie,浏览器关闭就失效 resp.set_cookie("onion", "Python") resp.set_cookie("onion1", "Python1") # max_age设置有效期,单位:秒 resp.set_cookie("onion2", "Python1", max_age=3600) resp.headers["Set-Cookie"] = "onion3=Python3; Expires=Sat, 18-Nov-2019 04:36:04 GMT; Max-Age=3600; Path=/" return resp @app.route("/get_cookie") def get_cookie(): c = request.cookies.get("onion") return c @app.route("/delete_cookie") def delete_cookie(): resp = make_response("del success") # 删除cookie resp.delete_cookie("onion1") return resp if __name__ == '__main__': app.run(debug=True)
session
# coding:utf-8 from flask import Flask, session, current_app app = Flask(__name__) # flask的session需要用到的秘钥字符串 app.config["SECRET_KEY"] = "dhsodfhisfhosdhf29fy989" # flask默认把session保存到了cookie中 @app.route("/login") def login(): # 设置session数据 session["name"] = "python" session["mobile"] = "18611111111" return "login success" @app.route("/index") def index(): # 获取session数据 name = session.get("name") return "hello %s" % name if __name__ == '__main__': app.run(debug=True)
请求钩子
在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接;在请求结束时,指定数据的交互格式。为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
before_first_request:在处理第一个请求前运行。
before_request:在每次请求前运行。
after_request:如果没有未处理的异常抛出,在每次请求后运行。
teardown_request:在每次请求后运行,即使有未处理的异常抛出
# coding:utf-8 from flask import Flask, session, current_app, request, url_for app = Flask(__name__) @app.route("/index") def index(): print("index 被执行") a = 1 / 0 return "index page" @app.route("/hello") def hello(): print("hello 被执行") return "hello page" @app.before_first_request def handle_before_first_request(): """在第一次请求处理之前先被执行""" print("handle_before_first_request 被执行") @app.before_request def handle_before_request(): """在每次请求之前都被执行""" print("handle_before_request 被执行") @app.after_request def handle_after_request(response): """在每次请求(视图函数处理)之后都被执行, 前提是视图函数没有出现异常""" print("handle_after_request 被执行") return response @app.teardown_request def handle_teardown_request(response): """在每次请求 (视图函数处理)之后都被执行, 无论视图函数是否出现异常,都被执行, 工作在非调试模式时 debug=False""" path = request.path if path == url_for("index"): print("在请求钩子中判断请求的视图逻辑: index") elif path == url_for("hello"): print("在请求钩子中判断请求的视图逻辑: hello") print("handle_teardown_request 被执行") return response if __name__ == '__main__': app.run()