zoukankan      html  css  js  c++  java
  • Flask理论基础(一)视图函数和URL反转函数(url_for)

    一、视图函数

    1.1 基本用法
    试图函数是 app.route 或者 bp.route(蓝图)装饰器装饰的函数。该函数实现了对URL路径的转换,也就是路由功能,例如下面代码定义了默认url ‘/’ 和‘/index/’的url请求。

    @app.route('/')
    @app.route('/index/')
    def hello_world():
      return 'hello world'

    试图函数可以指定http请求方法,在route装饰器中传入methods参数

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

    1.2 传参数

    试图函数匹配一个具体的url请求,很多时候需要传入一个参数,例如传入当前页面编号

    @app.route('/article_list/<int:page>/')
    def article_list(page):
      return "你查看到第 %s 页" % page
    
    # http://127.0.0.1:5000/article_list/3

    如上传入int型参数page,在url请求时将自动为page赋值3;

    视图函数的参数类型支持string,int,float,path,uuid,any 6种参数转换,其中string时默认转换器(缺省状态下默认调用)。

    @bp.route('/user/<username>')
    @login_required
    def user(username):
      user = User.query.filter_by(username=username).first_or_404()

    如上调用缺省的string转换器将url匹配的内容以字符串形式传递给username变量。

    path转换器类似string,但可以传入文件路径分隔符‘/’。uuid转换器接受一个uuid字符串并自动换换为python对象。

    any 转换器提供了一个map,让一个视图函数可以匹配两个不同的路径。

    @app.route('/<any(about, help, imprint, class, "foo,bar"):page_name>')
    def detail(page_name):
        if page_name == 'about':
            return 'about page'
        else:
            ...

    多参数匹配,如下搜索代码查询word结果的页面。

    @app.route('/<wrod>/<int:page>')
    def search(word,page):
    return []

    1.3 自定义转换器

    Flask提供的转换器能够解决绝大部份需求了,但总有奇葩需求需要处理,这就需要自定义转换器了。
    自定义转换器需要如下三步操作:

     1)继承BaseConverter实现自己的转换器:

    from werkzeug.routing import BaseConverter
    class MapConverter(BaseConverter):
    
        def to_python(self, values):
            """
            将url中的参数转换为我们需要的数据类型
            a:b;c:d;
            """
            # 通过字符串创建字典类型数据
            kvs = values.split(';')
            res =[]
            for kv in kvs:
                (k,v) = kv.split(':')
                res[k,v]
            return res
    
        def to_url(self, values):
            """
            将字典类型数据{'a':'b','c':'d'}转换成a:b;c:d;
            """
            # BaseConverter.to_url是对url进行编码
            res = ';'.join([BaseConverter.to_url(self, k+':'+values[k]) for k in values.keys()])
            return res

    如上,需要实现to_python 和to_url两个方法,分别代表字符串与python对象之间的转换

    2)告诉flask我需要添加一个转换器:

    app.url_map.converters['map'] = MapConverter

    3) 开始使用

    @app.route('/detail/<list:params>/')
    def detail(params):
        print 'parmas:%s' % params
        return 'success for url'
        
    with app.test_request_context():
        print 'detail函数的url是:%s' % flask.url_for('detail', params=[1, 2, 3])

    二、URL反转函数

    指将视图函数转换为具体url的函数;

    url_for(endpoint, **values)

    第一个参数endpoint指的是视图函数名称对应的字符串,第二个参数可选,为需要传入的url的参数。
    例如:

    @app.route('/')
    def hello_world():
        print(url_for('my_list',page=1))
        return 'hello world'
    
    @app.route('/list/<page>')
    def my_list(page):
        return 'my_list'

    如上第三行url_for 第一个参数为试图函数my_list字符串,方法接受一个page参数最终打印的结果如下:

    /list/1

    如果为第三行的url_for 多加一个参数count

    print(url_for('my_list',page=1,count=2))

    则打印结果

    /list/1/?count = 2

    同时url_for 会自动处理特殊字符串。

    2.1、反转函数在模板中的使用

    在模板中也可以使用url_for 例如:

    <a href="{{ url_for('login') }}">登录</a>

    在html头部经常需要引入一些静态文件,此时url_for的endpoint传入static , filename 传入相对路径

    <script src="{{ url_for('static', filename='js/index.js') }}"></script>

    static目录与templates目录同级。

    2.2、如何获取URL全路径


    如上url获取的参数都是相对于当前应用的相对路径,url_for 也可获取到相对网站的绝对路径?
    例如我们的网站在本地 http://127.0.0.1 访问,我们想通过获取完整的http://127.0.0.1/list/1 可以在url_for 方法中添加 _external=True参数

    {{ url_for('reset_password', token=token, _external=True) }}

    如上是重置密码的邮件中的一行文本,在我们发送重置密码的邮件时,需要发送一个绝对路径,添加_external=True即可。

  • 相关阅读:
    C语言-if语句
    C语言-表达式
    C语言-基础
    Java for LeetCode 187 Repeated DNA Sequences
    Java for LeetCode 179 Largest Number
    Java for LeetCode 174 Dungeon Game
    Java for LeetCode 173 Binary Search Tree Iterator
    Java for LeetCode 172 Factorial Trailing Zeroes
    Java for LeetCode 171 Excel Sheet Column Number
    Java for LeetCode 169 Majority Element
  • 原文地址:https://www.cnblogs.com/fog2012/p/flask_basic_theory_endpoint_urlfor.html
Copyright © 2011-2022 走看看