Загрузка шаблонов URL без их активации? - PullRequest
0 голосов
/ 04 февраля 2019

В моем проекте Django есть два приложения: веб-инструмент и интерфейс REST.

Я запускаю интерфейс REST в моей системе баз данных (например, db.myhost.com).Этот интерфейс имеет только шаблоны URL, которые соответствуют различным конечным точкам REST:

app_name = "rest"
urlpatterns = [
    url(r'^report/id/(?P<rid>[0-9]+)/$', views.ReportByID.as_view()),
    url(r'^report/slug/(?P<slug>[a-z0-9-]+)/$', views.ReportBySlug.as_view()),
]

Часть данных, которые эти представления в конечном итоге показывают, нуждаются в ссылках на другое приложение в моем проекте (который я размещаю в отдельной системе),Это приложение также имеет шаблоны URL:

app_name = "mytool"
urlpatterns = [
    url(r'^some/cool/path/$', views.some_cool_path),
]

Интерфейс REST включает шаблоны URL REST только потому, что я хочу обслуживать конечные точки REST только через этот хост:

# On my REST system
ROOT_URL = "myproject.rest_urls"

Есть ликаким образом я могу заставить приложение REST загружать шаблоны URL mytool без их активации?Я не хочу, чтобы пользователь мог перейти к db.myhost.com/some/cool/path/ и получить ошибку, потому что этот путь не обслуживается на этом хосте, а обслуживается сервером веб-инструментов.Было бы полезно, однако, иметь возможность использовать reverse() для получения mytool URL, даже если они являются просто относительными фрагментами (т. Е. /some/cool/path ... Я всегда мог бы добавить имя сервера, что вряд ликогда-либо измениться).

Я мог бы жестко запрограммировать необходимые пути, но я хотел бы избежать необходимости делать это в случае, если они должны измениться в будущем.

1 Ответ

0 голосов
/ 05 февраля 2019

Мы можем сделать это, используя утилиту тестирования django override_settings декоратор.Он будет использовать временные настройки, поэтому он не окажет никакого влияния на работающий сайт.

settings.py

INSTALLED_APPS = [
    # .....
    'mytool',
    # .....
]
ROOT_URL = "myproject.rest_urls"

mytool / urls.py

from django.urls import path
from . import views


urlpatterns = [
    path('news/<slug:slug>/', views.NewsDetailView.as_view(), name='news_detail'),
]

mytool / utils.py

from django.test.utils import override_settings
from django.urls import reverse

def temp_reverse(url_conf, url_name, url_args=(), url_kwargs={}):

    @override_settings(ROOT_URLCONF=url_conf)
    def get_reverse(url_name, *args, **kwargs):
        return reverse(url_name, args=args, kwargs=kwargs)
    return get_reverse(url_name, *url_args, **url_kwargs)

доступ к обратному каналу для незарегистрированных URL

from mytool.urils import temp_reverse
url = temp_reverse('mytool.urls', 'news_detail', url_kwargs={'slug': 'django-awesome'})
print(url)
# output: /news/django-awesome/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...