Django入门到放弃之路由
# 项目文件夹下的urls.py文件中的url写法: from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ # url(r'^admin/', admin.site.urls), #首页 url(r'^$', views.base), url(r'^app01/', include('app01.urls')), url(r'^app02/', include('app02.urls')), ] # app01下urls.py内容写法 from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^$', views.app01base), url(r'^index/', views.index), ] app02下urls.py内容写法 from django.conf.urls import url from django.contrib import admin from app02 import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^$', views.app02base), url(r'^home/', views.home), ]
#1 无名分组的使用 ### 无名分组,把分组分出来的值,当作位置参数传递给视图函数 url(r'^login/([0-9]{4})/([0-9]{2})', views.login), #2 有名分组的使用 ### 有名分组,把分组出来的值,当作关键字参数传递给视图函数 url(r'^login/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.login), #3 有什么作用 可以从url地址中解析出参数,传递给视图函数使用 #4 案例 # 这种地址,把人名和id分出来 # 有名分组 # ilovejaney/p/13748739.html url(r'^(?P<name>.*?)/p/(?P<id>\d+).html', views.article), # 无名分组 url(r'^(.*?)/p/(\d+).html', views.article), # 5 伪静态 -原来是动态页面/login 做成/login.html 伪装成静态页面,便于seo优化 -seo优化: -https://www.cnblogs.com/liuqingzheng/articles/9509792.html
url(r'^books/(\d{4})/', views.year_books), #匹配年份的 url(r'^books/(\d{4})/(\d{1,2})/', views.year_month_books), #匹配年份和月份的 # http://127.0.0.1:8000/books/2001/ 视图: def year_month_books(request,year,month): #位置参数,第一个参数接收的就是无名分组路径中匹配 到的第一个分组的数据,第二个参数接收的就是无名分组路径中匹配到的第二个分组的数据 print(year,month) # return render(request,'books.html') return HttpResponse(year+month)
# urls.py中 from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ] # views.py中,可以为num指定默认值 def page(request, num="1"): pass
1 通过路由的别名,解析出路由的地址 url(r'/home/',views.home,name='home') 2 用在视图函数中: url=reverse('home') # home就是路由的别名 print(url) 3 模板文件中使用 {% url 'home' %} 4 有什么作用 -动态根据路由别名获得路径,一旦路径改变,不需要改其他代码
# urls.py path( 'index/<str:name',views.index, name='login') # 视图函数 url==reverse('login',args=['xxx']) # xxx 为字符串 url==reverse('login',kwargs={'name':'xxx'}) # name为有名分组的名称
1 路由做反向解析时,有同名路由,出现问题 2 在做路由分发时,给每个app的路径设置一个名称空间 3 使用步骤 1 在总路由中设置 # include第二个参数app01: app的名字 namespace='名称空间的名字' # path('app01', include(('app01.urls','app01'),namespace='index')) path 设置 注意 app01后没有/ url(r'^app01',include(('app01.urls','app01'),namespace='index')) -2 子路由中: url(r'/index/',views.meinv,name='meinv') -3 app01 views.py def meinv(request): url = reverse('index:meinv') # reverse('名称空间的名字:路由的别名') print(url) return render(request,'index.html') -3 模板文件中使用 index.html <a href="{% url 'index:meinv' %}">哈哈</a>
Django默认支持以下5个转化器: str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式 int,匹配正整数,包含0。 slug,匹配字母、数字以及横杠、下划线组成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?) 2 例子 -path('login/<int:year>', views.login), -path('login/<str:year>', views.login), -path('login/<path:p>', views.article), 3 高级例子 -实现匹配这种路径:http://127.0.0.1:8000/liuqingzheng/p/4444.html -path('<str:name>/p/<int:id>.html', views.article), -re_path(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login), -url(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login), # url在2.x以后不建议使用 4 转换器可以不可以在re_path中使用?不能!!!!
对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点: 1.regex 类属性,字符串类型 2.to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。 3.to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。 例子: 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), ... ]
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少