在 Django 中,我们使用一种叫做 URLconf
(URL 配置)的机制 。 URLconf 是一套模式,Django 会用它来把 URL 匹配成相对应的 View。
URL在Django中如何工作?
以#
开头的行是注释
使用 编辑器打开 mysite/urls.py
就能看到它长什么样子了:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
# Examples:
# url(r'^$', 'mysite.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
]
在这段代码其中,我们看到他已经定义了 admin的URL了,我们之前也访问过了。url(r'^admin/', include(admin.site.urls)),
使用正则表达式的时候,需要把一个r放在前面。r
表示现在开始正则表达式。
正则表达式
Django是是用正则表达式(regex)来将URL 匹配到view的。
正则表达式简介
^ 表示文本的开始
$ 表示文本的结束
\d 表示数字
+ 表示前面的元素应该重复至少一次
() 用来捕捉模式中的一部分
其他定义在模式中的部分会保留原本的含义。
现在,想象你有一个网站,其中有一个 URL 类似这样:http://www.mysite.com/post/12345/
。其中 12345
是帖子的编号。
为每一个帖子都写一个单独的视图是一件会让人恼火的事情。 用正则表达式,我们可以创建一种模式,用来匹配 URL 并提取出帖子编号:^post/(\d+)/$
。 让我们一步一步将它分解,看看里面做了什么:
- ^post/ 告诉 Django 在 URL 的开头匹配
post/
(后于^
) - (\d+) 表示 URL 中会有一个数(一位或者多位数字),并且我们想提取出这个数
- / 告诉 Django 后面紧跟着一个
/
字符 - $ 表示 URL 的末尾,即以
/<1>
结尾的 URL 才会被匹配到第一个Django url
新建一个mysite/urls.py
文件, 并且写入如下代码。 ``` from django.conf.urls import include, url from django.contrib import admin
urlpatterns = [ url(r’^admin/‘, include(admin.site.urls)), url(r’’, include(‘blog.urls’)), ]
### blog.urls
现在我们创建一个新的 `blog/urls.py` 空文件。好了!加入以下两行:
from django.conf.urls import url from . import views
我们仅仅把 Django 的方法以及 `blog` 应用的全部 `views` 导入了进来。(目前什么都没有,但是不超过一分钟就能搞好!) 然后,我们可以加入第一个 URL 模式:
urlpatterns = [ url(r’^$’, views.post_list, name=’post_list’), ]
``
正如你所见,我们现在分配了一个叫作
postlist的
view到
^$的 URL 上。 这个正则表达会会匹配
^(表示开头)并紧随
$(表示结尾),所以只有空字符串会被匹配到。 这是正确的,因为在 Django 的 URL 解析器中,'[http://127.0.0.1:8000/](http://127.0.0.1:8000/)' 并不是 URL 的一部分。(译注:即只有 '[http://127.0.0.1:8000/](http://127.0.0.1:8000/)' 后面的部分会被解析。如果后面的部分为空,即是空字符串被解析。) 这个模式告诉了 Django,如果有人访问 '[http://127.0.0.1:8000](http://127.0.0.1:8000/)' 地址,那么
views.post_list是这个请求该去到的地方。<br />最后的部分,
name=’post_list’` 是 URL 的名字,用来唯一标识对应的 view。 它可以跟 view 的名字一样,也可以完全不一样。 在项目后面的开发中,我们将会使用命名的 URL ,所以在应用中为每一个 URL 命名是重要的。我们应该尽量让 URL 的名字保持唯一并容易记住。
一切都搞定了?在浏览器里打开 http://127.0.0.1:8000/ ,看看结果。
“It works” 不见了,啊?不要担心,这只是个错误页面,不要被吓到了。它们实际上是非常有用的:
你会发现有一个 no attribute ‘post_list’ (没有 ‘post_list’ 属性)的错误。 _post_list 提醒你什么东西了吗? 这是我们的 view 的名字! 这表示其他的一切正常,但是我们还没创建这个 view 。 不要担心,我们将会抵达那里。
如果你想知识更多关于 Django URLconf 的知识,去官方文档看一看:https://docs.djangoproject.com/en/1.8/topics/http/urls/