1. 程式人生 > >Django 路由層(urlconf)

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"))