码迷,mamicode.com
首页 > 其他好文 > 详细

Django - 路由控制

时间:2018-09-06 22:55:13      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:rgb   字符串   重命名   bsp   没有   for   rtc   首页   index   

一 Django中路由的作用

URL配置就好像Django所支撑网站的目录。本质是URL与要为该URL调用的视图函数之间的映射表,就是以这样方式告诉Djang,对于客户端发来的某个URL该调用哪一段逻辑代码对应执行

二 简单的路由配置

from django.conf.urls import url

urlpatterns = [
     url(正则表达式, views视图函数,参数,别名),
]
  • 正则表达式:一个正则表达式字符串
  • views视图函数:一个可调用对象,通常是一个视图函数 或者 指定视图函数路径的字符串
  • 参数:可选的要传递给视图函数的默认参数(字典形式)
  • 别名:可选的name参数
from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^index/,views.index),
    url(r^articles/([0-9]{4}),views.articles),
    url(r^articles/([0-9]{4})/([0-9]{2}),views.articles),

]

无名分组:使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图

  • 第一个参数,可以写一个正则表达式
  • 从上往下匹配,一旦匹配成功,就不再继续
  • 如果分了几个组,相应的视图函数就应该接受几个
  • 不要添加一个前导的反斜杠,因为每个URL都有
  • 每个正则表达式前面的 r 是可选的但是应该加上。它告诉python这个字符串是“原始的” ,字符串中任何字符都不应该被转义

APPEND_SLASH

在setting里设置:APPEND_SLASH=False,请求时,浏览器不会自动补全斜杠,带上斜杠就匹配失败

伪静态

方便搜索引擎收录(手动加上.html  看起来是静态的) 具体如下:

url(r^edit_book/(\d+).html,views.edit_book)
视图层:def(request,nid):
模板:<form action=/adit_book/{{book.nid}}.html method=post>


三 有名分组

命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式

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 可以设置默认值

四 路由分发

1 先导入from django.conf.urls import include
2 url(r^app01/, include(app01.urls)),有两种方式:。。。。(建议用这种)
        另一种:
        先导入 from app01 import urls
              from app02 import urls as xxx  # urls名字可以改为其他名,但是不建议 这是为了避免重名
                
                    url(r^app01/,include(urls))
                    url(r^app02/.include(xxx))
                
3 在相应的app里创建urls  py文件,建议,不要改名字
4 urlpatterns 不能变名字 ,后面的写法就一样了 url(r^test,views.test3 ),
5 重复上面步骤,分发多个

路由由上往下匹配,如果有一个没有匹配上,在最后位置加上一个:万能的(匹配任意)       

url(r‘‘,views.index)   胡乱输入会返回首页

五 反向解析

1 路由中,命一个名,url(r^index/, views.index,name=n1),
2 在视图函数里:
    from django.shortcuts import reverse
    #这样就能拿到我反向解析出来的url
    url=reverse(n1)
    再重定向 return redirect(url)
3 在模板(html页面)里用:
    {% 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的时候,其它地方不需要改动


六 名称空间

路由分发时重命名用到名称空间(知道它,但是建议不同app的url里name不能重名,app的名字_name 解析时用这个名字)

1   url(r^app01/, include(app01.urls,namespace=app01)),
        urlpatterns = [
            url(r^test,views.test3 ,name=test),

        ]
    url(r^app02/, include(app02.urls,namespace=app02)),            
        urlpatterns = [
                url(r^test02,views.test3 ,name=test),

            ]
2 在视图函数里:
    url=reverse(app01:test)
    print(url)
    
    url=reverse(app02:test)
    print(url)
3 在模板里:
    <a href="{% url ‘app02:test‘ %}">点我跳到首页</a>

Django - 路由控制

标签:rgb   字符串   重命名   bsp   没有   for   rtc   首页   index   

原文地址:https://www.cnblogs.com/kingyanan/p/9601043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!