加载URL模式而不激活它们?

时间:2019-02-04 17:59:02

标签: python django django-rest-framework

我的Django项目中有两个应用程序:一个Web工具和一个REST界面。

我在数据库系统上运行REST接口(例如db.myhost.com)。该界面仅具有与各种REST端点相对应的URL模式:

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接口仅启用REST URL模式,因为我只想通过该主机提供REST端点:

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

有没有一种方法可以使REST应用程序加载mytool URL模式而不激活它们?我不希望用户能够浏览到db.myhost.com/some/cool/path/并收到错误消息,因为该路径不在该主机上提供,而是由Web工具服务器提供。但是,能够使用reverse()获取mytool的URL会很有帮助,即使它们只是相对的片段(即/some/cool/path ...我也可以始终在服务器前添加名称,几乎不可能更改。)

我可以对必要的路径进行硬编码,但我想避免这样做,以防将来需要更改。

1 个答案:

答案 0 :(得分:1)

我们可以使用django test utils 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)

反向访问未注册的网址

from mytool.urils import temp_reverse
url = temp_reverse('mytool.urls', 'news_detail', url_kwargs={'slug': 'django-awesome'})
print(url)
# output: /news/django-awesome/