一般配置路由在urls.py文件中

urlpatterns = [path('正则表达式',views.视图函数,参数,别名),
]
参数说明:
1、一个正则表达式字符串
2、一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
3、可选的要传递给视图函数的默认参数(字典形式)
4、一个可选的name参数(别名)
例子:
urlpatterns = [path('index/<int:year>',views.hello),path('addstudent/<str:name>',views.add_student),
]
  • 注意
  1. 要捕获一段url中的值,需要使用尖括号,而不是之前的圆括号;
  2. 可以转换捕获到的值为指定类型,比如例子中的int:name。默认情况下,捕获到的结果保存为字符串类型,不包含/这个特殊字符;
  3. 规则的前面不需要添加/,因为默认情况下,每个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 &lt; n u m &gt; [ 0 − 9 ] + ) / ', views.study), url(r'^blog/page(?P&lt;num&gt;[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相关推荐

  1. Jfinal 2.1版本,JFinalConfig里自动配置路由的代码实现,直接晒代码

    2019独角兽企业重金招聘Python工程师标准>>> 背景: 1.我使用的jfinal2.1: 2.我喜欢用@ActionKey("/admin/index") ...

  2. Windows server 2012 搭建×××图文教程(二)配置路由和远程访问服务

    Windows server 2012 搭建×××图文教程(一)安装×××相关服务 Windows server 2012 搭建×××图文教程(二)配置路由和远程访问服务 Windows server ...

  3. php为什么需要配置路由器,laravel 配置路由 api和web定义的路由的区别详解

    1.路由经过中间件方面不同 打开kerenl.php就可以看到区别 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware ...

  4. IP地址的划分和配置路由

    IP地址:是一种在Internet上的给主机编址的方式,也称为网际协议地址.常见的IP地址,分为IPv4与IPv6两大类: 路由:路由器能把不是同一个网段的网络设备连接起来,使它们能够建立通信: IP ...

  5. Django之创建应用以及配置路由

    Django之创建应用以及配置路由 配置所有IP都可以访问你的项目 1.进入manage.py同级的my_web里面的settings.py的文件 2.在文件的第28行把ALLOWED_HOSTS = ...

  6. MVC 配置路由 反复走控制其中的action (int?)

    关于在MVC中配置路由,定义上具体参数时候,一定不要定义 public ActionResult QDSJSBQT(string jzbh, string sdate, string edate, i ...

  7. 微服务升级_SpringCloud Alibaba工作笔记0008---spring gateway配置路由的两种方式

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上节说的,这里可以看到通过yml配置路由,到右边对应起来,可以看到 predicates 这个是断 ...

  8. vue 安装element_vue实战开发007:vue引入Element-UI并配置路由

    今天准备使用Element-UI来写个项目测试下学习的功能,要在vue中引用Element-UI组件,我们需要先来安装下Element-UI,这里我们用VScode工具编写,这里使用 npm 的方式安 ...

  9. Vue3 + cli4 配置路由

    vue-cli4 路由配置 文章目录 vue-cli4 路由配置 前言-vue路由 一.基本路由配置 1.配置router/index.js 2.让路由改变 二.路由懒加载技术 三.路由嵌套 四.动态 ...

最新文章

  1. mysql主键始终从小到大_Mysql从入门到入神之(四)B+树索引
  2. python处理字符串数组慢_Python字符串处理 - str/bytes
  3. LAMP源代码编译整理
  4. CodeForces - 93B(贪心+vectorpairint,double +double 的精度操作
  5. MongoDB3.x中添加用户和权限控制
  6. GitHub 优秀的 Android 开源项目第二篇——转自多篇网络文章
  7. 用html制作简单考试系统,巧用EXCEL制作模拟考试系统
  8. 移动边缘计算将如何实现元宇宙?
  9. Java反射 二三事
  10. perl Data::Dumper和Storable的例子
  11. 营收、净利双收,贝壳找房稳了?
  12. 【算法笔记】三种背包问题——背包 DP
  13. 谈谈“五级工程师和职业发展”的思考
  14. 前端图片通过src读取服务器图片
  15. tableView for TTXS
  16. 2022非常全的接口测试面试题及参考答案-软件测试工程师没有碰到算我输~
  17. Magic Leap 价值 20 多亿美元的 AR 幻梦,现在醒了
  18. 新手小白初学Java(一)一些简单知识
  19. 大厂小厂都在用的RAID软件磁盘阵列技术,必须学起来!
  20. 服务引用定义配置(服务的注册与发现)

热门文章

  1. p系统ndows10的功能更新1903,Win10 1903到底有什么不同?Win10 1903更新内容汇总
  2. rtl8188linux内核配置,Embeded linux之RTL8188EU/RTL8188ETV使用
  3. 对计算机专业的兴趣怎么说,计算机专业特长及爱好怎么写
  4. 南开大学计算机学院博士毕业要求,南京大学博士研究生申请学位科研成果基本要求...
  5. Android异常之SIGABRT
  6. [Mysql] LAST_DAY函数 | DATE_ADD函数 | DATE_SUB函数
  7. android 呼入电话游戏闪退,光遇闪退解决方法 游戏总是闪退怎么回事
  8. 弗雷歇距离的原理及python代码实现(动态规划)
  9. 小程序中身份证号码认证简单的判断方法
  10. yii mysql 查询 类型转换_yii2.0数据库查询修改等方法