使用Python进行网站页面开发——Django的URL路由配置

news/2024/5/10 18:10:04/文章来源:https://blog.csdn.net/weixin_63994459/article/details/125917169

目录

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

二、路径转换器

三、错误处理

四、包括其他的URLconf

五、URL的反向解析


介绍:

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

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

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

  1. 首先Django确定要使用的根URLconf模块,通过ROOT_URLCONF来设置,具体在settings.py配置文件中。但是如果传入 HttpRequest对象具有urlconf 属性(由中间件设置),则其值将用于替换ROOT\_URLCONF设置。

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

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

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

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

示例

以下是一个URLconf示例:

from django.urls import pathfrom . import viewsurlpatterns = [path('articles/2003/', views.special_case_2003),path('articles/<int:year>/', views.year_archive),path('articles/<int:year>/<int:month>/', views.month_archive),path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

说明:

  • 要从URL捕获一个值,请使用尖括号括起来
  • 捕获的值可以选择包括转换器类型。例如,用于 <int:name>捕获整数参数。如果不包括转换器/,则匹配除字符以外的任何字符串。
  • 无需添加斜杠,因为每个URL都有该斜杠。例如articles,不是/articles

 

示例请求:

  • /articles/2005/03/将匹配列表中的第三个条目。Django会调用该函数 。views.month_archive(request, '2005', '03')
  • /articles/2005/3/ 不符合任何网址格式,因为列表中的第三个条目需要两个数字的月份。
  • /articles/2003/将匹配列表中的第一个模式,而不是第二个模式,因为模式是按顺序测试的,第一个模式是第一个测试通过。随意利用这些命令插入特殊情况。在这里,Django会调用该函数 views.special_case_2003(request)
  • /articles/2003 将不匹配任何这些模式,因为每个模式要求URL以斜杠结尾。
  • /articles/2003/03/03/将匹配最终模式。Django会调用该函数。views.article_detail(request, '2003', '03', '03')

二、路径转换器

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

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

实例:

url.py:

 

views.py:

 

运行效果:

 

 

 

通过浏览器访问服务

注意: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是匹配的某种模式。(注意是大P)

  • 这是前面的示例URLconf,使用正则表达式重写:

from django.urls import path, re_pathfrom . import viewsurlpatterns = [path('articles/2003/', views.special_case_2003),re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]
  • 这可以完成与上一个示例大致相同的操作,除了:

    • 将要匹配的确切URL受到更多限制。例如,年份10000将不再匹配,因为年份整数被限制为正好是四位数长。
    • 无论正则表达式进行哪种匹配,每个捕获的参数都将作为字符串发送到视图。
  • 当从使用切换为使用path(),re_path()反之亦然时,特别重要的是要注意视图参数的类型可能会更改,因此您可能需要调整视图。

使用未命名的正则表达式组(不推荐)

  • 除了命名组语法(例如)之外(?P<year>[0-9]{4}),您还可以使用较短的未命名组(例如)([0-9]{4})

  • 不建议特别使用此用法,因为这样可以更轻松地在匹配的预期含义和视图的参数之间意外引入错误。

  • 无论哪种情况,建议在给定的正则表达式中仅使用一种样式。当两种样式混合使用时,任何未命名的组都会被忽略,只有命名的组才会传递到视图函数。

为视图参数指定默认值

  • 一个方便的技巧是为视图的参数指定默认参数。这是一个示例URLconf和视图:
# URLconf
from django.urls import pathfrom . import viewsurlpatterns = [path('blog/', views.page),path('blog/page<int:num>/', views.page),
]# View (in blog/views.py)
def page(request, num=1):# Output the appropriate page of blog entries, according to num....
  • 在上面的示例中,两个URL模式都指向同一视图– views.page–但是第一个模式未捕获URL中的任何内容。
  • 如果第一个模式匹配,该page()函数将使用它的默认参数num,1。
  • 如果第二个模式匹配, page()将使用num捕获的任何值。

 

三、错误处理

当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'是自己取得一个名称)
  • 同时需要在项目的根目录下创建文件夹templates,并且在此目录下创建一个404.html文件
  • 在出现404的情况时,自动寻找404页面。
  • 也可以在视图函数中 手动报出404错误,带提醒信息

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

注意 Http404需要在django.http的模块中引入# 响应404raise 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>

这些设置一般都是在应用上线的时候设置,平时还是要 让DEBUG = True,我们可以根据错误信息进行提示。

四、包括其他的URLconf

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

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

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

from django.urls import include, pathurlpatterns = [# ... 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模板标签

示例

  • 在URLconf中
from django.urls import pathfrom . import viewsurlpatterns = [#...path('articles/<int:year>/', views.year_archive, name='news-year-archive'),#...
]
  • 根据这种设计,对应于年度归档文件的URL NNNN 是/articles//。

  • 您可以使用以下模板代码获取这些:

<a href="{ %   url 'news-year-archive' 2020   % }">2020 Archive</a>
{# Or with the year in a template context variable: #}
<ul>{% for yearvar in year_list %}<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>{% endfor %}
</ul>
  • 在Python代码中:
from django.http import HttpResponseRedirect
from django.urls import reversedef redirect_to_year(request):# ...year = 2019# ...return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
  • 或简写
from django.shortcuts import redirect
from django.urls import reversedef index(request):year = 2019return redirect(reverse('ews-year-archive',args=(year,)))

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_807898.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github搭建个人网站(学习前端,记录个人博客)

目录初步搭建优化页脚固定初步搭建 这是我做的&#xff1a; 访问网页可看&#xff1a; https://chenshunpeng.github.io/&#xff08;仓库地址&#xff1a;here&#xff09; 借鉴自&#xff08;会动的主页&#xff0c;感觉很nice&#xff09;&#xff1a;https://yk-liu.g…

在线翻译网站的对比

技术方面的文档&#xff0c;很多都是英文的&#xff0c;对于英文不好的人来说&#xff0c;看英文文档是件很痛苦的事情&#xff0c;此时就不得不借助于翻译工具了&#xff0c;比如在线翻译网站&#xff0c;那么找到一个合适的翻译网站是非常有帮助的。 在线翻译网站主要有 谷歌…

高并发大流量网站 10 个调优策略

2019独角兽企业重金招聘Python工程师标准>>> 普通的P4服务器一般最多能支持每天10万独立IP&#xff0c;如果访问量比这个还要大&#xff0c; 那么必须首先配置一台更高性能的专用服务器才能解决问题 &#xff0c;否则怎么优化都不可能彻底解决性能问题。1.硬件升级 …

以太坊Dapp项目-拍卖网站-智能合约编写测试

修订日期姓名邮箱2018-10-18brucefengbrucefengbrucefeng.com前言 写这篇文章的初衷其实很简单&#xff0c;在MyEtherWallet上申请以太坊ENS的时候&#xff0c;竞标的以太币两次被吞&#xff0c;而且是在规定时间点进行了价格公告&#xff0c;这篇文章的设计思路其实就是跟ENS的…

RXThink 官方网站正式上线

百度智能云域名服务&#xff0c;.com新用户首购仅需25元 RXThink 是一个开源的权限及内容管理框架&#xff0c;提供更方便、更安全的 WEB 应用开发体验&#xff0c;采用了全新的架构设计和命名空间机制&#xff0c;融合了模块化、驱动化和插件化的设计理念于一体&#xff0c;…

利用新浪云SAE搭建可访问的免费个人网站

注&#xff1a;老师课件中&#xff0c;提到我们应该把网站发布到 http://www.openshift.com , 这是Red-hat 开发的PAAS服务&#xff0c;即是包装好底层的硬件和基础软件&#xff08;如 apache、nginx 、mysql 、php&#xff09;等服务&#xff0c;使用者可以直接在上面发布应用…

新浪云SAE搭建可访问的免费个人网站

注&#xff1a;老师课件中&#xff0c;提到我们应该把网站发布到 http://www.openshift.com , 这是Red-hat 开发的PAAS服务&#xff0c;即是包装好底层的硬件和基础软件&#xff08;如 apache、nginx 、mysql 、php&#xff09;等服务&#xff0c;使用者可以直接在上面发布应用…

php电商网站源码_PHP新款美化ui大学校园表白墙网站源码

源码描述&#xff1a;花十分钟搭建一款学校的表白校园墙程序修复一些小问题&#xff0c;安装很简单&#xff0c;内附安装教程说明安装方法&#xff1a;1、上传源码到主机或服务器2丶导入数据库3、 修改数据库配置地址&#xff0c;\inc\config.php后台账号&#xff1a;admin后台…

如何把不同尺寸ico格式图标_网站ico 图标不会做?用这个小工具轻松搞定

给自己的网站加上一个小图标&#xff0c;显示既专业又美观。网站左上角显示的小图标一般是ico格式的图片&#xff0c;然后在HTML里使用代码去设置ico小图片为该网站的小标。<link rel"shortcut icon" href"/favicon.ico" type"image/x-icon"/…

九天自助建站系统_自助建站系统做网站简单吗?广州有哪些网站建设

自助建站系统是根据传统建站技术&#xff0c;进行升级把开发技术简化&#xff0c;把传统建站高技术门槛降为“零”&#xff0c;使第一次用自助建站系统的用户&#xff0c;也可以轻松简单完成建站。我们继续往下聊一下&#xff0c;详细拆分自助建站系统&#xff0c;到底建站简单…

jupyter不能用linux命令,jupyter网站的使用以及常见linux下的简单的命令

python下安装jupyter常识&#xff1a;linux下查看计算机的ip代码是&#xff1a;ifconfig&#xff1b;ping IP;用户名查看&#xff1a;uname;文件传输&#xff1a;sftp 用户名对方 IP;SSH链接计算机的命令&#xff1a;ssh yuan对方IP&#xff0c;接下来再输入对方计算机passwd1、…

网站设计常用技巧收集

C#论坛同步地址&#xff1a;http://www.cckan.net/thread-1087-1-1.html 先说一下写这篇文章的目的吧&#xff0c;这上面的东西很多不是我写的&#xff0c;也不是我总结的&#xff0c;这点我肯定&#xff0c;呵呵&#xff0c;我希望大家也能提提你自己的建议&#xff0c;希望不…

传统网站与Web标准——DIV+CSS布局实例

主要内容&#xff1a; “结构与表现分离”的设计思想纵向导航条与横向导航条的切换【步骤1】 一、效果 二、HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <…

酷站欣赏:分享13个五彩缤纷的国外网站作品

对于网页设计来说&#xff0c;使用正确的调色板可能是设计过程中最重要的部分&#xff0c;也是最具挑战性的之一。虽然现有的品牌通常对所用颜色的影响最大&#xff0c;但其他因素可以发挥作用。这篇文章&#xff0c;我们已经收集各种使用颜色的的网站作品&#xff0c;为您提供…

python获取get请求的耗时时间_python爬取网站数据四种姿势,你值得拥有

前言首先&#xff0c;分析来爬虫的思路&#xff1a;先在第一个网页(https://www.wikidata.org/w/index.php?titleSpecial:WhatLinksHere/Q5&limit500&from0)中得到500个名人所在的网址&#xff0c;接下来就爬取这500个网页中的名人的名字及描述&#xff0c;如无描述&a…

python selenium爬虫需要账号和密码登陆的网页_Python爬虫——selenium模拟京东网站登录(一)...

1.导入需要的库import timefrom selenium import webdriver2.浏览器获取驱动需要下载跟chrome浏览器相匹配的驱动driverchrome.exe&#xff0c;详情见&#xff1a;根据电脑浏览器的版本下载相应的驱动chromedriver.exe&#xff0c;环境变量的配置&#xff0c;详情见这里Window …

基于JSP开发的旅游网站管理系统

10092基于JSP开发的旅游网站管理系统 代码&#xff1a; 鏈-椄&#xff1a;https://panbaiducom/s/11qEwMtFAmmwMDLQO_Pbk2Q &#xff08;把换成 . 就可正常访问&#xff09; 趧-紶-碼&#xff1a;6886 f/u枝此段-吶傛打开baidu網盤手机App&#xff0c;caozuo更方便哦 技术 JA…

基于java的心理健康网站系统设计与实现

10001-心理健康测评网站 开发工具 eclipse tomact mysql jdk 功能详情

基于SSH开发的在线教学网站 java mysql

基于SSH开发的在线教学网站 技术 Spring Struts Hibernate 工具 eclipse tomact mysql jdk 功能详情 前台功能&#xff1a;后台功能&#xff1a;网站首页系统属性我的信息修改密码教学课件系统管理教学视频教学管理考试试题课程管理在线自测学生管理留言板讨论管理进入…

基于SpringBoot的招生咨询网站

10190_基于SpringBoot的招生咨询网站 技术 SpringBoot 工具 eclipse tomcat mysql jdk 功能详情 前台&#xff1a; 登录注册、录取信息查询、招生计划、专业查询、年历信息、问题解答、招生论坛 后台&#xff1a;专业管理、招生计划、系统管理、问题解答、信息管理、录取…