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()

posted @ 2021-05-26 00:30  kopok  阅读(183)  评论(0编辑  收藏  举报