黄色标注部分重点注意
1. URL与函数的映射
•一个URL要与执行函数进行映射,使用的是@app.route
装饰器。
•@app.route
装饰器中,可以指定URL的规则来进行更加详细的映射,如果现在要映射一个文章篇数的URL,文章篇数的URL是/article/number/
,number有可能为1、2、3…,那么可以通过以下方式来映射:
@app.route('/article/<number>')
def article(number):
return '这是我的第{}篇文章'.format(number)
•上述其中,尖括号是固定语法不可改变,表示路由地址中传入的参数,默认的数据类型是字符串。如果需要限制参数类型,则要写成限制类型:变量名
,限制类型包括以下几种:
string | 默认的数据类型,接受任何没有斜杠 / 的字符串。 |
---|---|
int | 整型 |
float | 浮点型 |
path | 和string作用类似,但是可以传递斜杠 / |
uuid | uuid类型的字符串 |
any | 可以指定多条路路径 |
路由映射测试:
from flask import Flask
app = Flask(__name__)
# 装饰器,将当前路由映射到指定函数
@app.route('/ycx')
def first_flask():
return '但行好事,莫问前程'
if __name__ == '__main__':
app.run(debug=True)
网页显示:
•我们在浏览器中输入http://127.0.0.1:5000/ycx即可访问到以下页面:
•同时我们还可以动态传入参数,并指定参数类型
from flask import Flask
app = Flask(__name__)
# 装饰器,将当前路由映射到指定函数
@app.route('/ycx')
def first_flask():
return '但行好事,莫问前程'
@app.route('/article/<int:number>') #规定数据类型为int
def article(number):
return '这是我的第{}篇文章'.format(number)
if __name__ == '__main__':
app.run(debug=True)
网页显示:
显然,此时参数只能是整型数字了不能是其它数据类型
•一般情况下参数中不能包含 /, 如果要包含 /,必须将数据类型限制为path类型,除此区别之外,path类型与string类型使用基本一样
如下测试:
from flask import Flask
app = Flask(__name__)
# 装饰器,将当前路由映射到指定函数
@app.route('/ycx')
def first_flask():
return '但行好事,莫问前程'
@app.route('/article/<int:number>')
def article(number):
return '这是我的第{}篇文章'.format(number)
@app.route('/comment/<path:aid>') #path类型可用string 和 /
def comment_list(aid):
return '这是我的第{}个评论'.format(aid)
if __name__ == '__main__':
app.run(debug=True)
网页显示:
如果为字符串类型或者参数中含有 / 时,则匹配comment_list(aid)函数
•两个路由访问同一个函数可以用any类型来限制
如下测试:
from flask import Flask
app = Flask(__name__)
# 装饰器,将当前路由映射到指定函数
@app.route('/ycx')
def first_flask():
return '但行好事,莫问前程'
@app.route('/article/<int:number>')
def article(number):
return '这是我的第{}篇文章'.format(number)
@app.route('/comment/<path:aid>')
def comment_list(aid):
return '这是我的第{}个评论'.format(aid)
@app.route('/<any(list,dict):url_path>/')
def message(url_path):
if url_path == 'list':
return '当前路由是list'
else:
return '当前路由是dict'
if __name__ == '__main__':
app.run(debug=True)
网页显示:
此时访问路由时需要在路径最后添加 / 才能正常访问,如/<any(list,dict):url_path>/
•如果不想通过指定子路径来传递参数,也可以通过 ?=的形式来传递参数,例如:/article?id=xxx
这种情况下,可以通过request.args.get(‘id’)
来获取id的值
•如果是post方法,则需要通过request.form.get(‘id’)
来进行获取id的值。
•如果需要在flask中使用上述方法,需先导入request库 from flask import request
如下测试:
from flask import Flask, request
app = Flask(__name__)
# 装饰器,将当前路由映射到指定函数
@app.route('/ycx')
def first_flask():
return '但行好事,莫问前程'
@app.route('/article/<int:number>')
def article(number):
return '这是我的第{}篇文章'.format(number)
@app.route('/comment/<path:aid>')
def comment_list(aid):
return '这是我的第{}个评论'.format(aid)
@app.route('/<any(list,dict):url_path>/')
def message(url_path):
if url_path == 'list':
return '当前路由是list'
else:
return '当前路由是dict'
@app.route('/cx')
def search():
return request.args.get('name')
if __name__ == '__main__':
app.run(debug=True)