Django和flask中自定义路由转换器
Django
一、在utils.converters.py中进行自定义
# 1.converters.py 新建/拖拽以前写好的转换器文件均可
class UsernameConverter:
"""自定义路由转换器去匹配用户名"""
# 定义匹配用户名的正则表达式
regex = '[a-zA-Z0-9_-]{5,20}'
def to_python(self, value):
return str(value)
def to_url(self, value):
return str(value)
class MobileConverter:
"""自定义路由转换器去匹配手机号"""
# 定义匹配手机号的正则表达式
regex = '1[3-9]\d{9}'
def to_python(self, value):
# to_python:将匹配结果传递到视图内部时使用
return str(value)
def to_url(self, value):
# to_url:将匹配结果用于反向解析传值时使用
return str(value)
二、在总路由中注册路由转换器
# 1.总路由中注册路由转换器
from django.urls import register_converter
from meiduo_mall.utils import converters
register_converter(converters.UsernameConverter, 'username')
register_converter(converters.MobileConverter, 'mobile')
注:Django自带的路由转换器
# 位置在django.urls.converters.py
DEFAULT_CONVERTERS = {
'int': IntConverter(), # 匹配正整数,包含0
'path': PathConverter(), # 匹配任何非空字符串,包含了路径分隔符
'slug': SlugConverter(), # 匹配字母、数字以及横杠、下划线组成的字符串
'str': StringConverter(), # 匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
'uuid': UUIDConverter(), # 匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
}
flask
from flask import Flask,request,url_for
from werkzeug.routing import BaseConverter
app = Flask(__name__)
app.debug =True
class ListConverter(BaseConverter):
regex = '.*' # 这个regex代表都匹配的意思,可以根据自己的需求制定url规则
def to_python(self, value):
'''这个函数用于拿到了路由里的动态参数赋值给value,
可以在to_python进行操作动态参数,
返回操作完的的结果给视图函数的形参'''
return value.split('+')
def to_url(self, value):
'''这个函数用于和url_for连用,
url_for通过指定给动态参数(以关键字实参的形式)赋值给value
我们可以根据我们的需求操作url_for传进来的参数,
然后返回一个理想的动态路由内容拼接在url上'''
return '+'.join(value)
app.url_map.converters['list'] = ListConverter
@app.route('/student_list/<list:students>/')
def student_list(students):
print(url_for('student_list',students=['a','b'])) # 输出 /student_list/a+b/
return '{}'.format(students)
if __name__ == '__main__':
app.run()