Django基础第五天-路由控制

一 Django中路由的作用

本质URL配置(URLconf)就是与要为该URL调用的视图函数之间的映射表

from django.conf.urls import url

urlpatterns = [
     url(正则表达式, views视图函数,参数,别名),
]
  • 正则表达式:一个正则表达式字符串
  • views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
  • 参数:可选的要传递给视图函数的默认参数(字典形式)
  • 别名:一个可选的name参数
from app01 import views
url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test)

'^test/$'    ^是以test开头,$是以test/为结尾(当test后面没有内容时浏览器会自动补全/)

# 在settings中设置成false,再带后缀斜杠,浏览器就不能匹配该网址了
APPEND_SLASH=False

伪静态页面

# url(r'^get_book/(\d+).html', views.test3),
.html对于百度对网站进行SEO优化的权限相对会更高,方便被检索

 浏览器输入:127.0.0.1:8000/get_book/3.html
urls.py:url(r'^get_book/(\d+).html',views.test.3)
views.py:def test3(request,nid):    #注意传入两个参数需要在函数内也要传入两个形参
                    return HttpResponse('我是这本书的详情'+nid)

浏览器显示结果:
我是这本书的详情3

 路由关系小结:
基础知识,无名分组:url(r'^admin/', admin.site.urls),
    # 第一个参数,可以写一个正则表达式
    # 从上往下匹配,一旦匹配成功,就不往下走了
    # 如果分几个组,相应的视图函数,就应该接收几个
    # 在setting里设置:APPEND_SLASH=False,请求时,浏览器不会自动补全斜杠,带上斜杠就匹配失败
    # 伪静态,方便搜索引擎收录

有名分组小结:
    1 url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test)
    2 def test(request,month,year):
        print(year)
        print(month)
        return HttpResponse('ok')
        #名字必须一致,否则报错,位置可以颠倒,如果分了两个组,必须用两个参数接
    3 有名分组和无名分组不要混用
    4 有名分组可以用**kwargs接收,无名分组可以用*args接收
    5 分组捕获的参数,都是str类型
    6 可以设置默认值 

import re
# 括号---》分组
ret=re.search('test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})','test/2015/12')
print(ret.group())
print(ret.group(1)) #按位置,取了组内第1个:?P<year>[0-9]{4})  结果:2015
print(ret.group(2)) #按位置,取了组内第2个:?P<month>[0-9]{2})
print(ret.group('year'))    # ?P<> 为有名分组,按关键名来取值 结果:2015
print(ret.group('month'))

路由分发:
    1 先在app01、app02...的urls.py中导入from django.conf.urls import include
    2 路由分发,有两种方式:(推荐使用方式二)
        (1)    from app01 import urls
                 from app02 import urls as urls2
                 url(r'app01/',include(urls)),
        (2)    url(r'^app01/', include('app01.urls'))
    3 在相应的app里创建urls  py文件,建议,不要改名字
    4 urlpatterns 不能变名字 ,后面的写法就一样了 url(r'^test',views.test3 ),
    5 重复上面步骤,分发多个 

在版本上对于path的不同使用:
2.x和1.x的区别
    1 2.x的re_path 就是我原来的url
    2 2.x多了一个path,不支持正则

反向解析
    1 路由中,命一个名,url(r'^index/', views.index,name='n1'),
    2 在视图函数里:
        from django.shortcuts import reverse
        #这样就能拿到我反向解析出来的url
        url=reverse('n1')
    3 在模板里用:
        {% url 'n1'%}
    4 带位置参数反向解析  url(r'^index/([0-9]{4})/([0-9]{2})', views.index,name='n1'),
        视图:url=reverse('n1',args=(2012,12,))
        
        模板:{% url 'n1' 2012 12 %}
    5 带关键字参数反向解析  url(r'^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.index,name='n1'),
        视图:url=reverse('n1',args=(2012,12,)   ---可以
              url=reverse('n1',kwargs={'year':2014,'month':12})-----也可以
              
        模板:
            {% url 'n1' 2012 12 %}----可以
            {% url 'n1' month=12 year=2012 %}----可以
        注意:按位置传,顺序是固定的
                
    作用:修改路由中url的时候,其它地方不需要改动

猜你喜欢

转载自blog.csdn.net/qq_17513503/article/details/82384756