• Flask 中的路由系统


    基本用法

    Django的路由系统url集中在一起,而Flask的路由系统以装饰器的形式装饰在视图上如:

    @app.route("/",methods=["GET","POST"])

    @app.route() 装饰器中的参数

    第一个位置参数代表路由地址

    methods : 当前 url 地址,允许访问的请求方式

    以下例子包含部分request的方法取值

    @app.route('/get_request', methods=['GET', 'POST'])
    def login():
        if request.method == 'GET':
            print(request.args.get('id')) # url中的数据
            print(request.args.to_dict())
            # 杂项
            print('1>>>',request.url)  # 整个访问地址
            print('2>>>',request.values)  # args和from所有的数据 这儿有深坑,不要用to_dict,
            print('3>>>',request.path)  # 路由地址
            print('4>>>',request.base_url) # 最基础的url
            print('5>>>',request.host) # 主机地址
            print('6>>>',request.host_url)
    
            ## 两个特殊值
            print(request.json)  # 请求头:Content-type:application/json
            print(request.data)  # 当请求头 不被认可的情况 存放原始数据 b"" + Content-type:application/json 也会保留原始数据
    
            return render_template('login.html')
        else:
            print(request.form.get('username'))  # FormDate中的数据
            print(request.form.to_dict())  # 以字典形式打印出来
    
            return request.form.get('username', '错误')

    endpoint : 反向url地址

    from flask import url_for
    
    
    @app.route("/info", methods=["GET", "POST"], endpoint="r_info")
    def student_info():
        print(url_for("r_info"))  # /info
        stu_id = int(request.args["id"])
        return f"Hello {stu_id}"  # Python3.6的新特性 f"{变量名}"

    endpoint   默认是视图函数名 ,url_for 反向生成URL地址 ——可以解决视图函数重名:

    @app.route("/detail",methods=["GET","POST"]) # route(detail) -> nei_func --> detail
    @wai_func  # wai_func(detail) -> nei_func --> deltail
    def detail():
        return render_template("detail.html")
    
    
    @app.route("/detail2",methods=["GET","POST"]) # route(detail) -> nei_func --> detail
    @wai_func
    def detail2():
        return render_template("detail.html")

    上面例子中,运行会报这样的错误

    这是因为装饰器的机制会使两个路由都指向装饰器的内层函数nei_func ,就会出现函数重名的报错

    如果加上endpoint就不会有这样的问题了

    @app.route("/detail",methods=["GET","POST"],endpoint='detil') # route(detail) -> nei_func --> detail
    @wai_func  # wai_func(detail) -> nei_func --> deltail
    def detail():
        return render_template("detail.html")
    
    
    @app.route("/detail2",methods=["GET","POST"],endpoint='detil2') # route(detail) -> nei_func --> detail
    @wai_func
    def detail2():
        return render_template("detail.html")

    项目已经成功运行了

    defaults : 视图函数的参数默认值{"nid":1}

    传递默认参数 defaults={"nid":1} def index(nid)

    strict_slashes 

     url地址结尾符"/"的控制 False : 无论结尾 "/" 是否存在均可以访问 , True : 结尾必须不能是 "/"

    是否严格遵守URL地址规则 == True 在地址末尾不可以出现 / 反之可以

    redirect_to : url地址重定向

    永久重定向 "/infos" http 状态码 - 301  不走被装饰的视图

    # 访问地址 : /info 浏览器跳转至 /infos
    @app03.route("/info", strict_slashes=True, redirect_to="/infos")
    def student_info():
        return "Hello I'm info"
    
    @app03.route("/infos", strict_slashes=False)
    def student_infos():
        return "Hello I'm infos"

    subdomain

    子域名配置 必须和 app中的 SERVER_NAME 联动

    子域名前缀 subdomian="DragonFire" 这样写可以得到 DragonFire.zwq.com 前提是app.config["SERVER_NAME"] = "zwq.com"

    app.config["SERVER_NAME"] = "zwq.com"
    
    @app.route("/info",subdomain="DragonFire")
    def student_info():
        return "Hello Old boy info"
    
    # 访问地址为:  DragonFire.zwq.com/info

    动态参数路由

    from flask import url_for
    
    
    # 访问地址 : http://127.0.0.1:5000/info/1
    @app.route("/info/<int:nid>", methods=["GET", "POST"], endpoint="r_info")
    def student_info(nid):
        print(url_for("r_info",nid=2))  # /info/2
        return f"Hello {nid}" 

    <int:nid> 就是在url后定义一个参数接收

    但是这种动态参数路由,在url_for的时候,一定要将动态参数名+参数值添加进去,否则会抛出参数错误的异常

     添加路由的另一种方法

    通过分析源码得知添加路由本质上就是这种方法:add_url_rule("/login",view_func=login)
    所以可以直接通过add_url_rule()添加路由
    def login():
        print(url_for("my_home_page"))
        # print(url_for("index2"))
        return ""
    
    app.add_url_rule("/login",view_func=login) # 第二种添加路由的方式,本质不变
  • 相关阅读:
    位运算的简单简要
    Date()函数详细参数
    Android画图之Matrix(二)
    图像渐变特效的简单介绍
    Android MotionEvent中getX()和getRawX()的区别
    Timer计时器
    android中raw文件夹和asset文件夹的共同点和区别
    Selector、shape详解
    select语句后以for update结尾
    Openfire(原来的Wildfire) 在 Web 2.0 中的作用
  • 原文地址:https://www.cnblogs.com/zwq-/p/10438909.html
Copyright © 2020-2023  润新知