2015-05-07 7 views
3

Мне понравилось много соглашений, используемых Overholt example, но столкнулись с конкретной проблемой.Использование url_for между двумя приложениями

У меня есть два приложения, установленные с использованием объекта DispatcherMiddleware из werkzeug.wsgi:

from werkzeug.wsgi import DispatcherMiddleware 
from myapp import api, frontend 

application = DispatcherMiddleware(frontend.create_app(), { 
    '/api': api.create_app() 
}) 

Это прекрасно работает; конечные точки все есть. Проверка application.app.url_map отображает отображения для интерфейса, а application.mounts['/api'].url_map отображает отображения для api правильно.

Проблема, с которой я столкнулся, заключается в том, что я хочу использовать url_for() в моих шаблонах frontend для методов в api, но не нашел способ сделать эту работу. Hardcoding пути URL работает, но позже вызовет проблемы, если я хочу перемещать вещи.

+1

Приложения, выполняемые диспетчером, изолированы друг от друга. – dirn

ответ

0

Что вы можете сделать, это добавить новый маршрут к вашему внутреннему концу, скажем /api/route-map, который выплевывает карту (словарь/JSON) маршрутов (вы можете использовать url_for для создания карты) и ударить по этому маршруту с вашего чтобы получить динамическую карту маршрута, которую вы можете использовать через свои интерфейсные шаблоны с помощью вашей пользовательской функции jinja2 (которую вы можете создать, как показано ниже).

def api_url_for(route_fn_string): 
    """ 
    This is just boilerplate code. Please do some checking here. 
    '""" 
    return route_map[route_fn_string] 


app.jinja_env.globals.update(api_url_for=api_url_for) 

Теперь вы можете сделать в шаблоне jinja2, чтобы получить его фактический маршрут.

Если вы размещаете оба приложения на одном сервере, вы можете просто поделиться картой маршрута как глобальной или с помощью функции getter.

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