Django的urls相關html
1、url配置正則表達式
無名分組django
urls.py:app
url(r'^books/(\d{4})/', views.books),
views.py:函數
def books(request,year): # 必須給一個參數 print(year) return HttpResponse(year)
好比用戶輸入網址:127.0.0.1:8000/books/2000,則返回頁面打印的就是2000;url
輸入127.0.0.1:8000/books/2018,則返回頁面打印的就是2018;code
效果:htm
位置參數(按順序傳參)blog
urls:接口
url(r'^books/(\d{4})/', views.year_books), #匹配年份的 http://127.0.0.1:8000/books/2001/ url(r'^books/(\d{4})/(\d{1,2})/', views.year_month_books), #匹配年份和月份的 http://127.0.0.1:8000/books/2001/12/
視圖 views文件:
def year_month_books(request,year,month): #位置參數,第一個參數接收的就是無名分組路徑中匹配到的第一個分組的數據,第二個參數接收的就是無名分組路徑中匹配到的第二個分組的數據 print(year,month) # return render(request,'books.html') return HttpResponse(year+month)
假若有這樣一個需求:用戶輸入127.0.0.1:8000/books/2001,則只匹配年份2001;輸入127.0.0.1:8000/books/2001/12,則匹配年份和月份
urls.py:
urlpatterns = [ url(r'^books/(\d{4})/$', views.year_books), # 在末尾加$,嚴格匹配,不然不管用戶只輸入了年份,仍是輸年份和月份,都只匹配這個,顯示年份 url(r'^books/(\d{4})/(\d{1,2})/', views.year_month_books)
views.py:
def year_books(request,year): print(year) return HttpResponse(year) def year_month_books(request,year,month): print(year) print(month) return HttpResponse(year+month)
注意事項:
補充:
# 是否開啓URL訪問地址後面不爲/跳轉至帶有/的路徑的配置項 # 寫在settings文件裏 APPEND_SLASH=True # 默認是True,好比輸入127.0.0.1:8000/books/2001,2001後面沒有加/,會返回一個3xx的狀態碼,而後給2001後面拼一個/,而後再去請求; APPEND_SLASH=False # 設置了False,此時再輸入127.0.0.1:8000/books/2001就訪問不到了,必須在2001後面加/才能夠訪問
有名分組
urls:
url(r'^books/(?P<year>\d{4})/(?P<month>\d{1,2})/', views.year_month_books),
views:
def year_month_books(request,month,year): #形參名稱要和url中的分組名對應好,參數位置就沒有要求了 print(year,month) return HttpResponse(year+month)
默認值
# urls.py中 from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ] # views.py中,能夠爲num指定默認值 def page(request, num="1"): pass
好比:
urls:
urlpatterns = [ url(r'^books/$', views.books), url(r'^books/(?P<num>\d{4})/',views.books), ]
views:
def books(request,num='10'): print(num) return HttpResponse(num)
效果:
當輸入網址127.0.0.1:8000/books/,走默認值,頁面顯示默認值10:
當輸入網址127.0.0.1:8000/books/2002/,被下面的正則匹配到,顯示後面的數,好比2002:
2、url路由分發——include
views和models文件都放在了app的應用裏面,而urls.py這個文件放在了項目的文件裏,說明全部的app都在使用這個urls.py文件,當項目的應用有不少個,那urls文件裏面要寫不少的對應關係,全部的app的url都寫在這一個文件中,耦合度過高,多以Django提供了一個分發接口——include 也就是在每一個app應用文件裏都寫一個屬於本身的urls.py文件,而後在項目文件的urls.py文件用include分發藉口
例子:
由於pycharm新建時,只能創建一個應用app01,再創建一個應用app02方法:
應用 app01 下創建urls.py文件,寫本應用對應的路徑關係
from django.conf.urls import url
from app01 import views
urlpatterns = [ url(r'^index/', views.index), ]
應用 app01 下的視圖 views.py
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request): return HttpResponse('應用界面01')
應用 app02 下創建urls.py文件
from django.conf.urls import url
from app02 import views
urlpatterns = [ url(r'^home/',views.home ), ]
應用 app02 下的視圖 views.py
from django.shortcuts import render,HttpResponse
# Create your views here.
def home(request): return HttpResponse('應用界面02')
主項目中的urls,要用 include 分發接口
from django.conf.urls import url,include # 記得要導入include
from django.contrib import admin
urlpatterns = [ url(r'^app01/', include('app01.urls')), # 至關於:http://127.0.0.1:8000/app01/asdsfdfeas.... url(r'^app02/', include('app02.urls')), # 至關於:http://127.0.0.1:8000/app02/..... ] # 注意點:想用include分發路徑,千萬不要用到 $ ,不然沒法匹配.好比:url(r'^app01/$', include('app01.urls'))
此時在網址輸入 127.0.0.1:8000/app01/index/,先走主項目的urls,匹配到127.0.0.1:8000/app01/,把剩餘的路徑 index/ 經過include的功能傳給app01裏面的urls,匹配index/,獲得結果
同理,輸入 127.0.0.1:8000/app02/home/,也能拿到對應的結果
在此基礎上,有這樣一個需求:給整個項目作一個首頁,每一個應用也都作一個首頁
再創建一個應用app03,專門作整個項目的首頁
主項目的urls:
from django.conf.urls import url,include
from app03 import views
urlpatterns = [ url(r'^$', views.base), # 匹配空內容,就是輸入ip和端口後什麼也沒輸入 # 注意:別忘記寫^$ url(r'^app01/', include('app01.urls')), # http://127.0.0.1:8000/app01/asdsfdfeas.... url(r'^app02/', include('app02.urls')), # http://127.0.0.1:8000/app02/..... ]
app03 下的 views:
from django.shortcuts import render
def base(request): return render(request,'base.html')base.html 放在 模板 templates 文件夾中
製做app01的首頁:
app01 下的urls:
from django.conf.urls import url
from app01 import views
urlpatterns = [ url(r'^$',views.firstbase ), url(r'^index/', views.index), ]
app01 下的views:
from django.shortcuts import render,HttpResponse
def index(request): return HttpResponse('應用界面01') def firstbase(request): return render(request,'app01base.html')app01base.html 放在 模板 templates 文件夾中
製做app02的首頁:
app02 下的urls:
from django.conf.urls import url
from app02 import views
urlpatterns = [ url(r'^$',views.secondbase ), url(r'^home/',views.home ), ]
app02 下的views:
from django.shortcuts import render,HttpResponse
def home(request): return HttpResponse('應用界面02') def secondbase(request): return render(request,'app02base.html')app02base.html 放在 模板 templates 文件夾中
3、簡單
url配置
urls.py文件中寫在urlpatterns = []中
簡單的路由
from app01 import views
url(r'^index/',views.index),
無名分組
url(r'^index/(\d+)/(\d+)/',views.index), --- def index(request,n,m) 位置參數
有名分組
url(r'^index/(?P
url(r'^index/$',views.index),
url(r'^index/(?P
視圖函數參數默認值,
def index(request,num='1'):
print(num)
路由分發
from django.conf.urls import url,include url(r'app01/',include('app01.urls')),