用于DRYness的Django url配置

时间:2010-06-28 20:01:28

标签: django django-urls django-middleware

我的项目中的大多数视图都接受可选的用户名参数,如果存在,则过滤传递给该用户的模板的查询集。所以,例如:

索引视图处理以下网址模式:

'^$' # general index page
'^(?P<username>[-\w]+)/$' # index page for the user

'^photos/$' # photo index page
'^(?P<username>[-\w]+)/photos/$' # photos for that user
...

由于存在许多此类应用程序,因此通过复制模式来实现相同的逻辑似乎并不严重。我认为可以递归地包含主urls.py模块,所以我这样做了:

url(r'^(?P<username>[-\w]+)/', include('urls')),

我的理由是,当包含其他网址模块时,匹配的模式将从路径中删除。所以,我希望

'^(?P<username>[-\w]+)/photos/$'

会变成

'^photos/$'

当它与递归包含的urls模块匹配时,使用额外的username参数。但这导致开发服务器在发出请求时无声地死亡。

我能想到的第二种方法是编写一个中间件,它与url中的模式匹配(如果存在),并将查看的用户添加到请求中,并从请求路径中删除与用户名匹配的部分。但我不想惹这条路,因为这可能会产生不可预测的结果。

你会推荐什么?我对DRYness太挑剔了吗?

谢谢, OMAT

1 个答案:

答案 0 :(得分:1)

只需将正则表达式定义为同一文件中的字符串,并使用字符串连接!

user_regex = r"^(?P<username>[-\w]+)/"

然后你可以做正则表达式'%s/photos$'%user_regex,这样你就可以只保留一次正则表达式,非常干燥。

Altho',您在url标记中包含urls.py模式的原因是正确的,我不确定它为什么会失败。也许是其他一些错误?

相关问题