Django框架-5

news2024/10/7 5:24:18

路由系统

通过URL(Uniform Resource Locator,统一资源定位符)可以访问互联网上的资源——用户通过
浏览器向指定URL发起请求,Web服务器接收请求并返回用户请求的资源,因此可以将URL视为用户与服务器之间交互的桥梁。

在Django当中,路由系统的本质就是URL与要调用URL的视图函数的一个映射表,它的主要作用就
是让views里面的执行函数与请求的url建立映射关系,当请求来了的时候根据这个url映射来调用对应的
执行函数,从而返回给客户端相应的信息

Django处理请求的流程

当用户向你的Django站点请求一个页面时,系统会采用一个算法来确定要执行哪一段Python代码:

  1. 首先,Django会使用根路由解析模块(root URLconf)来解析路由。

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

  3. Django按顺序遍历每个URL pattern,并在第一个匹配的请求URL被匹配时停下。

  4. 一旦某个URL pattern成功匹配,Django会导入并调用给定的视图,该视图是一个简单的Python
    函数(或基于类的视图)。

这个视图会被传以以下参数:
一个 HttpRequest 的实例。
如果所匹配的正则表达式返回的是若干个无名组,那么该正则表达式所匹配的内容将被作为
位置参数提供给该视图。
关键字参数是由路径表达式匹配的任何指定部件组成的,在可选的 kwargs 参数中指定的任
何参数覆盖到 django.urls.path() 或 django.urls.re_path() 。

5.如果请求的URL没有匹配到任何一个表达式,或者在匹配过程的任何时刻抛出了一个异常,那么
Django 将调用适当的错误处理视图进行处理

URL配置

一个项目允许有多个urls.py,但Django需要一个urls.py作为入口,这个特殊的urls.py就是根
URLconf(根路由配置),它由settings.py文件中的ROOT_URLCONF指定

这条代码实在setting.py文件中

ROOT_URLCONF = 'mysite.urls'

以上示例通过ROOT_URLCONF指定了mysite目录下的urls.py作为根URLconf

为保证项目结构清晰,开发人员通常在Django项目的每个应用下创建urls.py文件,在其中为每个应用
配置子URL。路由系统接收到HTTP请求后,先根据请求的URL地址匹配根URLconf,找到匹配的子应用,再进一步匹配子URLconf,直到匹配完成
在这里插入图片描述

路由测试

1.创建新的项目
2.现将urls.py文件
3.views.py文件编写一个子应用

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
    return HttpResponse('路由测试')

4.在子应用中的urls.py文件中创建子路由

from django.contrib import admin
from django.urls import path
from  urlAPPS.views import index

urlpatterns = [
    path('index/', index),
]

5.在总项目的路由中添加上子路由

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('urlAPPS/',include('urlAPPS.urls')),
]

6.在views.py文件中添加新的子应用

def special_case_2022(request):
    return HttpResponse('路由测试1')

def year_archive(request, year):
    return HttpResponse(f"year_archive{year}")

def month_archive(request, year, month):
    return HttpResponse(f"month_archive 年:{year} 月:{month}")

def article_detail(request, year, month, slug):
    return HttpResponse(f"article_detail 年:{year} 月:{month} {slug}")

7.在子路由中添加路由地址

path('articles/2022/', views.special_case_2022),
    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),

路由转换器

Django2以上内置路由转换器可以显式地指定路由中参数的数据类型,Django中内置了5种路由转
换器,分别为str、int 、slug 、uuid 和path

str:匹配任何非空字符串,但不包含路由分隔符“/”。如果URL中没有指定参数类型,默认使用该
类型。

int:匹配0或任何正整数。并作为 int 返回。

slug:匹配由字母、数字、连字符和下划线组成的URL。例如, building-your-1st-django-site

uuid:匹配一个uuid格式的字符串。为了防止多个URL映射到同一页面中,该转换器必须包含连
字符,且所有字母均为小写。例如, 075194d3-6885-417e-a8a8-6c931e272f00 . 返回一个 UUID
实例

path:匹配包含路径分隔符 ‘/’ 在内的任意非空字符串。 相对于 str ,这允许你匹配一个完整的
URL路径,而不仅仅是URL路径的一部分。

from django.contrib import admin
from django.urls import path
from urlAPPS.views import index
from urlAPPS import views

urlpatterns = [
    path('index/', index),
    path('articles/2022/', views.special_case_2022),
    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),
    # str字符串类型测试
    path('articles/<str:year>/', views.str_cs),
]


正则表达式

如果路径和转换器语法不足以定义你的URL pattern,你还可以使用正则表达式。 为了使用正则表
达式,请使用 re_path() ,而不要使用 path() 。

在Python正则表达式中,命名正则表达式组的语法是 (?Ppattern) , 这里 name 是表达式组的名字
而 pattern 是要匹配的模式。

 re_path(route, view, kwargs=None, name=None)

注意:
无论正则表达式匹配什么类型,每个捕获的参数都会以字符串形式传给视图。

正则表达式格式为:(?Ppattern),其中name表示分组名,pattern表示匹配的正则表达式。URL
匹配成功后,捕获到的参数会作为关键字参数传递给对应的视图,因此视图中的形式参数必须和正
则表达式中的分组名相同

若正则表达式只通过小括号“()”来捕获URL的参数,但未为其命名,则它是一个未命名正则表达
式,此时捕获的参数并将其以位置参数形式传递给对应视图

from django.contrib import admin
from django.urls import path , re_path
from urlAPPS.views import index
from urlAPPS import views

urlpatterns = [
    # 路由转换器
    path('index/', index),
    # path('articles/2022/', views.special_case_2022),
    # 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),
    # str字符串类型测试
    # path('articles/<str:year>/', views.str_cs),
    # 正则表达式
    re_path('articles/2021/$', views.re_special_case_2022),
    re_path('articles/(?P<year>[0-9]{4})/$', views.re_year_archive),
    re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.re_month_archive),
    re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[-_\w]+) / $', views.re_article_detail),
]

向视图传递额外参数

path()函数、re_path()函数允许向视图传递额外参数,这些参数存放在一个字典类型的数据中,该
数据的键代表参数名,值代表参数值。re_path()函数与path()函数传递额外参数方式相同,以path()函数为例介绍如何向视图传递额外参数。

使用path()函数的第三个参数可以向视图传递额外参数

路由解析顺序

Django在接收到一个请求时,从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应路
由规则,如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下进行
查询

反斜线问题

Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时,
Django会把用户重定向到以斜线/结尾的路径上,而不会返回404不存在

views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
    return HttpResponse('路由测试')

def special_case_2022(request):
    return HttpResponse('路由测试1')

def year_archive(request, year):
    return HttpResponse(f"year_archive{year}")

def month_archive(request, year, month):
    return HttpResponse(f"month_archive 年:{year} 月:{month}")

def article_detail(request, year, month, slug):
    return HttpResponse(f"article_detail 年:{year} 月:{month} {slug}")

def str_cs(request,city):
    print('city的类型:',type(city))
    return HttpResponse(f'str_cs{city}')

'''正则表达式'''
def re_special_case_2022(request):
    return HttpResponse('路由测试1')

def re_year_archive(request, year):
    return HttpResponse(f"year_archive{year}")

def re_month_archive(request, year, month):
    return HttpResponse(f"month_archive 年:{year} 月:{month}")

def re_article_detail(request, year, month, slug):
    return HttpResponse(f"article_detail 年:{year} 月:{month} {slug}")

'''传递额外参数'''
def blog_year_archive(request, year, major):
    return HttpResponse(f"blog_year_archive 年 {year} 额外参数:{major}")

def re_blog_year_archive(request, year, major):
    return HttpResponse(f"blog_year_archive 年 {year} 额外参数:{major}")
urls.py
from django.contrib import admin
from django.urls import path , re_path
from urlAPPS.views import index
from urlAPPS import views

urlpatterns = [
    # 路由转换器
    path('index/', index),
    # path('articles/2022/', views.special_case_2022),
    # 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),
    # str字符串类型测试
    # path('articles/<str:year>/', views.str_cs),
    # 正则表达式
    # re_path('articles/2021/$', views.re_special_case_2022),
    # re_path('articles/(?P<year>[0-9]{4})/$', views.re_year_archive),
    # re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.re_month_archive),
    # re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[-_\w]+) / $', views.re_article_detail),
    # 传递额外参数
    path('blog/<int:year>/', views.blog_year_archive, {'major': 'python'}),
    re_path('blog/(?P<year>[0-9]{4})/$', views.re_blog_year_archive, {'major':'python'}),
]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB中scatter函数用法

目录 语法 说明 ​示例 scatter函数的功能是绘制散点图。 语法 scatter(x,y) scatter(x,y,sz) scatter(x,y,sz,c) scatter(___,"filled") scatter(___,mkr) scatter(tbl,xvar,yvar) scatter(tbl,xvar,yvar,"filled") scatter(ax,___) scatter(___,Nam…

Mybatis面试题--MyBatis延迟加载

Mybatis是否支持延迟加载&#xff1f; 答&#xff1a;Mybatis支持延迟记载&#xff0c;但默认没有开启 什么叫做延迟加载&#xff1f; 查询用户的时候&#xff0c;把用户所属的订单数据也查询出来&#xff0c;这个是立即加载 查询用户的时候&#xff0c;暂时不查询订单数据&…

【C/C++】拷贝构造函数的调用 使用方法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Linux--询问符:-i

功能&#xff1a; 执行某个操作时&#xff0c;Linux会询问用户是否确定执行操作。只有输入yes或者y才能成功执行操作。输入no或者n或者enter则操作失败 示例&#xff1a; ①确认操作 ②反悔操作

美工面试题目(合集)

美工面试题目篇1 1、目前常用的WEB标准静态页面语言是。(4分) 2、改变元素的外边距用&#xff0c;改变元素的内填充用。(6分) 3、在Table中&#xff0c;TR是&#xff0c;TD是。(6分) 4、如果给一行两列的表格(table)定义高度样式&#xff0c;在标签中定义最合理&#xff0c…

js中改变this指向的三种方式

js中改变this指向的三种方式 1、call方法2、apply方法3、bind方法 1、call方法 使用 call 方法调用函数&#xff0c;同时指定函数中 this 的值&#xff0c;使用方法如下代码所示&#xff1a; <script>const obj {uname: 刘德华}function fn(x, y) {console.log(this) …

Java Stream 流进行根据元素某一属性过滤计算其他属性实例

设计一个测试类Tuser package org.example;import com.alibaba.fastjson.annotation.JSONField;import java.io.Serializable;public class Tuser implements Serializable {//用户名private String name;//平台名称private String sys;//登录次数private int times;//一个合并…

如何使用计算机视觉检测钓鱼攻击?

无论你是喜欢、还是厌恶、亦或害怕&#xff0c;以ChatGPT为代表的新兴人工智能&#xff08;AI&#xff09;平台&#xff0c;目前正在更加深入地迈向公共领域。它们不仅表现为各种聪明的聊天机器人&#xff0c;而且能够在幕后以多种创新方式被广泛使用。其中&#xff0c;最为典型…

audio2face 与ue5结合实时语音嘴型同步

audio2face部分 1.安装audio2face以及localserver 2.打开streamingplayer的demo场景 3.localhost/NVIDIA/Assets/Audio2face/blendshape_solve目录下找到male_bs_arkit.usd拖拽到场景 4.选中场景中的male_bs_arkit.usd将分页切换到A2F data convert分页 5.参数设置 6.设置…

mysql用户相关操作

一、如何查看系统存在多少用户&#xff1f; 相关命令&#xff1a; SELECT COUNT(*) FROM mysql.user; SELECT User FROM mysql.user; DESC mysql.user; 二、如何查看用户是否设置密码&#xff1f; 在 MySQL 中&#xff0c;用户密码是被加密的&#xff0c;不可以直接查看用户…

cmake构建一个项目,同时依赖一个静态库项目和一个动态库项目

目录切到build中&#xff0c;然后cmake ..&#xff0c;生成VS解决方案 chengChu 文件夹 SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) #windows构建动态库时 , 加上这个会生成dll文件的同时生成lib文件&#xff0c;否则只…

FirmAE源码粗读(五)

文章目录 简介参考阅读libnvramsem系列函数sem_getsem_locksem_unlock nvram_init系列函数nvram_initnvram_set_default 感言 简介 鸽王来咯 这一篇写的是FirmAE中源于firmadyne的libnvram&#xff08;经过了一定修改&#xff09;&#xff0c;不得不说这一部分是很有意义的工作…

国产32位MCU低成本烟机变频风机方案

家用油烟机主要由风机系统&#xff0c;控制系统&#xff0c;滤油装置&#xff0c;外壳和悬吊装置组成&#xff0c;其中风机系统是油烟机的心脏&#xff0c;通常由电机和叶轮组成&#xff0c;一台油烟机功率的大小&#xff0c;也是由风机系统决定的&#xff0c;控制系统是烟机最…

JVM-垃圾回收器

垃圾回收器 Serial 新生代垃圾回收器&#xff0c;单线程&#xff0c;会产生STW&#xff08;Stop The World&#xff09;&#xff0c;采用拷贝算法。 它在停止线程时&#xff0c;并不是直接将线程强行停止&#xff0c;而是等线程运行到一个安全点&#xff08;Safe Point&…

超级实用!详解Node.js中的lodash模块和async模块

文章目录 7. lodash 模块安装 Lodash数组处理对象处理函数式编程 8. async 模块安装 Async异步流程控制串行执行&#xff08;Series&#xff09;并行执行&#xff08;Parallel&#xff09;循环迭代&#xff08;Each&#xff09; 控制流程和错误处理瀑布流控制&#xff08;Water…

强化学习:策略梯度法

策略梯度法的思路 之前我们是用表格的形式来表达策略&#xff0c;现在我们同样可以用函数来表达策略。之前学的所有的方法都是被称为 value-based&#xff0c;接来下学的叫 policy-based 。接下来我们来看一下 策略梯度法的思路。之前学的的策略全都是用表格来表示的&#xff0…

win 安装 C++运行环境 - MinGW

目录 一、下载二、安装四、检查是否安装成功五、参考文章 一、下载 官网地址&#xff1a;https://www.mingw-w64.org/downloads/ 1.1点击【MingW-W64-builds】 1.2点击【Github】 1.3下载 如果下载太慢&#xff0c;可以使用GitHub Proxy 代理加速 (ghproxy.com) 二、安装 …

c++为什么支持函数重载?

前言 在c语言中&#xff0c;函数名是不可以重复的&#xff0c;在同一作用域中函数名称都是唯一的。这也使得我们的函数调用充满了种种麻烦。 而c则支持通过函数重载解决了这个问题 函数重载&#xff1a;是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的…

如何在Microsoft Excel中移动列的位置

若要在 Excel 中移动列,请使用 shift 键或“插入剪切单元格”。你还可以神奇地更改所有列的顺序。 一、Shift 键 要在不覆盖现有数据的情况下快速移动 Excel 中的列,请按住键盘上的 shift 键。 移动单列: 1、首先,选择一列。 2、将鼠标悬停在所选内容的边界上。此时会出…

建立本地题库

建立试题库文件json 第一步&#xff1a; 按标准格式保存试题到本地,文件名为.json. import json import osimage_path os.path.join(C:\\, Users, 123, PycharmProjects, pythonProject1, test01, imges, jxn_0900.png)# 准备要保存的数据 data [{"id": 1,"…