我爱Flask之URL和Flask视图介绍

黄色标注部分重点注意

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)
网页显示:

在这里插入图片描述

request.args.get()中传入的参数未在URL中传入,会出现报错,因为URL未传入name参数,所以request.args.get()方法的值为空,即视图函数search()返回的值为空,不能渲染,所以会出现报错
网页显示:

在这里插入图片描述

有问题可以在评论指正,欢迎讨论,谢谢大家!!

猜你喜欢

转载自blog.csdn.net/qq_45261963/article/details/109105352