Flask框架02路由详解


Flask路由

路由是web框架最核心的功能之一,它决定了哪个url由哪个函数处理

flask路由是web应用程序将url映射到python函数的机制

flas路由是flask应用的核心部分,用于处理不同url请求,并将请求转发到相应的视图函数

基础路由

from flask import Flask

app = Flask(__name__)

@app.route('/')
def shouye():
    return "hello world"

@app.route("/index")
def index():
    return "this is index"

@app.route("/about")
def about():
    return "this is about"

if __name__ == '__main__':
    app.run(debug= True)


  • flask区分url大小写,

  • 路由是/about 浏览器/about可以访问,但是写/about/返回404

    • 但是路由如果是/about/的话,都可以访问到,统一末尾加/,符合rest风格
  • @app.route(“url路径”) 注册路由规则

  • 被装饰的视图函数,请求命中路由后自动执行

  • 视图函数必须由返回值(字符串,html,json,重定向等)

动态路由

url中携带可变参数,后端接收使用,在浏览器中输入参数,变量就会赋值

基础动态参数

格式: <参数名>

from flask import  Flask

app = Flask(__name__)

# 路由和视图函数进行了绑定
# 路由中定义了函数,视图函数必须接收同名的参数
@app.route('/user/<username>')
def get_user(username):
    return f"用户名:{username}"


if __name__ == '__main__':
    app.run(debug= True,port=5001)

访问:

  • /user/zhangsan 接收zhangsan

  • /user/lisi 接收lisi

指定参数类型(类型转换器)

限制url参数类型,类型不匹配的话直接404

语法:<类型:参数名>

转换器 作用
string 默认,字符串(不包含 /
int 正整数
float 正浮点数
path 完整路径,允许包含 /
uuid 匹配 UUID 格式
from flask import  Flask

app = Flask(__name__)


@app.route('/user/<username>')
def get_user(username):
    return f"用户名:{username}"

# 定义了这个传入的参数是int类型
@app.route('/num/<int:n>')
def show_num(n):
    return f"数字:{n} {type(n)}"

if __name__ == '__main__':
    app.run(debug= True,port=5001)


传入的是字符串的话,不能转换为数字,404报错

多个动态参数

按照顺序定义,接收即可

from flask import  Flask

app = Flask(__name__)


@app.route('/user/<username>')
def get_user(username):
    return f"用户名:{username}"

@app.route('/num/<int:n>')
def show_num(n):
    return f"数字:{n} {type(n)}"

# 顺序传入即可
@app.route("/book/<int:n>/<book_name>")
def book_detail(n,book_name):
    return f"第{n}本书是:{book_name}"


if __name__ == '__main__':
    app.run(debug= True,port=5001)


浏览器输入参数(get)(查询参数)

没有在代码里面定义参数的话,可以在浏览器中输入参数,然后获取这个值

就是在浏览器上面手动的添加一些参数,然后接收,这个属于get请求

from flask import Flask, request

app = Flask(__name__)

@app.route("/test")
def test():
    name = request.args.get("name")
    age = request.args.get("age")
    return f"name:{name} age: {age}"


if __name__ == '__main__':
    app.run(debug= True,port=5001)


?就是添加参数,&添加多个参数

默认参数设置,就是没有在浏览器中添加的话,就使用默认的

from flask import Flask, request

app = Flask(__name__)

# /test1路由
@app.route("/test1")
def test1():
    # 可以指定传入参数类型
    name = request.args.get("name","admin",type=str)
    age = request.args.get("age",20,type=int)
    return f"name:{name} age: {age}"

if __name__ == '__main__':
    app.run(debug= True,port=5001)



限制请求方式

flask路由默认只允许get请求,通过methods指定支持的请求方法

常见的请求方法,get,post,put,delete

同时支持GET/POST

from flask import Flask, request

app = Flask(__name__)

# 在route规则里面定义post,get这些方法
@app.route("/login",methods= ["POST","GET"])
def login():
    if request.method == "GET":
        return "GET请求:展示登录页"
    elif request.method == "POST":
        return "POST请求:提交登录数据"

if __name__ == '__main__':
    app.run(debug= True,port=5001)


get请求

post请求

路由反向解析 url_for

就是生成一个url路径的,比硬写url更加的灵活

不硬写url字符串,通过视图函数名反向生成路由地址,维护更加的方便,而不是写死了

语法:url_for(视图函数名,路由参数=值,查询参数=值)

  • 第一个参数:函数名(不是路由地址)

  • 路由里面的动态路径参数,直接传入关键字参数

  • ?后面的查询参数,也直接写关键字参数

普通的静态路由(无参数)

from flask import Flask, request,redirect,url_for

app = Flask(__name__)

@app.route("/test5")
def test5():
    return "首页"

# 在代码/终端测试
with app.test_request_context():
    print(url_for("test5"))  # 传入函数名test5

if __name__ == '__main__':
    app.run(debug= True,port=5001)


# 输出为
/test5

带动态路径参数(/<参数>)

路由里面<name> 是路径参数,url_for 必须传对应的值

from flask import Flask, request,redirect,url_for

app = Flask(__name__)

@app.route("/test5")
def test5():
    return "首页"

with app.test_request_context():
    print(url_for("test5"))

@app.route("/test6/<username>")
def test6(usename):
    return f"用户:{usename}"

# 函数名+路径参数
with app.test_request_context():
    print(url_for("test6",username="admin"))


if __name__ == '__main__':
    app.run(debug= True,port=5001)

# 输出为
/test6/admin

url_for 好处,不建议硬写url

  • 该路由不用全局改代码,假设以后把路由/user改成/member

    • 硬写的话,所有写了/user的地方,全部需要手动改,漏一处就是404

    • url_for,只改@app.route(“/member”) 这一行,所有的url_for自动更新

  • 自动处理参数、特殊字符

    • 参数含中文、空格、特殊符号时,url_for 会自动URL 编码,避免访问异常;手写很容易出错。
  • 区分动态路径参数 / 查询参数,写法统一

    • 不管是 /user/<name> 还是 ?a=1,都用关键字参数传,逻辑清晰
  • url_for 就是生成一个路由的,根据函数名

@app.route("/test11/<username>")
def test11(username):
    return f"用户:{username}"

@app.route("/to_user")
def to_user():
    return redirect(url_for("test11",username="zhangsan"))
    # redirect这个里面的路由就是redirect("/test11/zhangsan")

浏览器访问/to_user 自带跳转到/test11/zhangsan这个页面了

url_for自动拼接参数

@app.route("/test12")
def test12():
    return "welocme 12"

with app.test_request_context():
    print(url_for("test12",kw="123",id="123"))

# 输出为/test12?kw=123&id=123

路径参数+查询参数混合使用

@app.route('/article/<aid>')
def article(aid):
    return "文章页面"

@app.route('/to_art')
def to_art():
    return redirect(url_for("article", aid=10, sort="hot"))

# 地址为/article/10?sort=hot

重定向(redirect)

301永久重定向,302临时重定向(常用)

from flask import Flask, request,redirect,url_for

@app.route("/test13")
def test13():
    return "this is test13 page"

@app.route("/test14")
def test14():
    return redirect("/test13")


快捷方法装饰器

为常见的http方法提供了简写装饰器,让代码更加的清晰

# 等价于 @app.route("/test16",methods=["GET"])
@app.get("/test15")
def test15():
    return "登录成功"

@app.post("/test16")
def test16():
    return "this is post"
快捷装饰器 等价写法 典型用途
@app.get("/path") @app.route("/path", methods=["GET"]) 获取数据、显示页面
@app.post("/path") @app.route("/path", methods=["POST"]) 创建数据、提交表单
@app.put("/path") @app.route("/path", methods=["PUT"]) 更新数据(完整替换)
@app.delete("/path") @app.route("/path", methods=["DELETE"]) 删除数据
@app.patch("/path") @app.route("/path", methods=["PATCH"]) 更新数据(部分更新)

同时绑定多个路由

同一个视图函数可以绑定多个路由,匹配多个路径,返回同一个视图函数

# 2个不同的url指向同一个视图函数,
@app.route("/test17")
@app.route("/test18")
def test18():
    return "this is test17"

总结

url_for 生成路由的,更加的灵活

硬写url

@app.route('/user/<username>')
def user(username):
    return f"用户:{username}"

@app.route('/to_user')
def to_user():
    # 手动拼接路径
    return redirect("/user/zhangsan")

url_for写法

@app.route('/user/<username>')
def user(username):
    return f"用户:{username}"

@app.route('/to_user')
def to_user():
    # 路径参数直接传关键字
    return redirect(url_for("user", username="zhangsan"))

文章摘自:https://www.cnblogs.com/qylogs/p/20566221