express.js喜欢Django中的url

时间:2012-11-19 01:59:15

标签: django url configuration express

我们可以在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')

2 个答案:

答案 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来使用此类包装器以保持其轻量级。