• 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 语言实现)
    一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作(1)
    线性链表其他种类(静态,双向,循环)的存储结构和常见操作
    用户手势检测-GestureDetector使用详解
    android Socket 编程
    Android 网络请求get/post工具类:NetUtil
    使用Memcached提高.NET应用程序的性能
    基于OCS实现高速缓存
    如何加快网站访问速度
  • 原文地址:https://www.cnblogs.com/fog2012/p/flask_basic_theory_endpoint_urlfor.html
Copyright © 2020-2023  润新知