配置路由urlconf
一般配置路由在urls.py文件中
urlpatterns = [path('正则表达式',views.视图函数,参数,别名),
]
参数说明:
1、一个正则表达式字符串
2、一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
3、可选的要传递给视图函数的默认参数(字典形式)
4、一个可选的name参数(别名)
例子:
urlpatterns = [path('index/<int:year>',views.hello),path('addstudent/<str:name>',views.add_student),
]
- 注意
- 要捕获一段url中的值,需要使用尖括号,而不是之前的圆括号;
- 可以转换捕获到的值为指定类型,比如例子中的int:name。默认情况下,捕获到的结果保存为字符串类型,不包含/这个特殊字符;
- 规则的前面不需要添加/,因为默认情况下,每个url都带一个最前面的/。比如:articles, 不能写成 /articles。
path转换器
django默认情况下内置的路由转换器:
1 str 匹配任何非空的字符串,不包含/ 为django的默认转换器 path(‘index’,add/str:name,views.test)
2 int 匹配0和正整数,返回一个int类型 path(‘index’,add/int:name,views.test)
3 slug 匹配任何ascii字符以及连接符 下划线 例如:lixinyu_1-test (不常用)
4 uuid 存储通用唯一识别码 但是字母必须小写,必须使用破折号 返回uuid对象 (不常用)
5 path 匹配任何非空字符串,可以包含/ 此转换器可以匹配整个url而不是一段一段url字符串(不常用)
正则表达式路由
- 正则表达式中 使用的是re_path()
在python正则表达式中,命名正则表达式的语法是(?Ppattern),其中name是组的名称,pattern是需要匹配的规则
特点 1 year中匹配不到非四位数字,这是正则表达式决定的
2 传递给视图的所有参数都是字符串类型例
from django.urls improt path,re_path
from 项目app文件夹 import views
urlpatterns = [
path(‘add/2003/’,views.add_student),
#表示add/2003/这个路径映射views模块的add_student函数
re_path(r’^add(?P[0-9]{4})/KaTeX parse error: Expected 'EOF', got '#' at position 28: …_student), #̲表示匹配4个0-9的任意数字,…’, views.add_student),
表示匹配数字,不进行传参。
指定视图参数的默认值
使用视图参数的默认值就是给视图函数中赋值,而后传递到路由中
例
from django.urls import path
from blog import views
urlpatterns = [
path(‘admin/’, admin.site.urls),
path(‘blog/int:num/’,views.study),
path(‘blog/pageint:num/’,views.study),
]#views.py中创建
def study(request, num=1):
return HttpResponse(‘展示内容’)地址内输入
http://127.0.0.1:8000/blog/1/
http://127.0.0.1:8000/blog/page1/两个URL模式指向同一个视图views.study —— 但是第一个模式不会从URL 中捕获任何值。如果第一个模式匹配,page() 函数将使用num参数的默认值"1"。如果第二个模式匹配,page() 将使用正则表达式捕获的num 值。
错误页面处理
当Django找不到与请求匹配的URL时,或者抛出一个异常时,将调用一个错误处理视图。错误视图包括400、403、404和500,分别表示请求错误、拒绝服务、页面不存在和服务器错误
handler400 ——django.conf.urls.handler400 请求错误
handler403 ——django.conf.urls.handler403 拒绝服务
handler404 ——django.conf.urls.handler404 页面不存在
handler500 ——django.conf.urls.handler500 服务器错误
这些值可以在根URLconf中设置 在其它app中的二级URLconf中设置这些变量无效
Django中又内置的HTML模板,用域返回错误页面给用户,也可以自定义错误页面
首先在根URLconf中额外增加下面的条目
from django.conf.urls import url
from blog import views
urlpatterns = [
url(r’^blog/ ′ , v i e w s . s t u d y ) , u r l ( r ′ b l o g / p a g e ( ? P < n u m > [ 0 − 9 ] + ) / ', views.study), url(r'^blog/page(?P<num>[0-9]+)/ ′,views.study),url(r′blog/page(?P<num>[0−9]+)/’, views.study),
]
#增加的条目
handler400 = views.bad_request
handler403 = views.permission_denied
handler404 = views.page_not_found
handler500 = views.page_error在views.py中增加四个处理视图
def page_not_found(request):
return render(request, ‘404.html’)def page_error(request):
return render(request, ‘500.html’)def permission_denied(request):
return render(request, ‘403.html’)def bad_request(request):
return render(request, ‘400.html’)
而后根据需要在templates文件夹下创建404.html、403.html、400.html、500.html四个页面
urls分层模块化(路由分发)
通常在每个app里各自创建一个urls.py路由模块,从根路由出发,将所属url请求全部转发到想用的urls.py模块中
from django.urls import include,path
urlpatterns = [
path(‘community/’, include(‘aggregator.urls’)),
path(‘contact/’, include(‘contact.urls’))
]
路由转发使用的时include()方法,需要提前导入,参数是转发目的地路径的字符串,路径以圆点分割
例子中的正则表达式没有包含$,但是包含一个末尾的斜杠,每当Django遇到include()(来自django.conf.urls.include())时,会去掉url中匹配的部分并将剩下的字符串发送给include的URLconf做进一步处理,也就是转发二级路由。
个人观点:
路由分发就是项目本身的路由不承担过多的路由,将路由分发到子app的urls.py中,功能类似于蓝图的作用
在项目本身urls.py里导入include,本身主urls.py只负责设置子路由的路径,而后在子app设置路由参数。
主app
url_pro/urls.pyfrom django.contrib import admin
from django.urls import path,re_path,include
from url_app import views
urlpatterns = [path('admin/', admin.site.urls),path('abc/',include('url_app.urls',namespace='url_app')),path('url_app1/', include('url_app1.urls',namespace='url_app1'))
]子app
url_app1/urls.pyfrom django.urls import path,re_path
from . import views# 子路由文件
app_name = 'url_app1'
urlpatterns = [#path('',views.index)#re_path(r'^$',views.index)#re_path(r'([a-z]{3})/(\d+)/',views.index)#path('<int:id_>/<str:name>/',views.index)re_path(r'^$',views.index,name='index')
]url_app/urls.pyfrom django.urls import path,re_path
from . import views
# 子路由文件app_name = 'url_app'
urlpatterns = [#path('',views.index)#re_path(r'^$',views.index)#re_path(r'([a-z]{3})/(\d+)/',views.index)#path('<int:id_>/<str:name>/',views.index)path('test/',views.test,name='test'),path('redir/',views.redir,name='redir'),re_path(r'index/',views.index,name='index')
]
问:URLconf匹配请求URL中的哪些部分?
答 :
请求的URL被看做是一个普通的Python字符串,URLconf在其上查找并匹配。进行匹配时将不包括GET或POST请求方式的参数以及域名。
URLconf不检查使用何种HTTP请求方法,所有请求方法POST、GET、HEAD等都将路由到同一个URL的同一个视图。在视图中,才根据具体请求方法的不同,进行不同的处理。
例如:
在http://qzone.qq.com/8436830/的请求中,URLconf将查找8436830
http://qzone.qq.com/8436830/?page=4的请求中,URLconf也将查找8436830
配置路由urlconf相关推荐
- Jfinal 2.1版本,JFinalConfig里自动配置路由的代码实现,直接晒代码
2019独角兽企业重金招聘Python工程师标准>>> 背景: 1.我使用的jfinal2.1: 2.我喜欢用@ActionKey("/admin/index") ...
- Windows server 2012 搭建×××图文教程(二)配置路由和远程访问服务
Windows server 2012 搭建×××图文教程(一)安装×××相关服务 Windows server 2012 搭建×××图文教程(二)配置路由和远程访问服务 Windows server ...
- php为什么需要配置路由器,laravel 配置路由 api和web定义的路由的区别详解
1.路由经过中间件方面不同 打开kerenl.php就可以看到区别 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware ...
- IP地址的划分和配置路由
IP地址:是一种在Internet上的给主机编址的方式,也称为网际协议地址.常见的IP地址,分为IPv4与IPv6两大类: 路由:路由器能把不是同一个网段的网络设备连接起来,使它们能够建立通信: IP ...
- Django之创建应用以及配置路由
Django之创建应用以及配置路由 配置所有IP都可以访问你的项目 1.进入manage.py同级的my_web里面的settings.py的文件 2.在文件的第28行把ALLOWED_HOSTS = ...
- MVC 配置路由 反复走控制其中的action (int?)
关于在MVC中配置路由,定义上具体参数时候,一定不要定义 public ActionResult QDSJSBQT(string jzbh, string sdate, string edate, i ...
- 微服务升级_SpringCloud Alibaba工作笔记0008---spring gateway配置路由的两种方式
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上节说的,这里可以看到通过yml配置路由,到右边对应起来,可以看到 predicates 这个是断 ...
- vue 安装element_vue实战开发007:vue引入Element-UI并配置路由
今天准备使用Element-UI来写个项目测试下学习的功能,要在vue中引用Element-UI组件,我们需要先来安装下Element-UI,这里我们用VScode工具编写,这里使用 npm 的方式安 ...
- Vue3 + cli4 配置路由
vue-cli4 路由配置 文章目录 vue-cli4 路由配置 前言-vue路由 一.基本路由配置 1.配置router/index.js 2.让路由改变 二.路由懒加载技术 三.路由嵌套 四.动态 ...
最新文章
- mysql主键始终从小到大_Mysql从入门到入神之(四)B+树索引
- python处理字符串数组慢_Python字符串处理 - str/bytes
- LAMP源代码编译整理
- CodeForces - 93B(贪心+vectorpairint,double +double 的精度操作
- MongoDB3.x中添加用户和权限控制
- GitHub 优秀的 Android 开源项目第二篇——转自多篇网络文章
- 用html制作简单考试系统,巧用EXCEL制作模拟考试系统
- 移动边缘计算将如何实现元宇宙?
- Java反射 二三事
- perl Data::Dumper和Storable的例子
- 营收、净利双收,贝壳找房稳了?
- 【算法笔记】三种背包问题——背包 DP
- 谈谈“五级工程师和职业发展”的思考
- 前端图片通过src读取服务器图片
- tableView for TTXS
- 2022非常全的接口测试面试题及参考答案-软件测试工程师没有碰到算我输~
- Magic Leap 价值 20 多亿美元的 AR 幻梦,现在醒了
- 新手小白初学Java(一)一些简单知识
- 大厂小厂都在用的RAID软件磁盘阵列技术,必须学起来!
- 服务引用定义配置(服务的注册与发现)
热门文章
- p系统ndows10的功能更新1903,Win10 1903到底有什么不同?Win10 1903更新内容汇总
- rtl8188linux内核配置,Embeded linux之RTL8188EU/RTL8188ETV使用
- 对计算机专业的兴趣怎么说,计算机专业特长及爱好怎么写
- 南开大学计算机学院博士毕业要求,南京大学博士研究生申请学位科研成果基本要求...
- Android异常之SIGABRT
- [Mysql] LAST_DAY函数 | DATE_ADD函数 | DATE_SUB函数
- android 呼入电话游戏闪退,光遇闪退解决方法 游戏总是闪退怎么回事
- 弗雷歇距离的原理及python代码实现(动态规划)
- 小程序中身份证号码认证简单的判断方法
- yii mysql 查询 类型转换_yii2.0数据库查询修改等方法