Django强大的URL机制

最近使用Django开发了大卫粘贴系统, 了解到了Django内嵌的强大的URL机制. 它的强大在于2个方便, 一个是灵活的url配置, 另外一个就是url的可逆机制.下面, 我们就来了解下Django的URL机制.

1. 灵活的配置
大家都知道, Django的url使用的正则匹配的方式, 这种方式有好也有坏, 好的地方是, 可以匹配出任何你想要的url, 不好的地方就是, 任何一个url都需要手工的去配置, 不能根据Model或者App进行自适配, 就像一般的MVC框架一样, 同一个controller下都有统一的url规则.

基本规则
一条简单的url配置如下:

(r'^register/$', 'pastesite.pastebin.views.register'),
当用户在浏览器输入http://localhost:8000/register/的时候, Django会把请求转到pastesite这个站点的pastebin这个app的views.py里的register方法, 怎么样, 非常的清晰明了吧.
参数传递
让我们再来看看稍微复杂点的url规则:

(r'^user/(?P<username>\w+)/$', 'pastesite.pastebin.views.user'),
在这个规则里, http://localhost:8000/user/kingheaven/会找到user这个方法, 并把kingheaven传给变量username, 这样, 在user这个方法里, 就可以使用username这个变量了, user方法的定义必须是这样的, def user(request, username).
实际上, 通过url往view里传参数, 还有另外一种方式, 看下面的url规则:

(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
在这个url规则里, 地址http://localhost:8000/articles/2009/10/1912/会把2009, 10和1912按照顺序传递给article_detail方法, article_detail方法的定义如下, def article_detail(request, year, month, article_id), 这样就够了, 怎么样, 也很简单吧.
导入其它的url规则
Django允许你导入另外一个url文件, 来使你的app更加独立. 每个app都是用自己的urls配置文件, 然后在整站的urls配置一下, 使所有app的urls全部生效, 看下面的规则:

(r'^paste/', include('pastesite.pastebin.urls')),
这样, 所有paste/开头的请求, 都会转到pastesite/pastebin/urls.py去找到合适的url去匹配了.

2.逆转URL
这里借用了逆转裁判的名字, 哈哈. Django的url机制包括了一个url的方向机制, 只要我们定制了一条url的规则, 就可以根据这个规则, 根据view方法的名字, 反向推回一个url.
比如在model里, 我们定义一个get_absolute_url方法, 如下:

@permalink
def get_absolute_url(self):
return ('pastesite.pastebin.views.show', None,
{'paste_id': self.id})
使用@permalink这个修饰器以后, return里可以写上url中对应的view方法的名字, 这样, get_absolute_url将会去urls.py里查找该view对应的url规则, 并生成该url, 同时, 可以传递该url需要的参数过去. 听上去有一些复杂, 让我们看一下刚才那个方法对应的url规则:

urlpatterns = patterns('pastesite.pastebin.views',
(r'^(?P<paste_id>\d+)/$', 'show'),
)
不知道大家看明白了吗, 通过这条url, 可以找到这个view; 通过get_absolute_url, 可以生成对应这个url规则的url. 也就是说, 你只需要改一处url的设置, 就可以使我们的url变化, 而不需要去程序去满足这个改变, 非常的方便.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值