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


相关推荐
Chef_Chen9 分钟前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
customer0821 分钟前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
知识的宝藏21 分钟前
Django中间件应该怎么使用
中间件·django
千澜空29 分钟前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
2402_8575893631 分钟前
SpringBoot框架:作业管理技术新解
java·spring boot·后端
斯凯利.瑞恩36 分钟前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
一只爱打拳的程序猿1 小时前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
yannan201903131 小时前
【算法】(Python)动态规划
python·算法·动态规划
竹笋常青1 小时前
《流星落凡尘》
django·numpy
蒙娜丽宁1 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉