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),
...
]
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少

浙公网安备 33010602011771号