URL
URL語法格式爲([]代表其中的內容可省略)
-
protocol://hostname[:port]/path[?query][#fragment]
protocol:協議
hostname:域名
port:端口
path:路由
query:查詢字符串
fragment:錨點
Django處理url請求
- Django從配置文件中根據ROOT_URLCONF找到主路由文件;默認情況下,該文件在項目同名目錄下的urls;例如mysite1/mysite1/urls.py
- Django加載主路由文件中的urlpatterns變量[包含很多路由的數組]
- 依次匹配urlpatterns中的path,匹配到第一個合適的中斷後續匹配
- 匹配成功 - 調用對應的視圖函數處理請求,返回響應
- 匹配失敗 - 返回404響應
視圖函數
- 視圖函數是用於接收一個瀏覽器請求(HttpRequest對象)並通過HttpResponse對象返回響應的函數。此函數可以接收瀏覽器請求並根據業務邏輯返回相應內容給瀏覽器
- 語法
def xxx_view(request[,其他參數...]):
return HttpRespnose對象
- 樣例
# file:<項目同名文件夾下>/views.py
from django.http import HttpResponse
def page_2003_view(request):
html = "<h1>這是第一個頁面</h1>"
return HttpResponse(html)
路由配置
- settings.py中的ROOT_URLCONF指定了主路由配置列表urlpatterns的文件位置
# file:<項目同名文件夾下>/urls.py
urlpatterns=[
path('page/2003/',views.page_2003_view),
...#此處配置主路由
]
- path()函數
- 導入 - from django.urls import path
- 語法 - path(route,views,name=None)
- 參數
- route:字符串類型,匹配的請求路徑
- views:指定路徑所對應的視圖處理函數的名稱
- name:爲地址起別名,在模板中地址反向解析時使用
path轉換器
- 語法:<轉換器類型:自定義名>
- 作用:若轉換器類型匹配到對應類型數據,則將數據按照關鍵字傳參的方式傳遞給視圖函數
- 例子:path('page/<int:page>',views.xxx)
轉換器類型 | 作用 | 樣例 |
---|---|---|
str | 匹配除了'/'之外的非空字符串 | "v1/users/<str:username>"匹配/v1/users/guoxiaonao |
int | 匹配0或任何正整數。返回一個int | "page/<int:page>"匹配/page/100 |
slug | 匹配任意由ASCII字母或數字以及連字符和下劃線組成的短標籤 | "detail/<slug:sl>"匹配/detail/this-is |
path | 匹配非空字符串,包括路徑分隔符'/' | “v1/users/<path:ph>”匹配/v1/goods/a/b/c |
- 小練習:計算器
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('<int:num1>/<str:opt>/<int:num2>',views.cal_view)
]
def cal_view(request,num1,opt,num2):
if opt not in ['add','sub','mul']:
return HttpResponse("Your opt is wrong")
result = 0
if opt == 'add':
result = num1+num2
elif opt == 'sub':
result = num1 - num2
else :
result = num1 * num2
return HttpResponse("result is %s"%result)
re_path
- 在url的匹配過程中可以使用正則表達式進行精確匹配
- 語法:
- re_path(reg,view,name=xxx)
- 正則表達式爲命名分組模式(?P<name>pattern);匹配提取參數後用關鍵字傳參方式傳遞給視圖函數
- 樣例
# 可匹配http://127.0.0.1:8000/20/mul/30
# 不可匹配 http://127.0.0.1:8000/200/mul/400
urlpatterns=[
re_path(r'^(?P<x>\d{1,2})/(?P<op>\w+)/(?P<y>\d{1,2})$',views.cal_view)
]