2010-12-21 72 views
2

我有一种情况,我基本上允许任何URL,没有前缀;我一直在考虑设计它的一种方式,基本上有两个''匹配 - 第一个将会看到它是否可以满足要求,如果不能满足要求,则会落到第二个。Django URLConf中的“Fallthrough”?

  • 如果我raise Http404从第一视角,我得到一个404页。

  • 如果我return,我得到一个ValueError抱怨我“没有返回一个HttpResponse对象。”

django.core.urlresolvers代码看简单地说,我相当确信架构根本不到位,做到这一点 - 它解析为一个单一的比赛,该URL解析阶段是从视图完全独立阶段,一旦你进入了视图,就不会返回到URL解析阶段。它是否正确?我个人认为这是一个轻微的缺陷;我可以看到,如果有两种类型的404--其中一种说“不,它不存在”,如现在这样做,还有一种说“我不知道它”,这会使它看起来很有用通过进一步的URLConf。在我看来,像任何人想要这种系统的风格基本上都必须替换Django的URL解析部分。我已经解决了这个问题(基本上把一个简单的视图放在一个,然后另一个视图),所以我不认为我真的有任何需要这个特殊的东西了,但我仍然是这样, m好奇,如果有这样做,我只是没有发现,或者是否可能有一个整洁的解决方法。

回答

0

我认为你在末尾提到的解决方法是在Django中这样做的正确方法。它是视图合约的一部分,它必须返回一个HttpResponse,所以没有办法避免这种情况。

+1

不完全;他们可以'提高Http404'。我想要'raise URLNotResolved'这样的东西来告诉它继续打猎,但我不认为它存在于任何地方。 – 2010-12-22 05:54:00

0

我不知道你为什么在这里有两个看法。当然,你真的只有一种观点,可以做两件事(甚至更多)。改变你的看法功能如下:

if canDoMethod1(request): 
    doMethod1(request) 
else: 
    doMethod2(request) 

或其他。这会在任何网址上触发。排序。

+0

对于我自己,我现在可以做到这一点(正如我在最后一段中提到的那样),但我只是觉得能够以另一种方式做到这一点会更合适。必须有人们这样做的情况 - “试试:......;除了Http404:...' - 其中一些'引发URLNotResolved'可能更简洁。 – 2010-12-22 06:13:58

+0

你总是可以自己定义一个新的URLNotResolved异常,并让你的视图在try/except结构中捕获。虽然它可能会变得混乱,与一堆嵌套尝试1 /除了尝试2 /除了事情。 – Spacedman 2010-12-22 09:38:53

相关问题