Match all URLs without prefix in Django

I am currently using the following urls.py:

api_patterns = [
    url(r'^users/', include('users.urls', namespace='user')),
]

internal_patterns = [
    # ...
]

urlpatterns = [
    url(r'^api/', include(api_patterns)),
    url(r'^internal/', include(internal_patterns)),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^(?!(?:api|internal|admin)/)', MainView.as_view()),
]

The point of this configuration is rendering MainViewif the url has no prefix api, internalor admin:

  • /api/users/... - found
  • /api/foo/ - not found
  • /foo/ - found

How can I make it simpler and more understandable?

+4
source share
2 answers

I think your intention will be clearer if you do this in two URLs:

url(r'^(api|internal|admin)/', SomeView.as_view()),
url(r'^.*', MainView.as_view())

MainView will only be executed if the URL does not start with api, internal or admin.

SomeView , URL- api/internal/admin, . 404 .

:

  • /api/users include(api_patterns)
  • /api/foo SomeView
  • /foo MainView

Edit

: url , , . ( , ):

d = OrderedDict([
    (r'api', api_patterns),
    (r'internal', internal_patterns),
    (r'admin', admin.site.urls),
])

main_view_re = r'^!({})/'.format('|'.join(d.keys()))

urlpatterns = [url(r'^{}/'.format(k), include(v)) for k, v in d]
urlpatterns.append(url(main_view_re, MainView.as_view()))
+2
urlpatterns = [
    url(r'^api/', include(api_patterns)),
    url(r'^internal/', include(internal_patterns)),
    url(r'^admin/', include(admin.site.urls)),
    url(r'', MainView.as_view()),
]

URL-, URL- URL- api, internal admin.

-1
source

Source: https://habr.com/ru/post/1623803/


All Articles