
前文
Django 是怎么处理请求的?
当我们访问 http://127.0.0.1:8000/hello/ 得到我们编写的 Hello Django 是怎么实现的呢?
这都要基于 settings.py 文件,当我们运行项目的时候,脚本会在与 manage.py 同一个目录下查找名为 settings.py 的文件。这个文件包含了所有有关 Django 项目的配置信息,而且均为大写 ,我们打开 settings.py 文件看下
通过这句代码我们可以知道当我们访问 http://127.0.0.1:8000/hello/ 时,Django 会根据 ROOT_URLCONF 的设置来装载 URLconf。然后按顺序逐个查找 URLconf 里的 patterns。也就是我们上一章的例子中看到的,一个视图功能函数必须返回一个 HttpResponse。一旦返回,Django 会将完成剩余的转换Python的对象到一个合适的带有 HTTP 请求头和 body 的 Web Response
ROOT_URLCONF
当我们从请求 http://127.0.0.1:8000/hello/ 时,系统将使用以下算法来确定要执行的 Python 代码:
1、Django 确定要使用的根 URLconf 模块。通常,这是 ROOTURLCONF 设置的值,但是如果传入 HttpRequest 对象具有 urlconf 属性(由中间件设置),则将使其值替代 ROOTURLCONF 设置
2、Django 加载该 Python 模块并查找变量 urlpatterns。这应该是一个序列的 django.urls.path() 或者 django.urls.re.path() 实例
3、Django 按顺序运行每个 URL 模式,并在与请求的 URL 匹配的第一个停止
4、一旦其中一个 URL 模式匹配,Django 就会导入并调用给定的视图,该视图是 Python 函数(或是基于类的视图)。该视图将传递以下参数
实例 HttpRequest
如果匹配的 URL 模式不包含命名组,则来自正则表达式的匹配项将作为位置参数提供
关键字参数由提供的路径表达式匹配的任何命名部分组成,这些名称部分由或 的可选kwargs参数中指定的任何参数覆盖。django.urls.path()django.urls.re_path()
5、如果没有URL模式匹配,或者在此过程中的任何时候引发异常,Django都会调用一个适当的错误处理视图。请参阅下面的错误处理。
请求示例
请求/articles/2005/03/匹配列表中的第三个条目。Django将调用该函数 。views.month_archive(request, year=2005, month=3)
/articles/2003/会匹配列表中的第一个模式,而不是第二个,因为这些模式是按顺序测试的,而第一个是第一个通过的测试。随意利用命令来插入类似这样的特殊情况。在这里,Django将调用该函数 views.specialcase2003(request)
/articles/2003 不会与任何这些模式匹配,因为每种模式都要求URL以斜杠结尾。
/articles/2003/03/building-a-django-site/将匹配最终模式。Django将调用该函数 。views.article_detail(request, year=2003, month=3, slug="building-a-django-site")
转换路径器
下面的路径转换器在默认情况下是有效的:
str-匹配除'/'之外的非空字符串。如果表达式内不包含转换器,则替换匹配字符串。
int-匹配0或任何正整数。返回一个int。
slug-匹配任意由ASCII字母或数字以及连字符和下划线组成的短标签building-your-1st-django-site。
uuid-匹配一个格式化的UUID。为了防止多个URL映射到同一个页面,必须包含破折号和字符都为小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个UUID实例。
path-匹配任何非空字符串,包括路径分隔符 '/'。这样,您就可以匹配完整的URL路径,而不是像一样匹配URL路径的一部分str。
总结
1、Django 通过 settings.py 文件中 ROOT_URLCONF 配置来决定根 URLconf 2、Django 在 URLconf 中的所有 URL 模式中,查找匹配条目 3、如果找到匹配,那么将调用相应的视图函数 4、视图函数返回一个 HttpResponse 5、Django 转换 HttpResponse 为一个合适的 HTTP response,以网页显示出来




