• flask 基础2


    一.装饰器的坑

    在使用装饰器函数时候,当一个装饰器装饰多个函数的时候,会由于内存地址相同时发生报错,因为装饰的都是一个函数

    所以就需要引入

    import functools  重新定义每一个函数的名称

    import functools
    def waidu(fun):
        @functools.wraps(fun)
        def nei(*args,**kwargs):
            if session.get('user'):
                ret= fun(*args, **kwargs)
                return ret
            else:
                return redirect('/login')
        return nei

    或者

    在flask下也有一个内置 endpoint

    二 flask中的路由

    1.endpoint 反向生成url地址标识,默认是凸函数名url_for

    1 @app.route('/', endpoint='index')#endpoint是route里面的属性,默认为NONE,则会显示函数名def index为默认
    2 #要是标识出,就会区分每一个单独的函数名
    3 def index():
    4     print(request.path)
    5     return render_template('home.html')

    这样也可以区分装饰器的坑,通过引入

    from flask import url_for
    来检测
    print (url_for()
    若正确,则打印路由地址

    2.methods 视图函数允许的请求方式

    @app.route("/index/<page>",methods=["GET","POST"],endpoint="index")

    methods默认get请求,若不声明则不会显示

    3."/index/<page>" 动态路由路由参数

    @app.route("/info/<page>", methods=['POST','GET'],endpoint='student',strict_slashes=True)
    #<int:page>page是一个变量名,int声明是数字,默认声明str
    #访问时,需要后面带着访问的字符串才会有页面
    def student(page):
        print(page,type(page))
        return "123"

    4.defaults={"nid":"123456"} 默认参数,同样拼接在route里,打印的page是默认参数123456

    5.strict_slashes=True 是否严格遵循路由地址#按照严格的网址关系,默认为false

    6.redirect_to="/login" 永久重定向 301 没有302发生在显示页面之前,用在更换网址时直接跳转旧的网址

    三.flask实例化配置

    1.template_folder="temp" 默认模板路径 templates   #在更改template时使用,直接指向更改后的名字,

    2.static_folder="static", 默认静态文件路径 static  #在更改静态文件后使用,直接指向更改后静态文件夹的名字

    3.static_url_path="/static" 访问静态文件路由地址 默认是"/"+static_folder  #再更改静态文件后,需要在前端更改静态文件的路径,使用时直接写更改后的静态文件路径/static

    app = Flask(__name__,template_folder="template",static_folder="statics",static_url_path="/statics")

    了解:

    4.static_host=None 指定静态文件服务器地址
    5.host_matching = False,  # 如果不是特别需要的话,慎用,否则所有的route 都需要host=""的参数
    6.subdomain_matching = False,  # 理论上来说是用来限制SERVER_NAME子域名的,但是目前还没有感觉出来区别在哪里
    7.instance_path = None,  # 指向另一个Flask实例的路径
    8.instance_relative_config = False  # 是否加载另一个实例的配置
    9.root_path = None  # 主模块所在的目录的绝对路径,默认项目目录

    四flask对象配置

    'DEBUG': False,  # 是否开启Debug模式
        'TESTING': False,  # 是否开启测试模式
        'SECRET_KEY': None # 在启用Flask内置Session的时候/开启flash,一定要有它
        'PERMANENT_SESSION_LIFETIME': 31,  # days , Session的生命周期(天)默认31天
        'SESSION_COOKIE_NAME': 'session',  # 在cookies中存放session加密字符串的名字

    对象配置需要新创建一个文件,

    class FlaskDebug(object):
        DEBUG=True
        SECRET_KEY="SADIHAS"
        PERMANENT_SESSION_LIFETIME=8
        SESSION_COOKIE_NAME="shadoubushi"

    在flask里

    import FlaskSetting
    app.config.from_object(FlaskSetting.FlaskDebug)

    就可以使用配置后的环境了

    五.flask蓝图 (蓝图配置)

    Blueprint :当成一个不能被启动的 app Flask示例

    使用:

    创建一个独立的文件夹

    from flask import Blueprint,render_template
    s4app = Blueprint("s4app",__name__,template_folder="apptemp",url_prefix="/blue")
    @s4app.route("/s4app")
    def s4appfunc():
        return render_template("s4app.html")

    url_prefix="/blue" url前缀

    在访问时需要写在路由前127.0.0.1:8000/blue/s4app

    注册:

    app.register_blueprint(views.s4app)

    例子:

    from flask import Blueprint, render_template,request,jsonify,json
    
    app01=Blueprint("app01",__name__,template_folder="temp")#每一个蓝图都需要声明一个名字,不可重复,可以创建多个蓝图
    @app01.route("/app01",methods=["POST","GET"])
    def app01func():
        if request.method =="GET":
            return render_template("01.html")
        else:
            print(request.form.to_dict())
            dic={}
            x=request.form.get("key")
            y=request.form.get("value")
            dic[x]=y
            dicc=json.dumps(dic)
            print(dic)
    
            return render_template("01.html",dic=dicc)

    flask

    from flask import Flask
    from bu import ha
    
    app=Flask(__name__)
    app.register_blueprint(ha.app01)
    
    app.run()

    六.flask特殊装饰器

    @app.before_request # 请求进入视图函数之前

    @app.before_request
    def bel():
        print("我是 before_request1")
        return None
    #默认return None 要是直接返回 三剑客 不会自行视图函数
    @app.before_request
    def be2():
        print("我是before_request2")
    @app.before_request
    def be3():
        print("我是before_request3")

    @app.after_request # 响应返回客户端之前

    @app.after_request
    def af1(args):
        print(args)
        print("我是after_request1")
        return args
    #发生在返回给客户端之前,需要返回参数args,若没有客户端什么都不显示
    @app.after_request
    def af2(args):
        print("我是after_request2")
        return args
    
    @app.after_request
    def af3(args):
        print("我是after_request3")
        return args

    正常情况下流程:be1 - be2 - be3 - af3 - af2 - af1

    异常情况下流程:be1 - af3 - af2 - af1

     @app.errorhandler(404) # 重定义错误页面返回信息

    def error404(error_info):

    return三剑客+小儿子

    @app.errorhandler(404)#声明出错信息 必须写
    def error404(args):
        print(args)#打印报错信息
        return render_template("error.html")#返回自己写的报错信息
    
    app.run(debug=True)
  • 相关阅读:
    linux用户管理初级(上)
    定时任务实战
    linux定时任务
    Linux 命令行基础(一)
    Linux 操作系统发展历程及系统版本选择
    Linux文件的权限
    Linux硬连接和软连接
    Linux 文件的属性
    linux 正则表达式
    centos7 设置时间同步
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/10244974.html
Copyright © 2020-2023  润新知