day02-djangoURL路由配置

Django如何处理一个请求

介绍:

一个干净优雅的URL方案是高质量Web应用程序中的一个重要细节。
Django可以让你自己设计URL,无论你想要什么,没有框架限制。
要为应用程序设计URL,您可以非正式的创建一个名为URLconf(URL配置)的Python模块。
这个模块是纯Python模块,是一个简单的python模式(简单的正则表达式)到Python函数(您的视图)之间的映射。

1.创建项目

在项目目录创建项目结构并启动

PS E:\Pycharm project> django-admin startproject mydemo
PS E:\Pycharm project> cd .\mydemo\
PS E:\Pycharm project\mydemo> python .\manage.py startapp myapp
PS E:\Pycharm project\mydemo> python .\manage.py runserver

2.创建视图

在项目的子项目中找到view.py文件 写入想要添加的视图

例如添加一个HTTP响应 :

from django.shortcuts import render
from django.http import HttpResponse
def index(request):
    return HttpResponse("hello world")

3.创建路由

在总路由中去直接创建

urlpatterns = [
    path('admin/', admin.site.urls),
    path('aa/',views.index)
]

URL的命名组

Django是如何处理一个请求的?

当用户从Django的站点请求页面时,Django遵循一下步骤来执行Python代码:

1.首先Django要使用跟URLconf模块,通过ROOT_URLCONF来设置,具体在setting.py配置文件中。但是如果传入HTTPRequest对象具有urlconf属性(由中间件设置),其值将用于替换ROOT_URLCONF设置。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yEokpupk-1646213781255)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227103520576.png)]

2.Django加载该python模块并查找该变量urlpatterns。他是django.urls.path()和django.urls.re_path()实例的序列(sequence)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n0GYuwCc-1646213781259)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227104234601.png)]

3.Django按顺序运行每一个URL模式,并在匹配所请求的URL的第一个URL中停止。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hp2HSs2M-1646213781262)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227105651793.png)]

4.一旦正则表达式匹配,Django将导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。该视图会获得如下参数:
一个HttpRequest实例。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7rMVza8-1646213781263)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227105732534.png)]

如果匹配的正则表达式没有返回任何命名组,那么来自正则表达式的匹配将作为位置参数提供。
关键字参数由正则表达式匹配的任何命名组组成,由可选kwargs参数中指定的任何参数覆盖。django.urls.path()、django.urls.re_path().
5.如果没有正则表达式匹配,或在此过程中的任何一点出现异常,django将调用适当的错误处理试图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xIEXMLiy-1646213781265)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227110102873.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XwsBV3pX-1646213781266)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227110115186.png)]

示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvt2HcNT-1646213781268)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227112722418.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qx54eJoH-1646213781270)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227112822938.png)]

说明:

​ 1.要从url捕获一个值,需要使用尖括号括起来

​ 2.捕获的值可以选择包括转换器类型,例如用于< int : name > 捕获整数参数。如果不包括转换器 / ,则匹配除字符以外的任何字符串。

​ 3.无需添加斜杠,因为每个URL都有该斜杠,例如add,不是/add。

路由转换器

​ 默认情况下,以下路径转换器可用:

  • str-匹配任何非空字符串,但路径分隔符除外’/’。如果表达式中不包含转换器,则为默认设置。
  • int-匹配零或任何正整数。返回一个int。
  • slug-匹配由ASCII字母或数字以及连字符和下划线字符组成的任何条形字符串。例如, building-your-1st-django-site。
  • uuid-匹配格式化的UUID。为防止多个URL映射到同一页面,必须包含破折号并且字母必须小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。
  • path-匹配任何非空字符串,包括路径分隔符 ‘/’。这样,您就可以匹配完整的URL路径,而不是像一样匹配URL路径的一部分str。

通过浏览器访问服务

注意:url路由由上而下,进行匹配,如果在上面就匹配成功,则不会乡下匹配
通过浏览器访问服务
    127.0.0.1:8000/abc ==>  root url(根路由) ==> 加载子路由(myweb/urls.py)

    ==> 正则匹配访问的路径(path) =-=> 视图函数(views.index)

    ==> views.py index() 响应内容

使用正则表达式:

  • 如果路径和转换器语法不足以定义URL模式,则还可以使用正则表达式。为此,请使用re_path()代替path()

  • 在Python正则表达式中,命名正则表达式组的语法为(?P<name>pattern),其中name是组的名称,并且 pattern是匹配的某种模式。

  • 正则表达式写URL:

    不命名的方式:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5pgcG1jw-1646213781271)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227115728193.png)]

    对应的视图函数:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rP82a7s0-1646213781272)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227115745138.png)]

    命名的方式:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6LEOdTKN-1646213781273)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227120056524.png)]

    对应的视图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7jM1oVzc-1646213781275)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227120424834.png)]

错误处理

当Django找不到与请求的URL匹配的正则表达式时,或者异常引发时,Django将调用错误处理视图。

用于这些情况的视图由四个变量指定。它们的默认值对于大多数项目都是足够的,但通过覆盖其默认值可以进一步定制。

有关详细信息,请参阅自定义错误视图的文档。

这样的值可以在你的根URLconf中设置。在任何其他URLconf中设置这些变量将不起作用。

值必须是可调用的,或者代表视图的完整的Python导入路径的字符串,应该被调用来处理手头的错误条件。

变量是:

  • handler400- 见django.conf.urls.handler400。
  • handler403- 见django.conf.urls.handler403。
  • handler404- 见django.conf.urls.handler404。
  • handler500- 见django.conf.urls.handler500。
关于404错误
  • 404的错误页面,在模板目录中创建一个404.html的页面
  • 在配置文件中 settings.py 配置 DEBUG = False
  • 在配置文件中 settings.py 配置 TEMPLATES = [{‘DIRS’: [os.path.join(BASE_DIR,‘templates’)] }]
  • 同时需要在项目的根目录下创建文件夹templates,并且在此目录下创建一个404.html文件
  • 在出现404的情况时,自动寻找404页面。
  • 也可以在视图函数中 手动报出404错误,带提醒信息

在视图函数中也可以指定返回一个404

注意 Http404需要在django.http的模块中引入
 # 响应404
 raise Http404('纳尼a')

在模板中 404.html

<!DOCTYPE html>
<html>
<head>
    <title>404</title>
</head>
<body>
    <center>
        <h2>404 not found</h2>
        <h3>{ {   exception   } }</h3>
    </center>
</body>
</html>

包括其他的URLconf

在任何时候,您urlpatterns都可以“包含”其他URLconf模块。

这实质上是将一组网址“植根于”其他网址之下

例如,下面是Django网站本身的URLconf的摘录。它包含许多其他URLconf:

from django.urls import include, path

urlpatterns = [
    # ... snip ...
    path('community/', include('aggregator.urls')),
    path('contact/', include('contact.urls')),
    # ... snip ...
]
  • 每当Django遇到时include(),它都会截断直到该时间点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf中以进行进一步处理每当Django遇到include()django.urls.include())时,它会截断与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf以供进一步处理。

URL的反向解析

如果在视图、模板中使用硬编码的链接,在urlconf发生改变时,维护是一件非常麻烦的事情

  • 解决:在做链接时,通过指向urlconf的名称,动态生成链接地址
  • 视图:使用django.urls.reverse()函数
  • 模板:使用url模板标签

URL重定向

1.利用reverse通过路由名称反向生成url请求地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9mi1VYbD-1646213781276)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227123246996.png)]

2.在视图中加入name :

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ih02z4Az-1646213781278)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227123415948.png)]

浏览器访问localhost:8000 访问默认地址 index 找到视图index

然后利用reverse反向生成url请求地址(传入参数)

之后用redirect重定向到find3并传入参数访问视图find3

最后find3接收参数 并响应[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7p8gMmZ-1646213781279)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227123653982.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值