Django 路由層(urlconf)
阿新 • • 發佈:2019-01-03
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 importviews #必須匯入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"))