Django之路由

目录

  • 一 Django中路由的作用
  • 二 简单的路由配置
  • 三 有名分组
  • 四 路由分发
  • 五 反向解析
  • 六 名称空间
  • 七 django2.0版的path
  • 路由开口

一: Django中路由的作用

请求的路径跟视图函数的映射关系

二 :简单的路由配置

from django.conf.urls import url

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

示例:

'''
 一些请求的例子:

/articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数views.month_archive(request, '2005', '03')
/articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
/articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。请像这样自由插入一些特殊的情况来探测匹配的次序。
/articles/2003 不匹配任何一个模式,因为每个模式要求URL 以一个反斜线结尾。
/articles/2003/03/03/ 将匹配最后一个模式。Django 将调用函数views.article_detail(request, '2003', '03', '03')。
   
    '''

三 :有/无名分组

--

分组的目的:

将请求路径中的数据分出来;
<form action="/test/?xxx=123&yyy=456" method="post">
a链接中的请求为GET请求;

有名分组

url(r'^test3/(?P<id>\d+)/(?P<name>\w+)$', views.test3),
有名分组分出几个值,视图函数就要接受几个值(按关键字传入,位置可以打乱),视图函数必须用对应的名字来接收参数(可以用**kwargs接收)
def test(request,id,name):
  ...

  易混淆

<a href="/updatebook/?id={{ book.pk }}">编辑</a>
a链接的请求都是get请求,get请求将数据显示到url路径里传给后台。要区别于url.py文件中配置的有名分组
如果需要获取数据,需要从request.GET里取。
url(r'^updatebook/', views.updatebook)
路由里没有分组,视图函数里就不需要接收!!!

无名分组

url(r'^test2/(\d+)/(\w+)$', views.test2),
无名分组分出几个值,视图函数就要接受几个值(位置参数形式传过来的)(可以用**args接收)

四 :路由分发

Django1.1版本的分发

from django.conf.urls import url,include

 

#主urls
from django.urls import path,re_path,include from app01 import views
from app01 import urls
urlpatterns = [ 
  # re_path(r'^app01/',include('app01.urls')),#行
  # re_path(r'^app01/&',include('app01.urls')),#不行
  path('app01/',include('app01.urls')),#行 
  #path('app01/', include(urls)),
]

在app01里创建一个urls

from django.urls import path,re_path
from app01 import views
urlpatterns = [
    re_path(r'^test/(?P<year>[0-9]{2})/$',views.url_test),
]

五 :反向解析

总结:

1 在模板层html代码里{% url "别名" 参数  参数%}

2 在视图函数中:

  2.1 url=reverse('test')

  2.2 url=reverse('test',args=(10,20))

举例:在模板层反向解析出要删除的图书路径
-url(r'^delbook/(?P<pk>\d+)', views.deletebook,name='deletebook'),
-<td><a href="{% url 'deletebook' book.pk%}">删除</a></td>
#book.pk是获取的要删除的书的id.

六 :名称空间

  由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回。我们在开发项目时,会经常
使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。
-include('app01.urls',namespance='app01')
-以后再反向解析:reverse('app01:别名'args=())

七 :django2.0版的path

django2.0的re_path和1.0的url一样。

path

路径是准确路径,不是正则表达式了

内置转换器

Django默认支持以下5个转化器:

  • str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
  • int,匹配正整数,包含0。
  • slug,匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

自定义转换器

例子:

class FourDigitYearConverter:  
    regex = '[0-9]{4}'  
    def to_python(self, value):  
        return int(value)  
    def to_url(self, value):  
        return '%04d' % value  

使用register_converter 将其注册到URL配置中:

from django.urls import register_converter, path  
from . import converters, views  
register_converter(converters.FourDigitYearConverter, 'yyyy')  
urlpatterns = [  
    path('articles/2003/', views.special_case_2003),  
    path('articles/<yyyy:year>/', views.year_archive),  
    ...  
]

八:路由开口

在根目录下创建media文件夹

MEDIA_ROOT=os.path.join(BASE_DIR,'media')
settings.py
url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),
url.py

 

posted @ 2019-01-16 23:31  ChuckXue  阅读(139)  评论(0编辑  收藏  举报