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')
url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),