Flask 学习之 路由

一.路由的基本定义

# 指定访问路径为 demo1

@app.route('/demo1')

def demo1():

    return 'demo1'

二.常用路由设置方式

@app.route('/user/<username>')   #常用的   不加参数的时候默认是字符串形式的

@app.route('/post/<int:post_id>')  #常用的   #指定int,说明是整型的

@app.route('/post/<float:post_id>')

@app.route('/post/<path:path>')

@app.route('/login', methods=['GET', 'POST'])

三.路由可以设置传递参数, 2种方式

1.一种为路由传递参数[没有限定类型]

2.路由传递参数[限定数据类型]

以下为相应的例子:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"

from flask import Flask

app = Flask(__name__)


# 加载项目配置
# 配置类
class Config(object):
    DEBUG = True


app.config.from_object(Config)


# 路由传递参数[没有限定类型]
@app.route('/user/<user_id>')
def user_info_1(user_id):
    return 'hello info_1 %s' % user_id


# 路由传递参数[限定数据类型],列子是用了int类型,可以选择bool,float都可以的
# user_id 必须是整数
@app.route('/user/<int:user_id>')
def user_info_2(user_id):
    return 'hello info_2 %d' % user_id


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=9000)
    """
    测试说明:
        测试1:
        http://127.0.0.1:9000/user/qwer
        这样的情况是访问了函数1的url,因为qwerb不为整数,所以路由到没有限定类型处
        测试2:
        http://127.0.0.1:9000/user/2
        这样的情况下会选择有限定类型的路由
        测试3:
        注释限定的,让后使用如下url测试:
        http://127.0.0.1:9000/user/2
        这样会走无限定的路由
"""

四.路由之url_for()函数

1.给指定的函数构造URL

#例1:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"

from flask import Flask, url_for
from flask import redirect

app = Flask(__name__)


@app.route('/index')  # endpoint是别名
def home():
    """
    url_for是个函数接受视图函数的名字(字符串形式)作为参数,返回视图函数对应的url
    通过url_for home 来获取前端输入的url是什么
    :return:
    """
    v = url_for("home")
    print(v)
    return "index"

# url_for() 使用endpoint ,通过反向机制构建URL路径 
@app.route('/index/<int:nid>', endpoint="aaa")  # endpoint是别名
def zzz(nid):
    """
    这边使用了别名,将zzz函数别名为aaa
    所以url_for 对的是aaa
    :param nid:
    :return:
    """
    v = url_for("aaa", nid=nid)
    print(v)
    return "index2"


if __name__ == '__main__':
app.run(host='127.0.0.1', port=9000)

2.访问静态文件(CSS / JavaScript )

只要在你的包中或是模块的所在目录中创建一个名为 static 的文件夹,在应用中使用 /static 即可访问。

url_for('static', filename='style.css')

这个文件应该存储在文件系统上的 static/style.css

五.路由的正则匹配方式

1.自定义转换器实现

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

具体实现步骤为:

(1)导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录

(2)自定义转换器:自定义类继承于转换器基类

(3)添加转换器到默认的转换器字典中

(4)使用自定义转换器实现自定义匹配规则

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"

# 下面编写一个自定义路由转换器

from flask import Flask

app = Flask(__name__)

# 导入转换器基类
from werkzeug.routing import BaseConverter


class MobileNumberConverter(BaseConverter):
    """
    手机号码的自定义路由转换器
    """
    regex = "\d{11}"


# 添加转换器到默认的转换器字典中,并指定转换器使用时名字为: mobile
app.url_map.converters['mobile'] = MobileNumberConverter


# 使用转换器去实现自定义匹配规则
@app.route(r"/sms/<mobile:mobile_number>/")  # mobile_number就是测试的电话号码
def sms(mobile_number):
    """
    通过以下url访问:
    http://127.0.0.1:9000/sms/13666666666/
    :param mobile_number:
    :return:
    """
    print(mobile_number)
    return "手机号通过,短信"


# 例2
class RegexConverter(BaseConverter):
    """正在路由转换器"""

    def __init__(self, url_map, *args):
        # super().__init__(url_map)  # 或者这样写
        # url_map 所有url组成的元组
        super(RegexConverter, self).__init__(url_map)  # 初始化分类
        self.regex = args[0]  # 是一个元组


app.url_map.converters['reg'] = RegexConverter


# \w 表示大写字母小写字母下划线
@app.route(r"/register/<reg('\w{4,6}'):username>/")
def reg(username):  # 这个函数名没有限制
    """
    通过以下url访问:
    http://127.0.0.1:9000/register/qwer/
    :param username:
    :return:
    """
    print(username)
    return "ok reg"


if __name__ == "__main__":
    app.run(host='0.0.0.0', port=9000)

 

2.系统自带转换器

在werkzeug.routing.py源文件中

 

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

 

以上类型都是系统自带的。

系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。

posted @ 2019-07-27 11:30  pycoder_hsz  阅读(204)  评论(0编辑  收藏  举报