flask转换器类中to_python 和 to_url 区别

Posted xuehaiwuya0000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask转换器类中to_python 和 to_url 区别相关的知识,希望对你有一定的参考价值。

  flask框架中,转换器是一个较常用的对象。其常规的转换器有 int,float,path,any,string,default,uuid七个转换器,其中默认是字符串转换器。若想匹配特定的url路径,需要定义自己的转换器类。转换器类中有两个方法to_url和to_python都是用来对客户请求路径进行匹配的。其中to_url是在重定向时,依赖url_for函数匹配建立用户的路径。匹配正确后,通过to_python方法,将路径返回给对应的视图函数。

      转换器的匹配原理是用户输入请求后,将路径与转换器的self.regex进行匹配。匹配成功后,将路径通过to_python传递给视图函数,返回客户请求。这是常规的匹配路径流程。当客户路径是通过重定向的,则首先通过url_for函数形成匹配的新路径,此匹配的新路径的形成流程是:url_for会调用to_url 形成路径,然后与视图函数匹配。成功后,将路径通过to_python函数将路径传递给视图函数,返回用户请求。

以一个例子描述上述过程:

from flask import  Flask
#from flask import  request
from flask import jsonify
from flask import  redirect
from flask import url_for
from werkzeug.routing import  BaseConverter
import json
app= Flask(import_name="__name__")
class ReguConverter(BaseConverter):
    def __init__(self,map,*args):
        super(ReguConverter, self).__init__(map)
        self.regex=args[0]



class ListConverter(BaseConverter):
    def __init__(self,map ,*args):
        super(ListConverter, self).__init__(map)
        self.regex=args[0]
    def to_python(self, value):

        print("匹配后",value)
        return value.split(",")
    def to_url(self, value):
        value+="7890"
        print(" 匹配之前,",value)
        s1=",".join(value)
        return s1

app.url_map.converters["list"]=ListConverter

app.url_map.converters["regu"]=ReguConverter



@app.route("/static/<list(r‘(\d+,)+\d+$‘):a>")
def out3(a):
    print("参数a被调用后",a)
    return "hello"+str(a)


@app.route("/static/<regu(r‘\d4‘):a1>")
def out2(a1):
    print(type(a1),a1)
    s=url_for("out3", a=a1)
    print(s,90909090)
    return redirect(s)


if __name__ == __main__:
    app.config.from_pyfile("config1.cfg")
    app.run()

调试:

  通过输入127.0.0.1:5000/static/1234 可以查看上述调用list转换器的流程。

 

以上是关于flask转换器类中to_python 和 to_url 区别的主要内容,如果未能解决你的问题,请参考以下文章

flask第十一篇——自定义url转换器

flask第十二篇——自定义url转换器

Django 模型 DateField to_python

使用转换器提升 Python 问题 - 静态链接

Flask-Restful 优于 Flask-Restless

SSTI漏洞学习(下)——Flask/Jinja模板引擎的相关绕过