routes - модуль для построения роутинга веб приложения

Официальная страница доки

Данный модуль позволяет написать роутинги для веб приложения

from routes import Mapper
mapper = Mapper()

Основные методы

Зарегистрируем наш первый урл и получим информацию по урлу

mapper.connect(None, "/blog/{categoty}/{id}")
mapper.match('/blog/python/4')
# {'category': 'python', 'id': '4'}

или

from routes.route import Route
routes = [
    Route("index", "/index.html", controller="home", action="index"),
]
mapper.extend(routes)

Описание параметров запроса:

  • первый аргумент - короткое название для конкретного роутинга
  • второй аргумент - вид урла, который будет сраавниваться

Это основные аргументы, в след за которыми можно передать специфичные атрибуты, которые мы хотим получить:

mapper.connect(
    '/blog/{category}/{id}', 
    controller='blog_controller')
mapper.match('/blog/python/4')
# {'category': 'python', 'id': '4', controller='blog_controller'}

map.extend(routes, "/subapp")
# /subapp/index.html => {"controller": "home", "action": "index"}

Также мы можем добавить какую-то валидацию полей

mapper.connect(r'/blog/{category}/{id:\d+}')
mapper.connect(r'/blog/{category:windows|linux}/{id:\d+}')
mapper.connect(
    r'/blog/{category:windows|linux}/{id}',
    requirements={'id': r'\d+'})

Можем накладывать условия для запросов

def referals(environ, result):
    result["referer"] = environ.get("HTTP_REFERER")
    return True

m.connect(
    "/user/list", 
    conditions={
        'method': ["GET", "HEAD"],
        'sub_domain': True,
        # 'sub_domain': ['fred', 'george'],
        function=referals
    }
)

Другие примеры

# возьмем часть урла запроса
mapper.connect(r'/blog/{category:.*}/{id}')
mapper.match('/blog/windows/windows/6.png')
# {'category': u'windows/windows', 'id': u'6'}

# получим формат файла
mapper.connect(r'/download/{file_name}{.format}')
mapper.match('/download/file.txt')
# {'file_name': 'file', 'format': 'txt'}

# получим формат файла, на формат файла наложим ограничение
mapper.connect(r'/download/{id:\d+}{.format:json}')
mapper.match('/download/1.json')
# {'file_name': '1', 'format': 'json'}

Настройка субмапперов

with map.submapper(controller="home") as m:
    m.connect("home", "/", action="splash")
    m.connect("index", "/index", action="index")

или

m = map.submapper(controller="home")
m.connect("home", "/", action="splash")
m.connect("index", "/index", action="index")

что приведет к таким настройкам роутинга

"/index" => {"controller": "home", action="index"}

Автогенерация урлов

Для автогенерации урлов, модуль предоставляет свой функционал

from routes import Mapper, URLGenerator

mapper = Mapper()
mapper.connect('blog', r'/blog/{category}/{id}')

url = URLGenerator(mapper, {})
print url('blog', category='windows', id=5, limit=100)
# /blog/windows/5?limit=100

Построение REST

Для построения ресурсов для реста используем:

map.collection("entries", "entry")
print map
Route name   Methods Path                        Controller action
entries      GET     /entries{.format}           entry      index
create_entry POST    /entries{.format}           entry      create
new_entry    GET     /entries/new{.format}       entry      new
entry        GET     /entries/{id}{.format}      entry      show
update_entry PUT     /entries/{id}{.format}      entry      update
delete_entry DELETE  /entries/{id}{.format}      entry      delete
edit_entry   GET     /entries/{id}/edit{.format} entry      edit

Можем доконфигурировать наш ресурс:

# добавим дополнительный урл для ресурса
# "GET /message/rss"  =>  ``Messages.rss()``.
mapper.resource("message", "messages", collection={"rss": "GET"})

# добавим дополнительный экшен для элемента ресурса
# "POST /message/1/mark"  =>  ``Messages.mark(1)``
mapper.resource('message', 'messages', member={'mark':'POST'})

# добавим родительский ресурс
mapper.resource('location', 'locations',
    parent_resource={
        'member_name': 'region',
        'collection_name': 'regions'
    })

Middleware

Также модуль имеет мидлваре, который добавляет в environ данные по парсингу урла

from routes.middleware import RoutesMiddleware
app = RoutesMiddleware(app, mapper)

В результате обработки входящего запроса, в окружении запроса будет следующее:

environ['wsgiorg.routing_args'] = ((url, match))
environ['routes.route'] = route
environ['routes.url'] = url