Django 路由层(urlconf)

Posted angle6-liu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 路由层(urlconf)相关的知识,希望对你有一定的参考价值。

Django 的路由层(URLconf)

URL配置(conf)就像是Django所支撑的网站的目录;

本质就是:URL与调用该URL执行的视图函数的映射表;

通俗的讲:就是用户使用哪个url,URL(conf)就需要告诉服务器执行哪个程序代码.

 

一  路由配置的简单使用

path :不能使用正则 ,path(路径,views.方法)

re_path :可以使用正则 ,re_path(r正则表达式路径,views.方法)
from django.urls import path,re_path 

from app01 import views #必须导入views

urlpatterns = [
    re_path(r^articles/2003/$, views.special_case_2003),
    
]

 

二  路由配置使用注意事项

  •   若要从URL中获取一个值,只需要在对应的URL处放置一对圆括号

 

re_path(r^articles/([0-9]{4})/$, views.year_archive) 
#传送给views时会携带小括号的数值,故需要相应的形参接受

 

  • 不需要添加一个前导的反斜杠,因为每个URL 都有。
re_path(r/articles/$, views.year_archive)  #错误写法
  • 每个正则表达式前面的‘r‘ 是可选的但是建议加上.

 

三 路由配置与views传值过程解析

‘‘‘
url配置:
re_path(r‘^articles/([0-9]{4})/([0-9]{2})/$‘, views.month_archive),

对应url请求时候的传值过程

/articles/2005/03/ 请求将匹配列表中的第三个模式。
Django 将调用函数views.month_archive(request, ‘2005‘, ‘03‘)。
‘‘‘

 

四 有名分组

  1 基本格式

path(index/(? P<year> d{4}),views.year)

对应views中

def year(request,year):
    
     return HttpResponse(year)

  2 传值方式---关键字传参

/articles/2003/03/03/ 
请求将调用函数views.article_detail(request, year=2003, month=03, day=03)。

 

五 分发(include)

  1、分发意义

  ULR解耦合。把每一个应用的视图函数放入自己的文件中,全局的urls只需要分配该路径属于某一个应用的视图函数。这样解决如果有一个程序出了问题不会影响到其他的应用的执行。

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

之后app01中的urls,再对匹配成功的url进行分发

 

六 反向解析

  1 使用场景

在模板中:使用url 模板标签。
     {%  url ‘别名‘ %}
在Python 代码中:使用from django.urls import reverse()函数
  rev_url=reverse(‘别名‘)
  

  2 html文件中的反向解析

项目.urls.py 设置别名 name=‘Index‘

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

from app01 import views
urlpatterns = [
    path(admin/, admin.site.urls),
    path(index/,views.index,name=Index),
    path(login/, views.login)

]

app01.views.py中 导入 inverse

from django.shortcuts import render,HttpResponse,redirect

from django.urls import reverse #导入方向解析函数

# Create your views here.

def index(request):

    return render(request,index.html)


def login(request):
    print(request.method)
    if request.method==GET:
        return render(request,login.html)
    else:
        re_path=reverse(Index) #反向解析
        return redirect(request,re_path)

 

  3 html 文件中的反向解析

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="{%  url ‘Log‘ %}" method="post">
    {% csrf_token %}

    用户名 <input type="text" name="user"> 密码 <input type="text" name="pwd">
    <input type="submit">
</form>
</body>
</html>

  4 反向解析解析过程分析

  根据别名,在urlpatterns中找到对应的路径并返回

 

五 名称空间(解决反向解析出现找不到正确url的问题)

  命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

  由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回.

  我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。

project的urls.py

urlpatterns = [
    re_path(r^admin/, admin.site.urls),
    re_path(r^app01/, include("app01.urls",namespace="app01")),
    re_path(r^app02/, include("app02.urls",namespace="app02")),
]

app01.urls

urlpatterns = [
    re_path(r^index/, index,name="index"),
]

app02.urls

urlpatterns = [
    re_path(r^index/, index,name="index"),
]

app01.views 

from django.core.urlresolvers import reverse

def index(request):

    return  HttpResponse(reverse("app01:index"))

app02.views

from django.core.urlresolvers import reverse

def index(request):

    return  HttpResponse(reverse("app02:index"))

 

 






以上是关于Django 路由层(urlconf)的主要内容,如果未能解决你的问题,请参考以下文章

5 Django-1的路由层(URLconf)

Django2.0路由层-URLconf

5 Django-2的路由层(URLconf)

5 Django-2的路由层(URLconf)

day68 Django路由层(URLconf)

03 Django的路由层-1(URLconf)