Django -- 路由系统(URLconf)

URLconf

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的view函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

 '''
   
    urlpatterns = [
         url(正则表达式, views视图函数,参数,别名),

      re_path(正则表达式, views视图函数,参数,别名),(在2.0以上版本中使用re_path)
]


参数说明:

正则表达式(regex):

regex是正则表达式的通用缩写,它是一种匹配字符串或url地址的语法。Django拿着用户请求的url地址,在urls.py文件中对urlpatterns列表中的每一项条目从头开始进行逐一对比,一旦遇到匹配项,立即执行该条目映射的视图函数或二级路由,其后的条目将不再继续匹配。因此,url路由的编写顺序至关重要!需要注意的是,regex不会去匹配GET或POST参数或域名,例如对于https://www.example.com/myapp/,regex只尝试匹配myapp/。对于https://www.example.com/myapp/?page=3,regex也只尝试匹配myapp/。如果你想深入研究正则表达式,可以读一些相关的书籍或专论,但是在Django的实践中,你不需要多高深的正则表达式知识。

性能注释:正则表达式会进行预先编译当URLconf模块加载的时候,因此它的匹配搜索速度非常快,你通常感觉不到。

view试图函数:
当正则表达式匹配到某个条目时,自动将封装的HttpRequest对象作为第一个参数,正则表达式“捕获”到的值作为第二个参数,传递给该条目指定的视图。如果是简单捕获,那么捕获值将作为一个位置参数进行传递,如果是命名捕获,那么将作为关键字参数进行传递。

参数(kwargs):
任意数量的关键字参数可以作为一个字典传递给目标视图。

别名(name):
对你的URL进行命名,可以让你能够在Django的任意处,尤其是模板内显式地引用它。相当于给URL取了个全局变量名,你只需要修改这个全局变量的值,在整个Django中引用它的地方也将同样获得改变。这是极为古老、朴素和有用的设计思想,而且这种思想无处不在。


    '''

 

单一路由对应

1 re_path(r'^index/$', views.index),

用户访问http://127.0.0.1:8000/index 然后后端使用view中index()函数处理

基于正则的路由对应

1 urlpatterns = [
2      re_path(r'^host/(\d+)$', views.host),
3      re_path(r'^host_list/(\d+)/(\d+)$', views.host_list), 
4 ]

^host/(\d+)$
相对应的url是: ”http://127.0.0.1/host/2“ (\d+)是匹配任意的数字,在分页时灵活运用。
在views.host中需要指定一个形式参数来接受(\d+)\$ 的值

\^host_list/(\d+)/(\d+)$

相对应的url是: ”http://127.0.0.1/host/8/9“,匹配到的数字会以参数的形式按照顺序传递给views里面相对应的函数
在views.host_list中需要指定两个形式参数,注意:此参数的顺序严格按照url中匹配的顺序

有名分组

1 urlpatterns = [ 
2      re_path(r'^user_list/(?P<v1>\d+)/(?P<v2>\d+)$',views.user_list), 
3  ]

?P<v1>\d+)
正则表达式的分组,相当于一个字典, key=v1, value=\d+。 {"v1":"\d+"}
然后将此参数传递到views里对应的函数,可以不按照顺序
def user_list(request,v2,v1):

     return HttpResponse(v1+v2)
参数v1 = (?P<v1>\d+)
参数v2 = (?P<v2>\d+)

根据app对路由规则进行分类

如果一个项目下有很多的app,那么在urls.py里面就要写巨多的urls映射关系。这样看起来很不灵活,而且杂乱无章。
我们可以根据不同的app来分类不同的url请求。
首先,在urls.py里写入urls映射条目。注意要导入include方法

1 urlpatterns = [
2 
3     re_path(r'^app01/', include('app01.urls')),
4     re_path(r'^app02/', include('app02.urls')),
5 
6 ]

这条关系的意思是将url为”app01/“的请求都交给app01下的urls去处理

其次,在app01下创建一个urls.py文件,用来处理请求的url,使之与views建立映射

1 urlpatterns = [
2 
3     re_path(r'index/$', views.index),
4 
5 ]

想对于url请求为: "http://127.0.0.1/app01/index/"

为路由映射设置名称

1 url(r'^home', views.home, name='h1'),
2 url(r'^index/(\d*)', views.index, name='h2'),

设置名称之后,可以在不同的地方调用,如:

  • 模板中使用生成URL    {# <form action="/index/" method="post">#}  <form action="{% url 'INDEX' %}" method="post">
  • 函数中使用生成URL     reverse('h2', args=(2012,))      路径:django.urls.reverse

 

posted @ 2018-08-05 18:20  苦行僧PH  阅读(151)  评论(0编辑  收藏  举报