Flask入门学习——自定义一个url转换器

摘要:
要注意:自定义转换器需要继承自BaseConverter类,并且设置to_python和to_url两个方法。

我们知道,flask的url规则是可以添加变量部分的,这个参数变量是写在尖括号里的,比如:/item/<id>/,如果需要指出参数的类型要符合<converter:vaiable_name>格式的,其中,converter有几种类型:

  • string:接受不含有‘/’的文本
  • int:接受整数
  • float:接受浮点型
  • path:接受含有‘/’的文本串
  • uuid:只接受uuid串

而当没有符合的转换器时,就需要自己定义一个转换器供我们使用,完成它只需要三步:

1.自定义转换器
2.将自定义的转换器添加到flask的应用中
3.使用转换器

现在,定义一个类似127.0.0.1:5000/flask+aaa这样的。

import urllib.parse as par

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)


# 1.自定义转换器
class ListConverter(BaseConverter):

	def __init__(self, url_map, separator='+'):
		super(ListConverter, self).__init__(url_map)  # 调用父类的构造方法
		self.separator = par.unquote(separator)  # 将自定义转换器参数保存在对象的属性中,flask回去使用这个

	def to_python(self, value):
		return value.split(self.separator)

	def to_url(self, values):
		return self.separator.join(super(BaseConverter, self).to_url(value) for value in values)

# 2.将自定义的转换器添加到flask的应用中
app.url_map.converters['list'] = ListConverter


# 3.使用
@app.route('/list1/<list:page_names>/')
def list1(page_names):
	return 'Separator: {} {}'.format('+', page_names)

# 3.使用
@app.route('/list2/<list(separator=u"|"):page_names>/')
def list2(page_names):
	return 'Separator: {} {}'.format('|', page_names)


if __name__ == '__main__':
	app.run(debug=True)

当我们访问http://127.0.0.1:5000/list1/a+b/http://127.0.0.1:5000/list1/a|b/就能实现同样的功能了。要注意:自定义转换器需要继承自BaseConverter类,并且设置to_python(把路径转换成一个Python对象)和to_url(把参数转换成符合url的格式)两个方法。


另一个转换器-----自定制正则路由匹配

from flask import Flask,url_for
from werkzeug.routing import BaseConverter
app = Flask(__name__)


# 定义转换的类  
class RegexConverter(BaseConverter):
    """
    自定义URL匹配正则表达式
    """

    def __init__(self, map, regex):
        super(RegexConverter, self).__init__(map)
        self.regex = regex

    def to_python(self, value):
        """
        路由匹配时,匹配成功后传递给视图函数中参数的值
        :param value: 
        :return: 
        """
        return int(value)

    def to_url(self, value):
        """
        使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
        :param value: 
        :return: 
        """
        val = super(RegexConverter, self).to_url(value)
        return val


# 添加到converts中
app.url_map.converters['regex'] = RegexConverter


# 进行使用
@app.route('/index/<regex("d+"):nid>',endpoint='xx')
def index(nid):
    url_for('xx',nid=123) 
    return "Index"

if __name__ == '__main__':
    app.run()

免责声明:文章转载自《Flask入门学习——自定义一个url转换器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(摘录)(ASWP chap3)Describing Web Resource in RDFpycharm添加pyqt工具下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Flask框架的日志配置

日志配置 logs/logs.pylogs/flask.log import os import logging from logging.handlers import RotatingFileHandler # 获取当前绝对路径 def get_cwd(): return os.path.dirname(os.path.abspath(__f...

Flask网页模板的入门

#网页模板需要导入render_template from flask import Flask,render_template   方法一: #使用render_template模块来渲染模板文件 #return render_template("day3.html",my_str = my_str,my_int=my_int,my_list=my_...

部署高并发python后端(Systemd+Nginx+Gunicorn+Gevent+Supervisor+Flask )

一、前言 在Python开发中,服务部署有各种各样的方案,同时作为服务端语言也是比较吃力的,没有Java那样有很成熟的方案。在这里介绍一个高并发部署方案:Systemd+Nginx+Gunicorn+Gevent+Supervisor+Flask。 众所周知 Flask 是一个同步的框架,处理请求的时候是以单进程的方式,当同时访问的人数过多时,Flask...

基于Flask的 api(三)

使用flask的RESTful扩展库 flask-restful 安装 pip install flask-restful eg: 最简单的api fromflask import Flask fromflask_restful import Api, Resource app =Flask(__name__) api =Api(app) classH...

flask组件 --- wtforms

1. 简介   WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。 2. 安装   pip install wtforms 3. 使用----用户注册   注册页面需要让用户输入:用户名、密码、确认密码、性别、爱好、居住城市等. form类:  from flask import Flask,render_templat...

Flask配置Cors跨域

1 跨域的理解 跨域是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务器的静态资源或请求。即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源。 同源策略是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,为了用户安全,浏览器加了限制,其中的Js通过Ajax只能访问B服务器的静态资...