
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
