在Django中匹配所有没有前缀的url
发布时间:2020-12-20 13:09:27 所属栏目:Python 来源:网络整理
导读:我目前正在使用以下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
我目前正在使用以下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()),] 如果url没有api,internal或admin前缀,则此配置的目的是呈现MainView: > / api / users / … – 找到了 我怎样才能让它变得更简单,更有意思? 解决方法
如果您在两个网址中执行此操作,我认为您的意图会更明确:
url(r'^(api|internal|admin)/',SomeView.as_view()),url(r'^.*',MainView.as_view()) 仅当网址不以api,internal或admin开头时,才会执行MainView. 如果网址以api / internal / admin开头但与上面的模式不匹配,则会执行SomeView.您可以自定义此视图以返回默认的404页面,或根据需要执行其他功能. 使用您的示例: > / api / users将执行include(api_patterns) 编辑 要解决注释中的第一点: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())) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |