2016-11-30 3 views
0

Я пытаюсь добавить фильтр для шестнадцатеричных цветовых кодов (должен принимать форматы, такие как: 0xFF0000 или FF0000) в приложение для бутылок.Фильтр подстановочных бутылок для шестнадцатеричного цветового кода

Я последовал за эту бутылку учебник https://bottlepy.org/docs/dev/routing.html:

Вы можете добавить свои собственные фильтры к маршрутизатору. Все, что вам нужно, это функция, возвращающая три элемента: строка регулярного выражения, вызываемая для преобразования фрагмента URL-адреса в значение python и вызываемый, который делает обратное. Функция фильтра называется строкой конфигурации в качестве единственного параметра и может разобрать его по мере необходимости:

Но каждый раз, когда я называю моей функции:

@app.route('/<color:hexa>') 
def call(color): 
.... 

Я получаю 404:

Not found: '/0x0000FF' 

Возможно, я слепой, но я просто не знаю, чего у меня нет. Вот мой фильтр:

def hexa_filter(config): 
    regexp = r'^(0[xX])?[a-fA-F0-9]+$' 

    def to_python(match): 
     return int(match, 0) 


    def to_url(hexNum): 
     return str(hexNum) 

    return regexp, to_python, to_url 

app.router.add_filter('hexa', hexa_filter) 

ответ

0

Проблема делает ^ (и в конечном счете $).

Ваше регулярное выражение может использоваться как часть большого регулярного выражения, которое проверяет полный URL-адрес, поэтому ^ (а иногда и $) внутри большего регулярного выражения не имеет смысла.

from bottle import * 

app = Bottle() 

def hexa_filter(config): 
    regexp = r'(0[xX])?[a-fA-F0-9]+' 

    def to_python(match): 
     return int(match, 16) 

    def to_url(hexNum): 
     return str(hexNum) 

    return regexp, to_python, to_url 

app.router.add_filter('hexa', hexa_filter) 

@app.route('/<color:hexa>') 
def call(color): 
    return 'color: ' + str(color) 

app.run(host='localhost', port=8000) 
+0

Удивительно, спасибо! работает отлично! Мне, вероятно, придется немного поработать над этим! –

Смежные вопросы