LINUX.ORG.RU

Как написать роутер

 , ,


0

1

Создаю зачем-то фреймворк, и без понятия как роутер написать. Чтобы в находить в хеше вроде {«/»: 1, «/smth/:id»: 2, «/*anything»: 3} Задаваемые циферки, или текст, или что там будет, и параметры получать. Готовые исходники смотрел-смотрел, ничего не понял. Туториалов по этому не нашел.


Допустим, location.hash.split('/') и перебирать элементы.

Вообще, через хеш роутер делать — прошлый век. Используй History API.

xenohunter
()
Ответ на: комментарий от xenohunter

Так на сервере, не в js, какая тут history. Что за длина по 50 вообще не понял.Мне кажется, нужно сначало регекспом заменить все слова, начинающиеся с : другим регекспом, а эти слова при этом в какой-то массив положить и так вот сохранить в куда-нибудь. А уже потом имея uri его матчить по каждому роуту из массива и переменные вытаскивать. И как это все, ума не приложу. Фреймворк на lua пишу, потому что увидел в бенчмарках, что убер-пупер быстрый выходит, но ссыль на реализацию на другом языке - буду рад, на php нашел короткое и опять ничего не понял, желательно не php.

Romaboy
() автор топика
Ответ на: комментарий от Romaboy

Чё там делать-то?

routes = {
    'name': {
        'method': 'GET'
        'pattern': r'/path/(?P<a>[a-z]+)/(?P<b>[a-z]+)/(?P<c>[\d]+)',
        'handler': handler_func
    },
    #... 
}
for name, options in routes.items():
    group = re.match(options['pattern'], req.uri)
    if group:
        if req.method != options['method']:
            continue
        return {'handler': options['handler'], 'params': g.groups()}

Если нужно побыстрее, то тут уже надо думать. Но хорошо, что есть куда посмотреть. Вот например: https://github.com/nikic/FastRoute

Kilte ★★★★★
()
Ответ на: комментарий от Romaboy

Окей, разбить путь на куски с помощью split всё равно будет намного быстрее, чем разбирать путь регуляркой.

Грубо говоря, регулярные выражения парсят строку так:

:
:a
:ab
:abc

И, если запрашиваемый путь будет вида: /api/files/v0/upload-files/upload-to-some-service/, то регекспом он будет парситься намного дольше, чем если мы превратим строку в массив строк: ['api', 'files', 'v0', upload-files', 'upload-to-some-service'], а потом будем сравнивать строки с необходимыми банальной проверкой на равенство.

Если же речь только про парсинг двоеточий и звёздочек при инициализации роутера, то неважно, чем парсить. То есть, да, регулярками удобнее всего будет. Возможно, я просто не уловил суть вопроса.

xenohunter
()

Можно заморачиваться иерархическим HashMap c разбиением на сегменты, но вы тогда ограничите пользователя в мощности регулярных выражений, которые будет поддерживать ваш фреймворк. С практической точки зрения даже линейный поиск по списку прекомпилируемых регулярных выражений будет работать нормально. Если не верите, то получите реальные числа бенчмарком и сравните с показателями суммарной скорости обработки запроса существующими фреймворками опубликованым в Интернете

vertexua ★★★★★
()

Луа-луа, забавный и очень бедный язык. Тут ни нативной разбивки строки, методы для regex'пов работают странно и ограниченно. Зато быстрый и настолько забавный, что попробовать стоит. Вот отсюда код взял: https://github.com/leafo/lapis/blob/master/lapis/router.moon Сначала думал, что автор слишком уж перемудрил, на самом деле на луа оно так и должно быть. Kilte, откуда у тебя переменная g с методом groups взялась не знаю, может в питоне своя магия - g имел в ввиду group, а groups() возвратил match, но в луе все хардкорней

Romaboy
() автор топика
Ответ на: комментарий от Romaboy

Kilte, откуда у тебя переменная g с методом groups взялась не знаю, может в питоне своя магия - g имел в ввиду group, а groups() возвратил match, но в луе все хардкорней

Ошибочка вышла. group там должно быть.

Kilte ★★★★★
()
Ответ на: комментарий от Deleted

Да а хуль, я роутер сделал! Сделал контроллеры как в рельсах, только слов меньше получилось! Шаблонизатор взял etlua, выглядит ровно как erb, только переменные чисто переменные, без «@», то есть в контроллере posts, значит и во вьюхе posts. Научился пользоваться grunt, потом выкинул его и научился gulp, в нем не было компилятора moonscript, так что даже свой обработчик сделал, чтобы системный вызывался. Ещё буквально пара мелочей, вроде переписать activerecord, разделить development и production, реализовать миграции и все, молниеносный и суперудобный фреймворк готов, вот оно что. Сишку всмысле покури (что странно) или язык (что ещё страннее)? С компилировать надо - уже убивает мое желание с языком этим работать, переменные объявлять - да лениво как-то.

Romaboy
() автор топика
Ответ на: комментарий от xenohunter

В любом случае, есть только один способ узнать наверняка — провести бенчмарк.

PolarFox ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.