在分析路由匹配过程之前,我们先来看看 flask 中,构建这个路由规则的两种方法:

  1. 通过 @app.route() decorator

  2. 通过 app.add_url_rule,这个方法的签名为 add_url_rule(self, rule, endpoint=None, view_func=None, **options),参数的含义如下:

    • rule: url 规则字符串,可以是静态的 /path,也可以包含 /

    • endpoint:要注册规则的 endpoint,默认是 view_func 的名字

    • view_func:对应 url 的处理函数,也被称为视图函数

这两种方法是等价的,也就是说:

@app.route('/')
def hello():
    return "hello, world!"

 也可以写成

def hello():
    return "hello, world!"

app.add_url_rule('/', 'hello', hello)

 其实,还有一种方法来构建路由规则——直接操作 app.url_map 这个数据结构。不过这种方法并不是很常用,因此就不展开了

静态路由

@app.route('/')
def hello_world():
    # 变量可以通过赋值传到前端,前端可以通过Jinja语法{{}}渲染
    return render_template('t1.html', name='t1', age=16)

@app.route('/services')
def services():
    return 'Services'
@app.route('/about')
def about():
    return 'About'

# 相对projects解释类似于文件夹解释形式,指向某一个文件夹下的某个文件
@app.route('/projects/')
@app.route('/projects_our') # 可以定义多个URL到同一个视图函数上,Flask支持
def projects():
    return 'Projects'

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

 动态路由

# 动态路由
@app.route('/user/<username>')
def user(username):
    print username
    return username

# 路由转换器:指定参数类型
# flask提供3种:int(整形)|float(浮点型)|path(路径,并支持一个/)
@app.route('/user/<int:user_id>')
def user(user_id):
    print user_id
    return 'User_id:%s'%user_id

 自定义路由规则

# flask不提供正则表达的形式的URL匹配
# 可通过定义完成
# 1、from werkzeug.routing import BaseConverter
# 2、自定义类
#转换器
class RegexConverter(BaseConverter):
    def __init__(self,url_map,*items):
        super(RegexConverter,self).__init__(self)
        # print items # (u'[a-z]{3}[A-Z]{3}',)
        # print url_map # URL 的一个MAP对象,类似路由表
        self.regex = items[0]

# 3、要将定义的类注册到APP的url_map中,定义名称
# app.url_map.converters['regex'] = RegexConverter

# 4、使用
@app.route('/user/<regex("[a-z]{3}[A-Z]{3}"):username>')
def user(username):
    print username
    return 'Username:%s' % username

 浅析源码

注册路由规则的时候,flask 内部做了哪些东西呢?我们来看看 route 方法:

def route(self, rule, **options):
    """A decorator that is used to register a view function for a
    given URL rule.  This does the same thing as :meth:`add_url_rule`
    but is intended for decorator usage.
    """

    def decorator(f):
        endpoint = options.pop('endpoint', None)
        self.add_url_rule(rule, endpoint, f, **options)
        return f

    return decorator
route

相关文章:

  • 2021-04-27
  • 2021-06-07
  • 2022-02-13
  • 2022-12-23
  • 2022-12-23
  • 2021-07-27
  • 2021-09-03
  • 2021-06-05
猜你喜欢
  • 2022-12-23
  • 2021-06-21
  • 2022-12-23
  • 2022-12-23
  • 2022-01-01
  • 2022-01-16
  • 2022-12-23
相关资源
相似解决方案