DjangoAgain_url路由系统
Django项目的创建
路由系统
url和函数之间对应路由关系
-
/login/-> def login():;一一对应的关系
一条url对应一个页面一个函数 -
get请求自动创建一个url,或者说携带get请求信息的url:
/xxxx/xxxx/?nid=9527
URL配置为url(r'^edit/',views.edit),
。跳转到某个具体的细节页面就只能用?=
的get形式
SEO(Search Engine Optimization)搜索引擎优化,搜索引擎判定搜索的优先级
由于以上get请求携带的url,默认判定的SEO比较低(因为这种url的变化比较多)
所以可以通过/xxxx/xxxx/9527这种类型的传参方式来创建url
URL配置url(r'^edit/(\w+)/',views.edit),
此时和上面get传参不同,这时候如果需要函数获取值就得在函数里额外定义接收参数的位置
# url: http://127.0.0.1:8000/edit/ffff/
# urls.py文件中的配置:
`url(r'^edit/(\w+)',views.edit),`
# views.py文件中设置的函数
def edit(request,a1):
print(a1)
# a1=ffff
return HttpResponse('.....')
但是实际上我们为了统配这些url(考虑到多个参数)传入视图函数的参数可以使用*args,**kwargs
-
按位置传值的url
url(r'^edit/(\w+)/(\w+)/(\w+),html$',views.edit),
那么这种传参的方式,是不是一种“按位置传参?”
这种传参方式,的确是严格按照位置来进行传参的 -
按别名传参的url
url(r'^edit/(?P<a1>\w+)/(?P<a2>\w+)/(?P<a3>\w+),html$',views.edit),
上述这种定义url的方式,相当于给url中传入的三个参数分别命名
这时候在视图函数中获取就需要:
def edit(request,a1,a2,a3):
print(a1,a2,a3)
return HttpResponse('....')
这时候传参就按照url中的别名为准。
- 混合使用
如果同时使用了位置传参和可命名的传参,会比较混乱,老师上课并没有讲一个具体的解决方案,仅推荐统一用法。
所以就当这种用法不存在,只是一种错误情况
实践:
# url1
url(r'^edit/(?P<a1>\w+)/(?P<a2>\w+)/(?P<a3>\w+)',views.edit)
# views1
def edit(request,a1,a2,a3):
print(a1,a2,a3)
return HttpResponse('....')
# http://127.0.0.1:8000/edit/hello/scott/turbo
#result1
"""
hello scott turbo
[12/Jul/2017 17:27:51] "GET /edit/hello/scott/turbo HTTP/1.1" 200 4
"""
#--------------------------------
# url2
url(r'^edit/(?P<a1>\w+)/(?P<a3>\w+)/(?P<a2>\w+)',views.edit)
# views2
def edit(request,a1,a2,a3):
print(a1,a2,a3)
return HttpResponse('....')
# http://127.0.0.1:8000/edit/hello/scott/turbo
#result2
"""
hello turbo scott
[12/Jul/2017 17:27:51] "GET /edit/hello/scott/turbo HTTP/1.1" 200 4
"""
小知识点:$终止符固定url匹配
- 伪静态
观察一些别的网站,发现他们都是用.html
结尾的。
url(r'^edit/(\w+).html$',views.edit),
这并不是一个真的“html”,这只是一条url正则
用户发起一个html请求,服务器获得请求之后会直接把请求读到,并不经过模板引擎的渲染(?)直接返回给用户。这种类型的网站我们称作为静态网站。优点就是“快”。
而动态网站除了经过模板渲染,还可能需要去数据库里获取一些数据,这个交互的过程就使得动态网站的响应过程相对长一些,慢一些。
携带了这个“.html”会让这个网站的SEO权重更高
一一对应的路由--------->静态路由
通过正则匹配获得数据的路由------------>动态路由
路由分发
from django.conf.urls import url,include
作用是,将原来project_name文件夹中的urls.py变成一个根索引节点,发散开去各个对应的应用文件夹中寻找功能模块。
这样就有条理地分开了一些功能模块的路由匹配,同时也避免了一些正则路由重复的问题。
实际操作:
- 在/project_name/urls.py中添加一个
include
模块,并且将url指向文件夹中的urls.py文件
from django.conf.urls import url,include
urlpatterns = [
url(r'^app01/', include("app01.urls")),
url(r'^app02/', include("app02.urls")),
]