flask基础二
昨日内容回顾:
Flask 短小精悍
稳定性相对较差
Django 大而全
造成一定的资源浪费
Flask
1.路由
@app.route("/",methods=("GET","POST"))
2.视图函数
@app.route("/",methods=("GET","POST"))
def index():
return "123"
3.返回值:
1.Response "yinwangba"
2.from flask import render_template
render_template return render_template("index.html") # 默认情况下模板存放在 templates
3.from flask import redirect
return redirect("/login")
4.request(全局变量,独有机制--Flask请求上下文管理)
存储数据:
request.args.get("name") url中取值
request.form.get("name") formdata取值
request.json # content-Type: app/json
request.data # content-Type: xiaowanba
request.values # 禁用
属性数据:
request.method
request.url
request.path "/login"
5.Jinja2
{{ 非逻辑的 引用变量 执行函数 被夹杂在for if }}
{% 逻辑代码 %}
macro 宏指令
6.Session
app.secret_key = "加密字符串"
session["user"] = "username"
加密session之后存放在cookies,
请求到来带上cookie 将session反序列化后拿到数值
今日内容:
1.装饰器基于session访问控制
endpoint可以解决视图函数重名的情况
昨天在访问视图函数的时候,我们加上了session的认证,
这个认证的功能是如果用户没有session,就说明用户没有登录,需要先让他登录才能让他访问。
但是如果我们有很多个视图函数,上面那两行代码就要写很多遍,这样就很麻烦。所以我们再写一个装饰器,这个装饰器用来专门坐验证。
装饰器写完了,那应该放在视图函数的哪呢?
这样装饰了一个视图函数可以,但是把这个装饰器同样装饰在了另一个函数上,就会报错,
这是因为同一个装饰器装饰在不同的视图函数时,重名了。
这时候需要这样一个参数endpoint,相当于给这个视图函数起了一个名字,
2.flask中的路由
那么flask中的路由是怎么动态传参的呢?
然后在访问的时候:
这样就传参成功了。
当然,也可以传一些其他的参数。
如果这样传了参数,就制定了传的参数就必须是int型,
之前还有一种路由的方式:app.add_url_rule("/",viewfunc=viewfunc),这种路由的参数和上面的路由的参数完全一样。
3.flask中的配置
1.Flask实例的配置 app配置 (我们在使用的时候去官网的官方文档去取,没必要记)
app.config["DEBUG"] = True
app.config.from_object(obj)
class obj():
DEBUG = True
SECERT_KEY = "123123"
2.初始化Flask实例时的配置
Flask(__name__)
1.static_url_path = "/static_folder" 访问静态目录文件时的地址 默认值是等于static_folder的名字
2.static_folder = "static" 静态文件的存放路径
3.template_folder='templates' 模板路径
4.Flask 中蓝图 插拔机制
如果现在没有功能还不完善,我想后期扩充功能,但又不想修改原来的
文件,该怎么办?
我们新建一个文件夹serv,在这个文件夹下新建一个py文件,起名为add_stu.py
这样一个蓝图构造完了之后,要记得在项目中注册,即在s1.py中注册:
5.三个特殊的装饰器:before_request ,after_request, errorheadler(404)
之前我们给视图函数加了一个认证的装饰器,
但是如果有很多视图函数,每个视图函数都要加上这么一句,显得麻烦。
接下来介绍一个before_request,
before_request:再请求进入视图函数之前作出处理
把认证的装饰器这样改了之后,就不需要在视图函数中写了,所有的请求在视图函数之前会走这个认证。
如果有多个before_request,会按照顺序执行。
打印结果:
先打印get_session1,在打印get_session2
然后就是after_request
after_request :在请求结束视图函数之后,返回客户端之前
打印结果:
先打印after2,在打印after1.
如果一个”before_request”函数中有返回response,则后面的”before_request”以及该请求的处理函数将不再被执行。直接进入”after_request”。
然后是errorheadler()。
如果报404 not found的错误的时候,就会走到这里来。
换句话说,就是我们可以自己定义这个错误。
同样的我们也可以自己定义其他的错误类型。比如500.
6.Flask 中的 flash 闪现
我们先来访问index,在访问home,在页面上就会显示,但是当我们在访问home的时候,页面上就会显示
也就是说,flash只存储一次信息,只有当再次访问的index的时候,flash才有值,而且只存储一次。
7.send_file
from flask import send_file
他返回的是一个文件。
也可以返回图片:
也可以返回一个音视频文件.
8.jsonify
我们都知道flask的视图函数中不能返回字典。如果要返回字典必须借助json.dumps序列化。
@app.route("/bo/<age>", methods=("GET", "POST"), endpoint="bofunc")
def boo(age,gender):
ret_dict = {'name':'yangbo','age':age}
return json.dumps(ret_dict)
@app.route("/bo/<age>", methods=("GET", "POST"), endpoint="bofunc") def bo(age): # return send_file("123.mp3") # url_for("bofunc") ret_dict = {"name": "xiaowangba", "age": age} # return json.dumps(ret_dict) return jsonify(ret_dict)
使用jsonify就不用序列化了,他会帮我们序列化. 返回的页面也会发生变化,逼格不一样.
其实是响应头的content-type不一样.
总结:
1.使用endpoint解决 视图函数重名的问题
2.flask中的路由
@app.route("/<int:age>",methods=("GET",),endpoint="默认视图函数名")
动态路由参数"/<age>"
3.配置:
1.Flask实例配置
app.config.from_object(obj)
class obj():
DEBUG = True
2.Flask初始化配置 和 蓝图接近
template_folder = "模板存放路径" # ;蓝图应用时,同一个文件夹
static_folder = "静态文件存放路径"
static_url_path = "/默认值是等于static_folder的名字" #蓝图应用时path不能重复
4.蓝图(Blueprint)
bp = Blueprint("bluename",__name__) # 类Flask实例
@bp.route("/") 为蓝图添加路由 方式与Flask实例路由一毛一样
注册蓝图
app.register_blueprint(bule.bp)
插拔机制
5.(before/after)_request errorheadler(404)
@app.before_request 请求进入视图函数之前作出处理
@app.after_request 请求结束视图函数之后,返回客户端之前,作出处理
def after(response)
return response
be1-be2-af2-af1
be1-af2-af1
errorheadler(404) #定义错误请求的响应
def err(code_or_exp)
6.skip(闪现flash)
7. send_file jsonify
1.form flask import send_file
flask send_file 打开文件并返回
send_file(文件路径)
2.from flask import jsonify
return jsonify({a:1})
打包一个 content-Type:application/json 返回给客户端
jsonify的配置在app["JSONIFY_MIMETYPE"] = ""