Flask-认识路由(URL)

1.指定路由地址

 通过route()装饰器把一个函数绑定到对应的 URL 上

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello World'

通过路由地址‘/’就可以调用index()函数,‘/hello’可以调用hello()函数

 

2.给路由传递参数

给 URL 添加变量部分,你可以把这些特殊的字段标记为 <variable_name> , 这个部分将会作为命名参数传递到你的函数。

@app.route('/user/<username>')#默认是string类型
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username

 

3.指定参数的类型或匹配规则(转换器)

规则可以用 <converter:variable_name> 指定一个可选的转换器。

系统自带转换器如下:

DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

如果不指定参数类型,默认当做string处理

@app.route('/user/<username>')#等同于<string:username>
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username

@app.route('/post/<int:post_id>')#输入float类型则无法匹配
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

 

4.自定义匹配规则

在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问

具体实现步骤为:

  • 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
  • 自定义转换器:自定义类继承于转换器基类
  • 添加转换器到默认的转换器字典中
  • 使用自定义转换器实现自定义匹配规则

demo:

# coding:utf-8

from flask import Flask
from werkzeug.routing import BaseConverter

class RegexConverter(BaseConverter):
    def __init__(self,url_name,*args):
        super().__init__(url_name)
        self.regex = args[0] #将接收的第一个参数当做匹配规则

    def to_python(self, value): #value 值代表匹配到的值
        return int(value)  # 在视图函数中可以查看参数的类型,由之前默认的 str 已变成 int 类型的值

app = Flask(__name__)

# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters['re'] = RegexConverter

@app.route("/demo/<re('\d{6}'):postal_code>")
def demo(postal_code):
    print(type(postal_code)) #<class 'int'>
    return '邮编是:%s'% postal_code


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

 

5.指定请求方式

HTTP (与 Web 应用会话的协议)有许多不同的访问 URL 方法。默认情况下,路由只回应 GET请求,但是通过 route()装饰器传递methods参数可以改变这个行为。

如果存在GET,那么也会替你自动地添加HEAD方法,无需干预。

@app.route('/login', methods=['GET', 'POST'])
def login():
    return request.method

 

6.构造URL

通过url_for()函数可以给指定的函数构造 URL。它接受函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到 URL 末尾作为查询参数。

# coding:utf-8

from flask import Flask,url_for

app = Flask(__name__)

@app.route('/')
def index():
    pass

@app.route('/login')
def login():
    pass

@app.route('/user/<username>')
def profile(username):
    pass

@app.route('/test')
def test():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login',next='/'))
    print(url_for('profile',username='John Smith'))
    return 'test'


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

开启服务器后,浏览器输入http://127.0.0.1/test,终端上会显示以下内容:

/
/login
/login?next=%2F
/user/John%20Smith

 给静态文件生成 URL ,使用特殊的 'static' 端点名:

url_for('static',filename='home.png')

可以直接在模板中去使用,<img src="url_for('static',filename='home.jpg')">等同于<img src='/static/home.png'>

posted @ 2020-12-24 21:48  eliwang  阅读(335)  评论(0编辑  收藏  举报