一、客戶端發送請求(get/post)通過web服務器、Django中間件、 到達路由分配系統
二、路由分配系統根據提取 request中攜帶的的url路徑(path)與視圖函數映射關係列表中,匹配到1個視圖函數,foo(request)執行;html
三、視圖函數 使用原生SQL或者ORM去數據庫拿到數據,在服務端進行渲染(模板+數據渲染)前端
四、視圖函數return一個 response對象 返回客戶端python
Django路由分配系統簡介web
Django project目錄中的urls.py文件中, 以Python [ ( ) ]的數據類型記錄了能夠訪問到該站點的url 和 視圖函數一一對應關係表,當request請求到達路由系統,Django經過request中攜帶的path 遍歷這個關係表,匹配到對應的視圖函數,break;(因此1個 url 只能從路由關係表中自上而下匹配到1個視圖函數)正則表達式
def routers(): from day52.urls import URlpattern return URlpattern def application(environ,start_response): start_response('200 OK', [('Content-Type', 'text/html')]) path=environ.get('PATH_INFO') print(path) urloattern=routers() func=None for i in urloattern: if path==i[0]: func=i[1] break if func: return func(environ) else: return [b'404'] if __name__ == '__main__': t=make_server(' ',8800,application) t.serve_forever()
本文主要介紹 Django路由分配系統數據庫
1個URL對應1個視圖函數django
from django.conf.urls import url
from django.contrib import admin
from APP import view
urlpatterns = [
url(r'^modal/',view.modal), url(r'^域名',對應的處理函數) 注意不要忘了寫 ^ 表示正則匹配以。。開頭的URL
url(r'^modal_add/',view.modal_add),
url(r'^modal_del/',view.modal_del),
url(r'^modal_edit/',view.modal_edit),
]
在前端咱們不只能夠經過get請求攜帶參數的方式向server端傳數據; https://i.cnblogs.com/%EF%BC%9Fid=1&name=alex後端
Django也容許經過,path路徑的方式向server端傳值;服務器
注意事項:按位置,和按關鍵字路由系統只能用1種,不能混合使用;app
一、path正則無名分組匹配《---------》視圖函數按位置傳參
from django.conf.urls import url,include from django.contrib import admin from app1 import views urlpatterns = [ url(r'^index/(\w+)/(\w+)/',views.index2), #醬紫的話客戶端 輸入:http://127.0.0.1:8000/index/a/b/也能夠訪問到該站點 url(r'^',views.error)
]
urlpatterns = [
url(r'^/',index), #視圖函數 index(request)
url(r'^(\d{4})/\d{2}/$',timeer1), #視圖函數 timeer1(request,實參1) 正則增長了分組,視圖函數會增長一個參數;
url(r'^(\d{4})/(\d{2)/$',timeer2) #視圖函數 timeer2(request,實參1,實參2) 視圖函數須要2個形參接收;
# url(r'^(?P<year>\d{4})/(?P<month>\d{2})/$',timeer),
]
在路由系統定義了 幾個正則分組(),在視圖函數對應幾個實參接收;
def timeer2(request,a1,a2):
print(a1,a2) #打印參數a1,a2 就是 2個正則表達式匹配到的結果
return Httprespose('ok')
#注意若是按位置傳參的動態路由系統,必須在視圖函數添加對應的參數接收!
二、path正則有名分組匹配《---------》視圖函數按關鍵字傳參
按位置傳參形參或實參錯位會致使數據錯亂,因此Django路由分發系統還能夠以命名分組的形式匹配URL給視圖函數按關鍵字傳參;
from django.conf.urls import url,include from django.contrib import admin from app1 import views urlpatterns = [ url(r'^index/(P<n1>\w+)/(P<n2>\w+)/',views.index,name="zhanggen"),
url(r'^(?P<year>\d{4})/(?P<month>\d{2})/$',timeer),
url(r'^',views.error), ] #注意若是在路由系統正則內部定義了關鍵字n1,n2,視圖函數接收參數也必須是 n1,n2;
urlpatterns = [
# url(r'^/',index), #index(request)
# url(r'^(\d{4})/\d{2}/$',timeer), #timeer(request,2014) 正則增長了分組,視圖函數會增長一個參數;
# url(r'^(\d{4})/(\d{2)/$',timeer1) , #timeer(request,2014,12) 視圖函數須要兩個形參接收
url(r'^(?P<year>\d{4})/$(?P<month>\d{2})',timeer2) #timeer(request,year=2017,month=6) 正則設置了有名分組,視圖函數使用關鍵字傳參
]
在視圖函數定義2個關鍵字參數, 接收 2個正則表達式匹配到的後綴;
def index(request,n1,n2): print(n1,n2) #注意必須和 路由系統中的一致 return HttpResponse('OK')
三、URL path傳值應用
有了動態路由就 能夠不用在 url?nid=8這樣傳值了!
PS:
終止符:^edit$ 能夠精確限制匹配URL的後綴內容
僞靜態:url(r'^edit/(\w+).html$', views.edit) 裝做成靜態網站的url能夠 提升 SEO高權重 百度排名靠前
url(r'^student_del/(.*).html/',views.student_del),
<a href="/student_del/{{row.id}}.html/">刪除</a></td>
def student_del(request,args1): # user_id=request.GET.get('id') models.User_info.objects.filter(id=args1).delete() return redirect('/students/')
1個Django 項目裏面有多個APP目錄你們共有一個 url容易形成混淆,因而路由分發讓每一個APP的擁有了本身單獨的url;
from django.conf.urls import url,include from django.contrib import admin from app1 import views urlpatterns = [ url(r'^app1/',include('app1.urls')), url(r'^app2/',include('app1.urls')), #注意include的是字符串形式的 文件路徑; url(r'^',views.error), ]
醬紫就能夠在每一個 Django目錄下面寫本身的 URL了
一、什麼是路由別名?
給Django路由分發系統 URL--視圖函數對應關係命個名,
而後在模板中{% url "zhanggen" i i1%}反生成 訪問該站點URL,
或者在視圖函數中reverse()反向生產當前訪問URL;
二、做用
保證先後端數據一致性,後端修改了匹配URL,不用在前段更改;
from django.conf.urls import url,include from django.contrib import admin from app1 import views urlpatterns = [ url(r'^index/(?P<n1>\w+)/(?P<n2>\w+)/',views.index,name="alex"), 給這個URL起別名 alex url(r'^',views.error),
]
在視圖函數使用 reverse("別名", args=(1, 2)) 反生 位置參數動態路由的 別名
def index(request,n1,n2): print(reverse("zhanggen", args=(1, 2))) return render(request,'index.html',{'i':1,'i1':2})
在視圖函數使用 reverse("別名",kwargs={"關鍵字參數":1,"關鍵字參數":2 }反生 關鍵字參數動態路由的 別名
def index(request,n1,n2): print(reverse("zhanggen",kwargs={"n1":1,"n2":2 })) return render(request,'index.html',{'i':1,'i1':2})
在模板中反生 URL
注意 在視圖函數中 return render(request,'index.html',{'i':1,'i1':2})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>{{ i }}</p> <p>{% url "zhanggen" i i1%}</p> </body> </html>