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


相关推荐
张声录121 分钟前
使用client-go在命令空间test里面对pod进行操作
开发语言·后端·golang
庄毕楠42 分钟前
金铲铲S13双城之战自动拿牌助手
python·pyautogui·金铲铲·金铲铲游戏助手·金铲铲助手
菜鸟小贤贤43 分钟前
pyhton+yaml+pytest+allure框架封装-全局变量接口关联
开发语言·python·macos·自动化·pytest
新智元44 分钟前
AI卷翻科研!DeepMind 36页报告:全球实验室被「AI科学家」指数级接管
人工智能·后端
南东山人1 小时前
python问题解决-外部模块明明安装了,却总是无法找到
开发语言·python
Adolf_19931 小时前
Django 自定义路由转换器
后端·python·django
B站计算机毕业设计超人1 小时前
计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js
大数据·爬虫·python·深度学习·机器学习·课程设计·推荐算法
XMYX-01 小时前
深入解析 Django 中数据删除的最佳实践:以动态管理镜像版本为例
数据库·django·sqlite
ThetaarSofVenice1 小时前
【Java从入门到放弃 之 Java程序基础】
java·开发语言·python
XMYX-01 小时前
使用 Django 构建支持 Kubernetes API 测试连接的 POST 接口
python·kubernetes·django