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

  • 相关阅读:
    过滤textarea
    vue引用jquery
    vue_ajax插件Axios
    VeeValidate
    mongodb
    WEBGL实现--three.js笔记整理
    My SQLworkbench问题总结
    vue遇到的问题
    MYSQL使用笔记
    vue笔记
  • 原文地址:https://www.cnblogs.com/yb635238477/p/9768629.html
Copyright © 2020-2023  润新知