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