代码之家  ›  专栏  ›  技术社区  ›  Jonah Bishop

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

  •  0
  • Jonah Bishop  · 技术社区  · 6 年前

    我的Django项目中有两个应用程序:一个web工具和一个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() 得到 URL,即使它们只是相对片段(即。 /some/cool/path ... 我总是可以在服务器名称前面加上前缀,这不太可能改变)。

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   anjaneyulubatta505 Anshik    6 年前

    我们可以使用django测试utils来完成它 override_settings 室内装修设计师它将使用临时设置,因此不会对实时站点产生任何影响。

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

    mytool/url.py

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

    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/