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> 

 后端解析

在urls中

urlpatterns = [
    url(r'^$',views.home),#首页地址
    url(r'^admin/', admin.site.urls),
  
    url(r'^test/$',views.test),
   
    url(r'^v1/v2/v3/home$',views.home,name='home'),
]

在views中加入reverse

from django.shortcuts import render,HttpResponse,reverse


def test(request,*args,**kwargs):#aa,xx

    print(args,kwargs)
    """反向解析"""
    res=reverse('home')
    print(res)
    
    return HttpResponse('test')
  

在templates中创建test.html

</head>
<body>
<a href="{% url 'home' %}">点我看美女</a>

</body>
</html>

前端解析

在settings中加入路径

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')]
        ,

在urls中

urlpatterns = [
    url(r'^$',views.home),#首页地址
    url(r'^admin/', admin.site.urls),
  
    url(r'^test/$',views.test),
   
    url(r'^v1/v2/v3/home$',views.home,name='home'),
]

在views中加入render

def test(request,*args,**kwargs):#aa,xx

    print(args,kwargs)
    """反向解析"""
    res=reverse('home')
    print(res)
    #print(year,month)#aa,xx
    #return HttpResponse('test')
    return render(request,'test.html')

在templates中创建test.html

</head>
<body>
<a href="{% url 'home' %}">点我看美女</a>#也可以v1/v2/v3/home  #home是路由别名

</body>
</html>

方法先给路由与视图函数对应关系起一个名字。(前端和后端可以根据这个名字,通过一些方法能够得到一个结果,该结果可以访问到对应的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'^...../' 中的东西 

无名分组反向解析
url(r'^v1/v2/v3/home/(\d+)/(\d+)/$', views.home, name='home')


# 后端解析
res=reverse('home', args=(123, 11)) # /v1/v2/v3/home/1
print(res)

# 前端解析
<a href="{% url 'home' 1 123 %}">点我看美女</a>

前端解析

在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+)

        

 在views中,后端解析

在test.html中,前端解析

                                                       

有名分组反向解析 

在urls.py中

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

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

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

有名分组反向解析


url(r'^v1/v2/v3/home/(?P<year>\d+)/(?P<mon>\d+)/$', views.home, name='home')


# 后端解析


res=reverse('home', args=(123, 11)) # /v1/v2/v3/home/1
res=reverse('home', kwargs={'year':123, 'mon':1}) # /v1/v2/v3/home/1
print(res)

# 前端解析
<a href="{% url 'home' year=1 mon=123 %}">点我看美女</a>

前端解析

在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}) # 标准的写法

 在views中

在urls中

在test.html

路由分发 

        当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

 在views.py中

app02

def login(request):
    return HttpResponse("app02:login")

app03

def login(request):
    return HttpResponse("app03:login")

 

总路由 

在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,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

自定义转化器
2. 创建表关系
    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 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值