风清扬

导航

Django之路(三)——URL调度器

本节内容

本文主要参考自《https://docs.djangoproject.com/en/2.1/topics/http/urls/》

  • 概念
  • Path 函数
  • Route
  • 错误处理
  • URL反向解析
  • render vs redirect

一、概念

URL调度器负责:请求的URL路径 与  业务逻辑处理(View) 建立关联关系。来自不同URL路径的请求分发不同的View进行处理。对应源代码:django.urls包

Django project目录中的urls.py文件中, 以urlpatterns[ path(   ),path()...  ]的数据类型记录了该站点的url 和 视图函数一一对应关系表

当request请求到达路由系统,Django通过request中携带的path 遍历这个关系表:

  • 匹配成功,则打包request对象以及path函数参数(可选)跳转对应的视图函数进行处理,break(所以1个 url 只能从路由关系表中自上而下匹配到1个视图函数)
  • 匹配不成功则跳转error-handling view 进行处理

project/settings.py的 ROOT_URLCONF 参数设置了根URL地址

例如:

 

二、Path 函数

path(routeviewkwargs=Nonename=None)

  • route url路径
  • view
    1. path提交的目的地——业务处理逻辑对象(view),FBV或者CBV
    2. 其他url配置,即 django.urls.include()。大型项目中app路由与project独立
  • 传递给view的参数(可选)
  • url路径别名(可选) 

re_path(routeviewkwargs=Nonename=None)

  • route 可以使用r'' 格式
  • 同path

三、Route

Path converters《略》

对url中的指定内容进行捕获并转换类型

from django.urls import path

from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
	#调用 views.month_archive(request, year=2005, month=3).
    path('articles/<int:year>/<int:month>/', views.month_archive),
	#调用 views.article_detail(request, year=2003, month=3, slug="building-a-django-site")
	#
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

# str - Matches any non-empty string, excluding the path separator, '/'. This is the default if a converter isn't included in the expression.
# int - Matches zero or any positive integer. Returns an int.
# slug - Matches any slug string consisting of ASCII letters or numbers, plus the hyphen and underscore characters. For example, building-your-1st-django-site.
# uuid - Matches a formatted UUID. To prevent multiple URLs from mapping to the same page, dashes must be included and letters must be lowercase. For example, 075194d3-6885-417e-a8a8-6c931e272f00. Returns a UUID instance.
# path - Matches any non-empty string, including the path separator, '/'. This allows you to match against a complete URL path rather than just a segment of a URL path as with str. 

正则捕获《推荐》

  • 匿名
  • 有名
  • 嵌套
from django.urls import path,re_path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
    #re_path。可以使用原始正则表达式,不用加转义字符
    #匿名捕获
    re_path(r'detail1/(\d+)/(\d+)', views.detail1),
    #命名捕获(?P<>),函数参数名,必须与捕获变量一致
    re_path(r'detail2/(?P<p1>\d+)/(?P<p2>\d+)', views.detail2),

    #显示参数变量优先级高于捕获传参的优先级。
    re_path(r'detail3/(?P<p1>\d+)',views.detail3,{'p1':666}),

    #嵌套捕获
    # re_path(r'^blog/(page-(\d+)/)?$', blog_articles),  # bad
    # re_path(r'^comments/(?:page-(?P<page_number>\d+)/)?$', comments),  # good

]

四、错误处理

概念

比如别人在访问我们的网页时,发送了一个不存在的url,那么我们会返回一个404错误的页面。当然除了404错误还有其他的错误。

常见错误代码

  1. 404:服务器没有指定的url。
  2. 403:没有权限访问相关的数据。
  3. 405:请求的method错误。
  4. 400:bad request,请求的参数错误。
  5. 500:服务器内部错误,一般是代码出bug了。
  6. 502:一般部署的时候见得比较多,一般是nginx启动了,然后uwsgi有问题。

Django错误处理机制(例:404)

当在django的view中引发一个Http404异常之后,它在你的根URLconf中查找处理404错误的handler404(并且只能在根URLconf中查找),404 view的本身和其他view一样,没什么特别的。

通常不需要写404view,如果没有设置handler404,内置的django.views.defaults.page_not_found()会被默认调用。在这种情况下,你可以在project/templates目录下创建一个404.html文件。对所有出现的404错误,默认的404 view将会使用这个文件作为模板。如果settings里面的DEBUG设置为False,并且不创建404.html文件的话,会出现一个Http500错误,所以创建一个404.html模板文件是很有必要的。如果DEBUG设置为True,那么404view将不会被用到,因此404.html模板也不会被渲染,取而代之的将是浏览器上出现的traceback错误。在django的URLconf中无法匹配任何一个正则表达式时也会调用404view

五、URL反向解析

re_path,path 函数中的第四个参数,对route(URL--视图函数对应关系)命名,也叫url 别名

常用于:

  • 模板文件中{% url "映射名" %} 反向生成访问该站点URL,而不是写死
  • 视图函数中reverse()反向生产当前访问URL

六、render vs redirect

  • render 返回页面内容(渲染变量到模板中),并且没有发送第二次请求
  • redirect 发送了第二次请求,是个跳转函数,而且会返回302的状态码

 

posted on 2019-02-16 15:47  卜戈的博客  阅读(410)  评论(0编辑  收藏  举报