Django实战(3)—— Django 是怎么处理请求的?

前文

Django 实战 (1)—— 创建第一个Django项目
Django 实战 (2)—— 视图与 URL 配置

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 模块。通常,这是 ROOT_URLCONF 设置的值,但是如果传入 HttpRequest 对象具有 urlconf 属性(由中间件设置),则将使其值替代 ROOT_URLCONF 设置
  • 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.special_case_2003(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,以网页显示出来

发布了184 篇原创文章 · 获赞 864 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/Woo_home/article/details/103707369