zoukankan      html  css  js  c++  java
  • flask的路由配置,特殊装饰器

    1,flask中的路由

    • endpoint-url_for反向地址
    • endpoint默认是视图函数名endpoint="雪雪"
    • methods 指定视图函数的请求方式,默认GET
    • default={"nid":1}指定视图函数的默认值
    • strict_slashes = False 是否严格遵循路由规则/login/
    • redirect_to"/xueren/" 永久跳转地址301
    • 动态路由参数
    • /<int:nid> / <string:str> / <nid>
    • 视图函数中需要有参数接收动态参数

    2,Flask中的实例化配置

    • template_folder = "temp"  # template模板目录,默认当前项目中的template目录
    • static_folder = "xuexue"目录
    • static_url_path= "/static"   # 访问路径
    • host_matching = False  # 如果不是特别需要,慎用,否则所欲的route都需要host=""参数
    • subdomain_matching = False  # 理论上来说是用来限制SERVER_NAME子域名,
    • instance_path = None.  # 指向另一个Flask实例的路径
    • instance_relative_config = Flase  # 是否加载另一个实例的配置
    • root_path = None  # 主模块所在的目录绝对路径,默认项目目录

    3,app对象配置

    • app.config.from_object(Debug)
    • class Debug(object):
      • DEBUG = true

    4,Blueprint

    • from flask import Blueprint
    • blue = Blueprint("blue_id", __name__,url_prefix="user"每次访问蓝图的路径前缀)
    • app.reguster_blueprint(blue)

    5,特殊装饰器:

    • @app.template_global()
    • @app.template_filter()
    • @app.before_request      # 请求进入视图函数之前
    • @app.after_request
    • def af1(response)
      • return response        # 结束视图函数之后, 返回客户端之前
    • 正常:be1---be2---be3---af3---af2---af1
    • 异常:be1---af3---af2---af1
    • @app.errorhandler(404)重定义页面
    • def error404(args):
      • return args
    • 基于蓝图实现增删改查数据,基于Before_request session实现用户校验,可选errorhandler

    具体代码如下:

    蓝图代码:

    from flask  import Flask, request, render_template, redirect, session
    from serv import users
    import weishenme
    app = Flask(__name__, static_url_path="/static")
    
    # 注册配置类
    app.config.from_object(weishenme.Debug)
    
    # 注册蓝图
    app.register_blueprint(users.user_blue)
    
    
    @app.route("/detail")
    def detail():
        return render_template("detail.html")
    
    @app.route("/login", methods=["GET", "POST"])
    def login():
        if request.method == "GET":
            return render_template("login1.html")
        else:
            session["user"] = request.form.get("user")
            return redirect("/")
    
    @app.route("/")
    def xiaocai():
        return "骚帆是一根小菜"
    
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    配置类:

    class Debug(object):
        DEBUG=True
        SECRET_KEY="xuexue"
        SESSION_COOKIE_NAME="xiaoxue"
    
    
    class Testing(object):
        TESTING=True
        SECRET_KEY="xiaopangpang"
        SESSION_COOKIE_NAME="xueer"
    
    
    class Production(object):
        SECRET_KEY="xueren"
        SESSION_COOKIE_NAME="csrf_token"

    app的代码:

    from flask import Flask, session, redirect, url_for, render_template, request
    import weishenme
    # 实例化一个Flask对象app
    app = Flask(__name__)  # __name__表示是当前目录
    # 指定session的key是xuexue
    app.secret_key = "xuexue"
    
    # 注册配置类
    # app.config.from_object(weishenme.Debug)
    app.config.from_object(weishenme.Testing)
    
    # 装饰器
    def outer(func):
        def hahaha(*args, **kwargs):
            if session["user"]:
                print(session["user"])
                ret = func(*args, **kwargs)
                return ret
            else:
                return redirect("/login")
        return hahaha
    
    
    @app.route("/<nid>", endpoint="wc", methods=["GET", "POST"])
    @outer
    def wc(nid):
        print(nid)
        return render_template("xuexue.html")
    
    
    @app.route("/detail", endpoint="detail")
    @outer
    def detail():
        print("detail")
        return render_template("detail.html")
    
    
    @app.route("/login", methods=["GET", "POST"], strict_slashes=False)
    def login():
        if request.method == "GET":
            return render_template("login1.html")
        else:
            session["user"] = request.form.to_dict().get("user")
            return redirect("/miss")
    
    
    if __name__ == '__main__':
    
        # 运行这个flask项目
        app.run(host="0.0.0.0", port=2018)

    请求执行流程代码:

    from flask import Flask, request, session, render_template, redirect, session
    import weishenme
    from serv import users
    
    app = Flask(__name__, static_folder="static_list",  static_url_path="/static")
    # 到瑞配置类
    app.config.from_object(weishenme.Debug)
    # 注册蓝图
    app.register_blueprint(users.user_blue)
    
    @app.before_request
    def is_login():
        print("b1")
        if request.path == "/login" :
            return None
        elif session.get("user"):
            return None
        else:
            return redirect("/login")
    
    @app.before_request
    def b2():
        print("b2")
        return None
    
    @app.before_request
    def b3():
        print("b3")
        return None
    
    
    @app.after_request
    def af1(res):
        print("af1")
        return res
    
    @app.after_request
    def af2(res):
        print("af2")
        return res
    
    @app.after_request
    def af3(res):
        print("af3")
        return res
    
    
    @app.route("/", endpoint="index",methods=["POST", "GET"])
    def index():
        return render_template("index1.html")
    
    @app.route("/detail", endpoint="detail")
    def detail():
        return render_template("detail.html")
    
    @app.route("/login", methods=["GET", "POST"], strict_slashes=False)
    def login():
        if request.method == "GET":
            return render_template("login1.html")
        else:
            print("xiaoxue")
            session["user"] = request.form.get("user")
            return redirect("/")
    
    @app.errorhandler(404)
    def error(args):
        print(args)
        return "您访问的页面不存在,或者走丢了.....%s" % args
    
    
    if __name__ == '__main__':
        app.run(debug=True)

      

  • 相关阅读:
    【Nginx】ngx_event_core_module模块
    ELMAH--Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components 77 out of 90 rated th
    nyist oj 214 单调递增子序列(二) (动态规划经典)
    java 入门书籍(java7)
    ARCGIS将WGS84坐标投影到高斯平面
    【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
    【springboot】【socket】spring boot整合socket,实现服务器端两种消息推送
    【linux】linux修改open file 大小
    【docker】docker限制日志文件大小的方法+查看日志文件的方法
    【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/10265389.html
Copyright © 2011-2022 走看看