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
(route, view, kwargs=None, name=None)
- route url路径
- view
- path提交的目的地——业务处理逻辑对象(view),FBV或者CBV
- 其他url配置,即 django.urls.include()。大型项目中app路由与project独立
- 传递给view的参数(可选)
- url路径别名(可选)
re_path
(route, view, kwargs=None, name=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错误还有其他的错误。
常见错误代码
- 404:服务器没有指定的url。
- 403:没有权限访问相关的数据。
- 405:请求的method错误。
- 400:bad request,请求的参数错误。
- 500:服务器内部错误,一般是代码出bug了。
- 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的状态码