# 示例 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login_func), url(r'^register/$', views.register_func), ]
url( )
方法的第一個參數實際上是正則表達式, 一旦第一個參數匹配到了內容直接結束匹配, 並調用對應的視圖函數"/"
, 由於每一個 url 自帶"r"
"/"
, 在第一次正則匹配機制沒有匹配到想要的內容時, 會在匹配字符後加一個"/"
, 而後Django內部重定向在匹配一次"/"
"/"
一共匹配了兩次# setting.py 文件 APPEND_SLASH = False # 默認 True 自動添加斜槓
建議自動添加html
url( ) 方法中第一個參數正則表達式分組 : 給正則表達式先後加一個小括號前端
會將括號內正則表達式匹配到的內容當作位置參數傳遞給後邊的視圖函數python
url(r'^login/$', views.login_func) # 無名分組 url(r'^login/(\d+)/$', views.login_func) # 視圖函數 def login_func(request,*args): print(args) return Httpresponse(args)
url(r'^login/$', views.login_func) # 有名分組 url(r'^login/(?P<id>\d+)/$', views.login_func) # 視圖函數 def login_func(request,**kwargs): print(kwargs) return Httpresponse(args)
url(r'^login/(\d+)/(?P<id>\d+)/$', views.login_func) # 官方說不能混着用, 混着用只能取到有名分組捕獲的值 # 只要不混着用,有名分組和無名分組支持多個相同類型的傳參
url(r'^login/(\d+)/(\d+)/$', views.login_func) url(r'^login/(?P<id>\d+)/(?P<id>\d+)/$', views.login_func)
# 路由層 url(r'^login/$', views.login_func,name='login_name')
# 前端中使用(模板層) <a href="{% url 'login_name' %}">登入</a> # 後端中使用(視圖層) from django.shortcuts import reverse url = reverse('login_name')
ps : redirect( ) 括號內也能夠直接寫別名正則表達式
url(r'^login/(\d+)/', views.login_func,name='login_name')
from shortcuts import reverse url = reverse('login_name',args=(1,)) # 隨便給個數字
<a href="{% url 'login_name' 1 %}">登入</a> # 隨便給個數字
路由層中分組匹配獲得的數字並非咱們這樣寫死的, 通常狀況下放的是數據的主鍵值, 咱們能夠經過獲取到數據的主鍵.進而定位到數據對象, 從而能夠對數據進行編輯和刪除數據庫
# 路由層 url(r'^login/(\d+)/', views.login_func,name='login_name') # 視圖層 def edit(request,edit_id): reverse('login_name',args=(edit_id,)) # 模板層 {% for user_obj in user_list %} <a href="{% url 'login_name' user_obj.id %}">kkk</a>
url(r'^login/(?P<id>\d+)/', views.login_func,name='login_name')
from shortcuts import reverse url = reverse('login_name',kwargs=(id:111)) # 隨便給個數字 url= = reverse('login_name',args=(111,)) # 也能夠這樣寫
<a href="{% url 'login_name' id=111 %}">登入</a> # 隨便給個數字 <a href="{% url 'login_name' 11 %}">登入</a> # 也能夠這樣寫
由上面的視圖層與模板層的第二種書寫方式能夠看出 : 無名有名都可使用一種反向解析形式 : 就是無名反向解析django
django是專一於開發應用的,當一個django項目特別龐大的時候, 全部的路由與視圖函數映射關係所有寫在一個 urls.py 裏面很明顯太冗餘而且不便於管理後端
其實django中的每個應用均可以有本身的 urls.py、static文件夾、templates文件夾, 基於上述特色, 使用django作分組開發很是的簡便app
每一個人只須要寫本身的應用便可, 最後由組長統一彙總到一個空的django項目中而後使用路由分發將多個應用關聯到一塊兒函數
🔰注意 : 總理由正則後面不能添加 "$"
, 否則一配到 app01 就結束了工具
from django.contrib import admin from django.urls import path,re_path,include # 方式一 : 複雜寫法 from app01 import urls as app01_ulrs from app02 import urls as app02_ulrs urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^app01/', include(app01_ulrs)), re_path(r'^app02/', include(app02_ulrs)), re_path(r'^app03/', include(app03_ulrs)) ] # 方式二 : 高級寫法 urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^app01/', include('app01.ulrs')), re_path(r'^app02/', include('app02.ulrs')), re_path(r'^app03/', include('app03.ulrs')) ]
from django.contrib import admin from django.urls import path,re_path from [app名] import views urlpatterns = [ re_path(r'^home/',views.home_func), re_path(r'^index/',views.index_func), re_path(r'^edit/',views.edit_func), ]
當多個應用設置了相同的別名, 在反向解析的時候前面路由會被後面的路由覆蓋, 那麼就沒法觸發前面路由對應的視圖函數, 正常狀況下, 反向解析是沒法自動識別前綴的, 爲了不這種錯誤, 引入了名稱空間
# app01 app_name='app01' # 應用命名空間 urlpatterns = [ re_path(r'^home/',views.home_func,name='home_name') ]
urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^app01/', include('app01.ulrs',namespace='app01')), re_path(r'^app02/', include('app02.ulrs',namespace='app02')), re_path(r'^app03/', include('app03.ulrs',namespace='app03')) ]
# app01 app_name='app01' urlpatterns = [ re_path(r'^home/',views.home_func,name='home_name') ] # app02 app_name='app02' urlpatterns = [ re_path(r'^home/',views.home_func,name='home_name') ] # app03 app_name='app03' urlpatterns = [ re_path(r'^home/',views.home_func,name='home_name') ]
# app01 from django.shortcuts import reverse def home_func(request): res = reverse('app01:home_name') return HttpResponse(res) # /app01/home/ # app02 from django.shortcuts import reverse def home_func(request): res = reverse('app02:home_name') return HttpResponse(res) # /app02/home/ # app03 from django.shortcuts import reverse def home_func(request): res = reverse('app03:home_name') return HttpResponse(res) # /app03/home/
<a href="{% url 'app01:name_name' %}">app01</a> <a href="{% url 'app02:home_name' %}">app02</a> <a href="{% url 'app03:home_name' %}">app03</a>
# app01 urlpatterns = [ re_path(r'^home/',views.home_func,name='app01_home_name'), ] # app02 urlpatterns = [ re_path(r'^home/',views.home_func,name='app02_home_name'), ] # app03 urlpatterns = [ re_path(r'^home/',views.home_func,name='app03_home_name'), ]
.html
, 但咱們是能夠對文章內容進行修改的ps : 再如何優化也比不過加錢居士
urlpatterns = [ re_path(r'home.html/',views.home_func), ] # 訪問 : 127.0.0.1:8888/home.html/
Django 1.x
版本與 2.x
、3.x
版本的區別
1.x
中使用的是 url( ) 方法, 第一個參數是正則表達式2.x
與3.x
中使用的是 path( ) 方法, 第一個參數不支持正則表達式, 些什麼就匹配什麼若是想要在
2.x
和3.x
中的第一個參數中使用正則表達式, 則須要導入 re_path 方法from django.urls import path,re_pathre_path 等價於
1.x
中的 url 方法
str : 匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式 int : 匹配正整數,包含0。 slug : 匹配字母、數字以及橫槓、下劃線組成的字符串。 uuid : 匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path : 匹配任何非空字符串,包含了路徑分隔符(/)(不能用?號)
class MonthConverter: regex='\d{2}' # 屬性名必須爲regex def to_python(self, value): return int(value) def to_url(self, value): return value # 匹配的regex是兩個數字,返回的結果也必須是兩個數字 from django.urls import path,register_converter from app01.path_converts import MonthConverter # 註冊轉換器 register_converter(MonthConverter,'mon') from app01 import views urlpatterns = [ path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='date_time'), ]
pip install -r requirements.txt