Django小结-1-路由配置
1.路由流程
2.路由表达式的分类
2.1 精确字符串规格式
如articles/2018/
2.2 转换格式:
也称路径转换器,如果想要让捕获的参数符合条件,那么我们会用到路径转化器符号是冒号 : eg:<int:age>常用的路径转化器,例如articles/<int:year>
- int : 匹配任意整数
- path : 匹配任意非空字符
- str : 匹配除了 / 路径分隔符外所有字符串
- uuid : 格式化id
- sulg : 匹配任意ASCII字符和连字符及下划线
2.3 正则表达式
第一种是分组的,在视图中根据参数名传参:
re_path(r'plan/(?P<year>\d\d\d\d)/(?P<month>[0-9]|1[0-2])/',plan),
第二种是不分组的,在视图中安位置传参:
re_path(r'plan/(\d{4})\([0-9]|1[0-2]/',plan),
3.路由转换器
3.1 path路由转换器
path(route,view,kwargs=None,name=None)
route : (必须有)是一个字符串的url规则
view : (必须有)是个视图
kwargs :(可有可无)额外参数,是字典类型,传递给view
name :(可有可无)url名字
from django.urls import path
from login import views
urlpatterns = [
path('index/',views.index), #精准字符串
path('register/',views.register,name='register'), #精准字符串
path('index/index_action/',views.index_action,name='index_action'),
path('main/',views.main)
]
from django.contrib import admin
from django.urls import path, re_path
from blog import views
urlpatterns = [
path('index/',views.index),
re_path(r'^article/(?P<article_id>[0-9]+)$',views.article_page, name='article_page'), #正则表达式
re_path(r'article/edit/(?P<article_id>[0-9]+)$',views.article_edit_page,name='article_edit_page'),
path('article/action/',views.article_edit_page_action,name='article_edit_page_action'),
re_path(r'article/delete/(?P<article_id>[0-9]+)$',views.article_delete_page,name='article_delete_page'),
]
3.2 re_path转换器(老版的url)
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), #正则表达式
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]
4.路由的分发
通常,我们会在每个app里,各自创建一个urls.py路由模块,然后从根路由出发,将app所属的url请求,全部转发到相应的urls.py模块中。
根路由urls:
from django.contrib import admin
from django.urls import path, include
import blog
import login
from blog import urls
from login import urls
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/',include((blog.urls,'blog'),namespace='blog')),
path('login/',include((login.urls,'login'),namespace='login')),
]
include((targe_url,'命名'),namespace='命名’)
子路由url
from django.urls import path
from login import views
urlpatterns = [
path('index/',views.index),
path('register/',views.register,name='register'),
path('index/index_action/',views.index_action,name='index_action'), #name命名
path('main/',views.main)
]
5.反向解析
HttpResponseRedirect(reverse('news-year-archive', args=(year,))) # 同redirect("/path/")