zoukankan      html  css  js  c++  java
  • 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"] = ""

  • 相关阅读:
    POJ 3710 Christmas Game#经典图SG博弈
    POJ 2599 A funny game#树形SG(DFS实现)
    POJ 2425 A Chess Game#树形SG
    LeetCode Array Easy 122. Best Time to Buy and Sell Stock II
    LeetCode Array Easy121. Best Time to Buy and Sell Stock
    LeetCode Array Easy 119. Pascal's Triangle II
    LeetCode Array Easy 118. Pascal's Triangle
    LeetCode Array Easy 88. Merge Sorted Array
    ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel
    ASP.NET MVC 学习笔记之面向切面编程与过滤器
  • 原文地址:https://www.cnblogs.com/yb635238477/p/9768629.html
Copyright © 2011-2022 走看看