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"] = ""

原文地址:https://www.cnblogs.com/yb635238477/p/9768629.html