配置路由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),
]
  • 注意
  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 ] + ) / &#x27;, views.study), url(r&#x27;^blog/page(?P&lt;num&gt;[0-9]+)/ ,views.study),url(rblog/page(?P<num>[09]+)/’, 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.py

from 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.py

from 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.py

from 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值