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

  1. 按位置传值的url
    url(r'^edit/(w+)/(w+)/(w+),html$',views.edit),
    那么这种传参的方式,是不是一种“按位置传参?”
    这种传参方式,的确是严格按照位置来进行传参的

  2. 按别名传参的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中的别名为准。

  1. 混合使用
    如果同时使用了位置传参和可命名的传参,会比较混乱,老师上课并没有讲一个具体的解决方案,仅推荐统一用法。
    所以就当这种用法不存在,只是一种错误情况

实践:

# 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变成一个根索引节点,发散开去各个对应的应用文件夹中寻找功能模块。
这样就有条理地分开了一些功能模块的路由匹配,同时也避免了一些正则路由重复的问题。

实际操作:

  1. 在/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")),
]
原文地址:https://www.cnblogs.com/scott-lv/p/7510968.html