Django路由层解析

路由层(urls.py)

Django的路由层是用于将URL映射到视图函数的机制。它用于确定请求URL(HTTP请求)应该被哪个视图函数处理。

Django的路由层包括两个部分:

  1. URL模式:匹配请求URL,决定应该使用哪个视图函数来处理请求。
  2. URL配置:将URL模式与应用程序中的视图函数关联起来,以便Django知道如何处理请求。

URL模式通常使用正则表达式来匹配请求URL。例如,下面是一个简单的URL模式:

复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('articles/<int:year>/', views.year_archive),
]

总体来说,Django的路由层提供了一种灵活而强大的方式来处理请求URL,并将它们连接到相应的视图函数。

路由匹配

一,路由匹配按照正则匹配,一旦正则能够匹配到内容会立刻执行对应的视图函数。不会再继续匹配了

在setting.py中

复制代码
urlpatterns = [
url(r'^admin/', admin.site.urls),    
url(r'test',views.test),
url(r'testadd',views.testadd)      #第一个参数是一个正则表达式是访问后端静态资源的接口前缀

]

用户在浏览器中输入url时不加最后的斜杠,django会让浏览器默认自动加上斜杠
可以在配置文件settings.py中指定是否开启该功能
APPEND_SLASH = True 表示开启 django会让浏览器默认自动加上斜杠

APPEND_SLASH = False 表示不开启

无名分组

二,路由匹配url中的正则表达式分组:分组就是给一段正则表达式加括号

无名分组

匹配的时候会将括号内正则表达式匹配到的内容当做位置参数传递给对应的视图函数

在urls.py文件中

复制代码
url(r'^test/([0-9]{4})/',views.test)

在view.py 视图函数中

复制代码
def index(request,args):

    return HttpResponse('')

有名分组

有名分组

将括号内正则表达式起一个别名,匹配的时候,会将括号内的有别名的正则表达式匹配到的内容当做关键字参数传递给对应的视图函数

在urls.py 路由中

复制代码
url(r'^test/(?P<year>\d+)/',views.test)      # 起别名的方法:?P<别名>

在view.py 视图函数中

复制代码
def index(request,year):
            ...  

这里的视图函数中的第二个参数就是分组的名字
注意:无名有名能否混合不能使用。但是同一种命名方式 可以使用多个

url(r'^test/(\d+)/(?P<year>\d+)/', views.test), #这是错的,有名无名不能混合使用。

url(r'^test/(\d+)/(\d+)/',views.test), #同一种命名方式 可以使用多个

url(r'^test/(?P<xxx>\d+)/(?P<year>\d+)/',views.test) # 同一种命名方式 可以使用多反向

反向解析

反向解析:通过一些方法能够得到一个结果,该结果可以访问到对应的url
反向解析的作用

复制代码
<p>
    要反向解析 才能拿到后端views中返回的html文件中的信息
    <a class="btn btn-primary btn-lg" href="{% url 'detail' %}" role="button">点我</a>
</p> 

方法先给路由与视图函数对应关系起一个名字。(前端和后端可以根据这个名字,通过一些方法能够得到一个结果,该结果可以访 问到对应的url)

在urls.py路由中

复制代码
url(r'^testadd/',views.testadd,name='add')

前端解析 表示:无论testadd改成什么,在前端页面html,都能拿到 **r'^...../'**中的东西

后端解析 表示:无论testadd改成什么,在后端视图view.py文件中,都能拿到**r'^...../'**中的东西

前端解析

在html文件中

复制代码
 {% url 'add' %}

 比如:<a href=''{% url 'add' %}''>11</a>

后端解析

在views.py文件中

复制代码
 from django.shortcuts import reverse

 url=reverse('add')   # _url是变量,reverse('add') 表示的是r'^...../'中的东西

无名分组反向解析

在urls.py路由中

复制代码
url(r'^testadd/(\d+)/',views.testadd,name='add') 

前端解析 表示:无论testadd改成什么,在前端页面html,都能拿到 **r'^...../'**中的东西

后端解析 表示:无论testadd改成什么,在后端视图view.py文件中,都能拿到 **r'^...../'**中的东西

前端解析

在html中

复制代码
{% url 'add'  1 %}

# 注意:这里的数字,一般都是用户的Id 

既是:user_obj.id  既是:{% url  '反向解析起的名字'  user_obj.id %}      

比如:<a href=''{%url  'add'  11%}''>11111</a>

后端解析

在views.py中

复制代码
from django.shortcuts import reverse
                 _
url=reverse('add',args=(1,))
 
# _url是变量,reverse('add') 表示的是 r'^...../' 中的东西,args=(1,) 接收的是数字,通常是数据的主键值,传给了(\d+)

有名分组反向解析

在urls.py中

复制代码
url(r'^testadd/(?P<year>\d+)/',views.testadd,name='add')

前端解析 表示:无论testadd改成什么,在前端页面html,都能拿到 r'^...../' 中的东西

后端解析 表示:无论testadd改成什么,在后端视图view.py文件中,都能拿到 r'^...../' 中的东西

前端解析

在html中

复制代码
 {% url 'add'  1 %}                                               

 {% url  '反向解析的名字'  user_obj.id %} 

 注意:(推荐用)这里的数字,一般都是用户的Id 既是:user_obj.id      

 比如:

<a href=''{% url  'add'  11 %}''>11</a>

                或者:

{% url 'add' year= 1 %}   # 标准的写法

后端解析

在views.py中

复制代码
from django.shortcuts import reverse

url=reverse('add',args=(1,)) 

 # _url是变量,reverse('add') 表示的是r'^...../'中的东西。args=(12,) 接收的是数字(通常是数据的主键值),传给了(\d+)


 _url=reverse('add',args=(edit_id,))# 注意:(推荐用)这里的数字,一般都是用户的Id 

                 或者:    

 _url= reverse('add',kwargs={'year':12}) # 标准的写法

路由分发

当django项目比较庞大的时候 路由与视图函数对应关系较多,总路由代码太多冗长。考虑到总路由代码不好维护,所以django支持每个app(应用)都可以有自己的urls.py

总路urls不再 做路由与视图函数的对应关系 而仅仅 只做一个分发任务的操作:

根据请求的不同识别 出当前请求需要访问的功能属于哪个app, 然后自动下发到对应app 里面的urls.py 中 ,然后由app里面的urls.py做路由与视图函数的匹配

注意:

不仅如此每个app 除了可以有自己的urls.py之外 还可以有自己的static文件夹templates模板文件

应用场景:

基于上面的特点,基于django分小组开发,会变得额外的简单。每个人只需要开发自己的app即可之后只需要创建一个空的django项目,再将多个人的app全部拷贝项目下,去配置文件注册,由总路由分发一次即可。
使用方法:需要导入一个分发的模块 :from django.conf.urls import include

总路由

复制代码
在urls.py文件中

方法一、
from django.conf.urls import url,include

from app01 import urls as app01_urls
from app02 import urls as app02_urls

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
]

方法二、简写

from django.conf.urls import url,include

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
]

子路由

复制代码
from django.conf.urls import url
from app01 import views

urlpatterns = [

url(r'^index/',views.index)

]


from django.conf.urls import url
from app02 import views

urlpatterns = [

url(r'^index/',views.index)

]

虚拟环境

虚拟环境就类似于一个纯净的python解释器环境就类似于你重新下载一个python解释器

我们想做到针对不同的项目 只安装项目所需要的功能模块,项目用不到的一概不装,来避免加载资源时的消耗
如何创建虚拟环境

Django版本区别

  1. 路由文件

django1.x中使用的是url:支持正则

django2.x中使用的是path(不支持正则:精准匹配)和re_path(url):支持正则

path:但是它只支持五种转换器

Django默认支持以下5个转化器:

● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式

● int,匹配正整数,包含0。

● slug,匹配字母、数字以及横杠、下划线组成的字符串。

● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。

● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

自定义转化器

  1. 创建表关系

django2中必须指定参数:on_delete:

djanxo1中不用指定:级联更新级联删除

伪静态的概念(了解)

伪静态: 其实就是把动态页面改成像静态页面的样子

动态页面

它不是在html页面中写死的,它是根据后端的数据变化而变化

我们的页面上的数据是从数据库查询出来都是可以是动态页面

静态页面

html

css
案例

https://www.cnblogs.com/bigsai/p/17827160.html # 这个就是伪装之后的页面

伪装成静态页面的目的

为了更好的被各大搜索引擎抓大,静态页面是最容易被抓到的,有个别的网站就会做伪装,seo

seo:优化关键词被容易搜索到

sem: 广告(RMB)

怎么样去伪装

url(r'^v1/v2/test.html/$', views.test)

名称空间(了解)

复制代码
# 第二种方式
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),

# 解析
res=reverse('app01:login', args=(11,22)) # /v1/v2/v3/home/1
res=reverse('app02:login', args=(11,22)) # /v1/v2/v3/home/1

END


相关推荐
上进小菜猪4 小时前
把 KES 集群交给 Kubernetes 的九十天:一个 DBA 的试用实录
后端
两点王爷5 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
麻雀飞吧5 小时前
先判断工具用来学习、开发还是执行
人工智能·python
考虑考虑5 小时前
Springboot环境变量占位符语法
spring boot·后端·spring
人邮异步社区5 小时前
学习Python的最佳学习路径是什么?
python·程序员
步行cgn7 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
troy1288 小时前
Python 基础语法(九):Django/Flask/FastAPI 三大 Web 框架详细对比解析
python·jupyter·django·flask·github·fastapi
jzshmyt8 小时前
我用 Python 从零“生成“了一个宇宙,然后让它观察自己(v14)
人工智能·pytorch·python·numpy·matplotlib·空间计算·scipy
高洁019 小时前
大模型的幻觉怎么治
人工智能·深度学习·django·transformer·tornado
RISCV_Explorer9 小时前
RISC-V启动与运行时规范机制解析——BRS约定、HSM多核启动与设备树要求
后端·risc-v