Django基礎之二(URL路由)

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視圖(函數或者類)之間的映射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:實例的命名空間

實例:web

- 主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)
]

對應的視圖函數django

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是一個正則表達式,也是關鍵字參數的值

實例:json

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/app

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反查
實例:curl

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>
相關文章
相關標籤/搜索