我们可以在django中使用像url配置的express.js吗?有时使用正则表达式会是一个巨大的痛苦!
express.js urls:
app.get('/users/:id/feed',function(){})
django网址:
url(r'^users/(?P<id>.*)/feed$', 'users.views.feed')
我认为express的url conf比django简单得多。在django这样的网址很不错,看起来不错:
url('/users/:id/feed', 'users.views.feed')
答案 0 :(得分:2)
在核心Django中,您只能使用正则表达式指定URL。
我不熟悉express.js但是通过使用正则表达式,你可以做一些很酷的事情,如:
位置和命名参数
# named
url(r'^(?P<foo>.*)/(?P<foo2>.*)/$', 'view', name='view')
# corresponds to
# something does not have to be supplied
def view(request, something=None, foo=None, foo2=None)
...
和
# positional
url(r'^(.*)/(.*)/$', 'view', name='view')
# corresponds to
# all groups in regex are supplied in the same order (positions)
def view(request, foo, foo2)
...
计算反向网址
# with
url(r'^some/path/(?P<foo>.*)/(?P<foo2>.*)/$', 'view', name='view')
>>> reverse('view', kwargs={'foo':'hello', 'foo2':'world'})
u'some/path/hello/world/'
限制网址
url(r'^some/path/(?P<id>\d+)/$', 'view', name='view')
# will only allow urls like
# some/path/5/
# some/path/10/
# and will reject
# some/path/hello/
# some/path/world/
答案 1 :(得分:2)
为了在Django中使用更简单的url结构,您需要编写一个实用程序函数,将您的url格式转换为正则表达式格式。
这是一个基于你的例子的简单函数:
def easy_url(url_str):
patt = re.compile(r':\w+/?')
matches = patt.findall(url_str)
for match in matches:
var = match[1:-1]
# generate re equivalent
var_re = r'(?P<%s>\w+)/'%var
url_str = url_str.replace(match, var_re)
url_str += '$'
return url_str
# in your url file
url(easy_url('/users/:id/feed/'), 'users.views.feed')
您可以更新此功能以指定网址变量的类型,例如数字等。
但是,正则表达式非常强大,你可以用它们做很多事情。因此,您应该仅使用具有简单规则的URL来使用此类包装器以保持其轻量级。