Django基礎之二(URL路由)

wanghui發表於2018-11-07

URL路由

簡介

  • 對於高質量的web應用來說,使用簡潔,優雅的URL路由是一個值得尊重的細節,Django可以隨心所欲的設計URL,不受框架的約束
  • 為了給一個應用設計URL,你需要一個Python模組,通常被稱為URLconf,這個模組是純粹的URL模式(簡單的正規表示式)到python函式(檢視函式)的簡單對映

Django如何處理一個請求

  • django載入ROOT_URLCONF指定的模組,並尋找可用的urlpatterns,它是django.conf.urls.url()例項的一個python列表
  • django依次匹配每個URL,在與請求URL匹配的第一個url停下來
  • 一旦其中的一個正規表示式匹配上,Django將匯入並呼叫所給的檢視,這個檢視是一個簡單的python函式或者類
  • 如果沒有匹配到正規表示式,或者如果過程中跑出異常,django將呼叫一個適當的錯誤處理檢視:handler404,handler500,handler403,handler400

URLconf

URLconf是一個python模組,是一個URL模式(簡單的正規表示式)到python檢視(函式或者類)之間的對映

urlpatterns

  • urlpatterns:是一個url()例項型別的python列表
  • urlpatterns:中的每個正規表示式在第一次訪問他們時被編譯

url函式

url(regex,view,kwargs=None,name=None)
  • regex:一個字串(原始字串)或簡單的正規表示式
  • view:是一個檢視函式(類)或者as_view()的結果
  • kwargs:傳遞額外的引數給檢視
  • name:url名稱

include 語法

include(module,namespace=None,app_name=None)
include(pattern_list)
include((pattern_list,app_namespace),namespace=None)
include((pattern_list,app_namespace,instance_namwespace))
  • module:URLconf模組
  • namespace:URL名稱空間
  • app_name:app的名稱空間
  • pattern_list:可迭代的djang.conf.urls.url()例項
  • app_namespace:應用名稱空間
  • instance_namespace:例項的名稱空間

例項:

- 主urls.py
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
    url(r`^dashboard/`,include(`dashboard.urls`)),
    url(r`^admin/`,admin.site.urls)
]
- dashboard.urls配置檔案
from django.conf.urls import url,include
from . import views
urlpatterns = [
    url(r`^user/`,include([
        url(r`^list/$`,view.userlist,name=`user_list`),
        url(r`^info/$`,view.userinfo,name=`user_linfo`),
        url(r`^modify/`,include([
             url(r`status/$`,view.modifystatus,name=`modify_status`)
        ]))
    ]))
]
- dashboard.views檢視
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
    return HttpResponse(`Index Page`)

def userList(request):
    return HttpResponse("User List Page")

def userStatus(request):
    return HttpResponse("User Status Page")

def UserInfo(request):
    return HttpResponse("User Info Page")
- 請求方式
curl http://192.168.33.10:8080/dashboard/user/user_list/
curl http://192.168.33.10:8080/dashboard/user/modify/status/
curl http://192.168.33.10:8080/dashboard/user/modify/info/

url引數

若要從URL中捕獲一個值,只需要在他周圍放置一對圓括號

urlpatterns = [
    url(r`^article/2003/$`,views.special_case_2003,name=`special_case_2003`),
    url(r`^article/(2004)/$`,views.articleViewInfo,name=`special_case_2003`),
    url(r`^user/([0-9]{4})/$`,views.userInfo),
    url(r`^date/([0-9]{4})/([0-9]{2})/([0-9]{2})$`,views.dateInfo)
]

對應的檢視函式

def special_case_2003(request):
    return HttpResponse("2003")

def articleViewInfo(request,*args,**kwargs):
    print(args)       #位置引數獲取
    return HttpResponse(`request2004`)

def userInfo(request,*args,**kwargs):
    return HttpResponse(json.dumps(args))

def dateInfo(request,*args,**kwargs):
    data = {"year":args[0],"month":args[1],"day":args[2]}
    # return HttpResponse(json.dumps(data))
    return JsonResponse(data)

關鍵字引數

語法
(?P<name>pattern)
- name是傳給檢視引數的名字,
- pattern是一個正規表示式,也是關鍵字引數的值

例項:

url:
url(r`^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$`,views.articleInfoView)
-------------------------
view檢視函式
def articleInfoView(request,*args,**kwargs):
    return JsonResponse(kwargs)

請求方式:http://192.168.33.10:8080/dashboard/articles/2004/12/21/

url引數-額外引數

URLconfs 具有一個鉤子,讓你傳遞一個Python 字典作為額外的引數傳遞給檢視函式
django.conf.urls.url() 函式可以接收一個可選的第三個引數,它是一個字典,表示想要傳遞給檢視函式的額外關鍵字引數

url:
url(r`users/(?P<name>[a-z]+)`,views.users,{`extra_args`:`hehehe`})
view檢視函式:
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r`^blog/(?P<year>[0-9]{4})/$`, views.year_archive, {`foo`: `bar`}),
]
請求地址:/blog/2005/
呼叫函式:views.year_archive(request, year=`2005`,foo=`bar`)

url反向解析

django給每個URL取了一個名字,儲存每個URL與name的對映關係
根據Django 檢視的標識和將要傳遞給它的引數的值,獲取與之關聯的URL。這種方式叫做反向解析URL、反向URL匹配、反向URL查詢或者簡單的URL反查
例項:

url:
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r`^articles/([0-9]{4})/$`, views.year_archive, name=`news-year-archive`),
]
-----------------------
檢視函式
from django.core.urlresolvers import reverse
模板:
<a href="{% url `news-year-artive` yearvar%}">{{ yaervar }}Archieve</a>

相關文章