【问题标题】:Django: include other urlpatterns in a single urls.pyDjango:在单个 urls.py 中包含其他 urlpatterns
【发布时间】:2009-07-15 02:11:00
【问题描述】:

我在myproject.myapp.urls 做这样的事情:

from django.conf.urls.defaults import *

urlpatterns = patterns('myproject.myapp.views',
    (ur'^$', 'index'),
    (ur'^browse/$', 'browse'),
    (ur'^request/new/$', 'new_request'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/$', 'view1'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/asdf$', 'view2'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/qwer$', 'view3'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/zxcv$', 'view4'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/tyui$', 'view5'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/ghjk$', 'view6'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/bnm/more-looong-url/$', 'view7'),
    ...
)

我尝试重构上述规则并将它们定义在另一个文件urls2.py 中,如下所示:

(ur'^(?P<url_key>[-a-zA-Z0-9]+)/', include('myproject.myapp.urls2')),

但它似乎会导致包括 urlresolvers 在内的单元测试出现问题。

这里有没有更好的方法来“重构”正则表达式的公共部分 (&lt;url_key&gt;)?

【问题讨论】:

  • 造成了什么问题?使用 include('') 通常非常简单。您能否描述它给出的错误,或者输出与您的预期有何不同?

标签: django django-urls


【解决方案1】:

我不是 django 专家,但 'view1' 项是否会匹配它下面的所有其他条目,因为它最后没有 '$'?因此其他视图将没有机会匹配。

【讨论】:

  • +1 将所有内容放在最后,或者只为每个网址添加 $。
【解决方案2】:

我不认为你可以用这条线做你想做的事情:

(ur'^(?P<url_key>[-a-zA-Z0-9]+)/', include('myproject.myapp.urls2'))

url_key 参数将被传递到哪个视图?

我不确定你为什么要重构 urlpatterns,但也许这样会更好?:

from django.conf.urls.defaults import *

URL_KEY = ur'^(?P<url_key>[-a-zA-Z0-9]+)'

urlpatterns = patterns('myproject.myapp.views',
    (ur'^$', 'index'),
    (ur'^browse/$', 'browse'),
    (ur'^request/new/$', 'new_request'),
    (URL_KEY+ur'/$', 'view1'),
    (URL_KEY+ur'/asdf$', 'view2'),
    (URL_KEY+ur'/qwer$', 'view3'),
    ...etc
)

【讨论】:

  • 好吧,我已经解决了我的测试问题并仍然采用了我原来的解决方案,但这是一个很好的建议。所以我选择这个作为答案。 :)
【解决方案3】:

也许您可以简化myproject.myapp.urls 中的表达式,而是将信息作为参数传递给myproject.myapp.views 中的函数?

我不确定您的测试出了什么问题,但一般来说,您可以在 myproject.myapp.views 中做更多事情,因为您不必全部基于正则表达式逻辑。

myproject.myapp.views 中的那个函数将是一个调用 view1、view2 等的交换机

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多