我先做个网站怎么做的,常德本地网络论坛,wordpress 3.9 上传,wordpress内链添加位置简介
路由简单的来说就是根据用户请求的 URL 链接来判断对应的处理程序#xff0c;并返回处理结果#xff0c;也就是 URL 与 Django 的视图建立映射关系。
Django 路由在 urls.py 配置#xff0c;urls.py 中的每一条配置对应相应的处理方法。
Django 不同版本 urls.py 配…简介
路由简单的来说就是根据用户请求的 URL 链接来判断对应的处理程序并返回处理结果也就是 URL 与 Django 的视图建立映射关系。
Django 路由在 urls.py 配置urls.py 中的每一条配置对应相应的处理方法。
Django 不同版本 urls.py 配置有点不一样
1、Django1.1.x 版本
url() 方法普通路径和正则路径均可使用需要自己手动添加正则首位限制符号。
? 1 2 3 4 5 6 from django.conf.urls import url # 用 url 需要引入 urlpatterns [ url(r^admin/$, admin.site.urls), url(r^index/$, views.index), # 普通路径 url(r^articles/([0-9]{4})/$, views.articles), # 正则路径 ]
2、Django 2.2.x 之后的版本
path用于普通路径不需要自己手动添加正则首位限制符号底层已经添加。re_path用于正则路径需要自己手动添加正则首位限制符号。
? 1 2 3 4 5 6 from django.urls import re_path # 用re_path 需要引入 urlpatterns [ path(admin/, admin.site.urls), path(index/, views.index), # 普通路径 re_path(r^articles/([0-9]{4})/$, views.articles), # 正则路径 ]
总结Django1.1.x 版本中的 url 和 Django 2.2.x 版本中的 re_path 用法相同。
二、正则路径中的分组
1、正则路径中的无名分组
无名分组按位置传参一一对应。
views 中除了 request其他形参的数量要与 urls 中的分组数量一致。
urls.py
? 1 2 3 4 urlpatterns [ path(admin/, admin.site.urls), re_path(^index/([0-9]{4})/$, views.index), ]
views.py
? 1 2 3 4 from django.shortcuts import HttpResponse def index(requestyear): print(year) # 一个形参代表路径中一个分组的内容按顺序匹配 return HttpResponse(菜鸟教程) 2、正则路径中的有名分组
语法
? 1 (?P组名正则表达式)
有名分组按关键字传参与位置顺序无关。
views 中除了 request其他形参的数量要与 urls 中的分组数量一致 并且 views 中的形参名称要与 urls 中的组名对应。
urls.py
? 1 2 3 4 urlpatterns [ path(admin/, admin.site.urls), re_path(^index/(?P[0-9]{4})/(?P[0-9]{2})/$, views.index), ]
views.py
? 1 2 3 4 from django.shortcuts import HttpResponse def index(request, year, month): print(year,month) # 一个形参代表路径中一个分组的内容按关键字对应匹配 return HttpResponse(菜鸟教程) 3、路由分发(include)
存在问题Django 项目里多个app目录共用一个 urls 容易造成混淆后期维护也不方便。
解决使用路由分发include让每个app目录都单独拥有自己的 urls。
步骤
1、在每个 app 目录里都创建一个 urls.py 文件。2、在项目名称目录下的 urls 文件里统一将路径分发给各个 app 目录。
? 1 2 3 4 5 6 7 from django.contrib import admin from django.urls import path,include # 从 django.urls 引入 include urlpatterns [ path(admin/, admin.site.urls), path(app01/, include(app01.urls)), path(app02/, include(app02.urls)), ] 在各自 app 目录下写自己的 urls.py 文件进行路径跳转。
app01 目录:
? 1 2 3 4 5 from django.urls import path,re_path from app01 import views # 从自己的 app 目录引入 views urlpatterns [ re_path(r^login/(?Pm[0-9]{2})/$, views.index, ), ]
app02 目录:
? 1 2 3 4 5 from django.urls import path,re_path from app02 import views # 从自己的 app 目录引入views urlpatterns [ re_path(^xxx/(?P[0-9]{4})/$, views.xxx), ] 在各自 app 目录下的 views.py 文件中写各自的视图函数。
三、反向解析
随着功能的增加路由层的 url 发生变化就需要去更改对应的视图层和模板层的 url非常麻烦不便维护。
这时我们可以利用反向解析当路由层 url 发生改变在视图层和模板层动态反向解析出更改后的 url免去修改的操作。
反向解析一般用在模板中的超链接及视图中的重定向。
1、普通路径
在 urls.py 中给路由起别名name路由别名。
? 1 path(login1/, views.login, namelogin) 在 views.py 中从 django.urls 中引入 reverse利用 reverse(路由别名) 反向解析:
? 1 return redirect(reverse(login)) 在模板 templates 中的 HTML 文件中利用 {% url 路由别名 %} 反向解析。
? 1 form action{% url login %} methodpost 2、正则路径无名分组
在 urls.py 中给路由起别名name路由别名。
? 1 re_path(r^login/([0-9]{2})/$, views.login, namelogin) 在 views.py 中从 django.urls 中引入 reverse利用 reverse(路由别名args(符合正则匹配的参数,)) 反向解析。
? 1 return redirect(reverse(login,args(10,))) 在模板 templates 中的 HTML 文件中利用 {% url 路由别名 符合正则匹配的参数 %} 反向解析。
? 1 form action{% url login 10 %} methodpost 3、正则路径有名分组
在 urls.py 中给路由起别名name路由别名。
? 1 re_path(r^login/(?Pyear[0-9]{4})/$, views.login, namelogin) 在 views.py 中从 django.urls 中引入 reverse利用 reverse(路由别名kwargs{分组名:符合正则匹配的参数}) 反向解析。
? 1 return redirect(reverse(login,kwargs{year:3333})) 在模板 templates 中的 HTML 文件中利用 {% url 路由别名 分组名符合正则匹配的参数 %} 反向解析。
? 1 form action{% url login year3333 %} methodpost 四、命名空间
命名空间英语Namespace是表示标识符的可见范围。
一个标识符可在多个命名空间中定义它在不同命名空间中的含义是互不相干的。
一个新的命名空间中可定义任何标识符它们不会与任何重复的标识符发生冲突因为重复的定义都处于其它命名空间中。
存在问题路由别名 name 没有作用域Django 在反向解析 URL 时会在项目全局顺序搜索当查找到第一个路由别名 name 指定 URL 时立即返回。当在不同的 app 目录下的urls 中定义相同的路由别名 name 时可能会导致 URL 反向解析错误。
解决使用命名空间。
普通路径
定义命名空间include 里面是一个元组格式如下
? 1 include((app名称urlsapp名称))
实例
? 1 2 path(app01/, include((app01.urls,app01))) path(app01/, include((app02.urls,app02))) 在 app01/urls.py 中起相同的路由别名。
? 1 path(login/, views.login, namelogin) 在 views.py 中使用名称空间语法格式如下
? 1 reverse(app名称路由别名)
实例
? 1 return redirect(reverse(app01:login) 在 templates 模板的 HTML 文件中使用名称空间语法格式如下
? 1 {% url app名称路由别名 %}
实例
? 1 form action{% url app01:login %} methodpost