加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在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 / … – 找到了
> / api / foo / – 未找到
> / foo / – 找到了

我怎样才能让它变得更简单,更有意思?

解决方法

如果您在两个网址中执行此操作,我认为您的意图会更明确:

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)
> / api / foo将执行SomeView
> / foo将执行MainView

编辑

要解决注释中的第一点: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()))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读