urlpatterns 在url文件中是一個url映射列表。在1.8以后的django版本中可直接為列表形式或者也可以用patterns函數生成。在1.7及以前的版本中則是由patterns函數生成。系統會自動遍歷url文件中的urlpatterns列表然后進行對應的處理函數查找。當url有重復的情況則以找到的第一個為准。
先說說Django怎么處理請求:
- 一旦生成url頁面請求,請求傳遞到urls.py;
- Django去urlpatterns中匹配鏈接(Django會在匹配到的第一個就停下來);
- 一旦匹配成功,就會去執行,path后面的方法,Django便會給出相應的view頁面(該頁面可以為一個Python的函數,或者基於view(Django內置的)的類),也就是用戶看到的頁面;
- 若匹配失敗,則出現錯誤的頁面。
編寫urlpatterns
1.views中的簡單函數
#urls.py from app import views #這里的app是你自己的應用的名字 from django.urls import path urlpatterns = [ path('index/', views.index, name='index'), ]
該方法對應view.py中的函數為:
#views.py def index(request): ... return render(request,'index.html')
2.從views中繼承的類
#urls.py from app.views import LoginView from django.urls import path urlpatterns = [ path('login/', LoginView.as_view(), name='login'), ]
該方法對應的view.py中為:
#views.py class LoginView(View): #請求為get時 def get(self,request): ... return render(request, 'login.html') #請求為post時 def post(self,request): ... return render(request,'login.html')
當你從其他地方比如你的應用中也新建了一個文件叫urls.py,這是可以用第三種方法:
3.導入其他的URL文件(適用於urls.py文件不止一個時)
#urls.py(系統默認的) from django.urls import include, path urlpatterns = [ path('login/', include('app.urls'))#假設自己新建的urls在app(應用中) ]
再說urlpatterns
若覺得上述方法依然不夠逼格,可以試試正則形式的urlpatterns,具體用法為
導入包時由
from django.urls import path
更改為
from django.urls import re_path
相應的urlpatterns構造也變為
urlpatterns = [ re_path(r'^articles/(?P<year>[0-9]{4})/$', view.year, name='article'), re_path(r'^blog/(page-(\d+)/)?$',blog_articles), ]
這樣子可以很方便的匹配到具體某一年的文章,而不用對“每一年”都寫一個path,這樣子可以極大的減輕工作量。
還有一種方法
#urls.py from app.views import LoginView from django.conf.urls import url #注意這里 urlpatterns = [ url(r'^login/$', LoginView.as_view(), name='login'), #還有這里 ]
總結:
path方法適用於頁面較少的網站,re_path可以利用正則表達的優勢適用於較多的頁面的網站
匹配失敗出現錯誤頁面
- handler400
- handler403
- handler404
- handler500
若有興趣可以上官網看一下
當你的項目上線時則需要對這些錯誤進行自己的定義,總不能人家去訪問你的頁面了,404還是django的錯誤頁面吧。。。
自己定義時則需進行全局定義
即不能包含在上述urlpatterns中
#urls.py handler404 = 'app.views.page_not_found'