Django之路由分配系統


前言:

Django大致工作流程

1、客戶端發送請求(get/post)經過web服務器、Django中間件、 到達路由分配系統 
2、路由分配系統根據提取 request中攜帶的的url路徑(path)與視圖函數映射關系列表中,匹配到1個視圖函數,foo(request)執行;

3、視圖函數 使用原生SQL或者ORM去數據庫拿到數據,在服務端進行渲染(模板+數據渲染)

4、視圖函數return一個 response對象 返回客戶端

 

Django路由分配系統簡介

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()
View Code

 

本文主要介紹 Django路由分配系統

 

一、Django的路由分配系統

1個URL對應1個視圖函數

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

 

二、在客戶端通過url中的 path向后端傳參數 

 在前端我們不僅可以通過get請求攜帶參數的方式向server端傳數據; https://i.cnblogs.com/%EF%BC%9Fid=1&name=alex

Django也允許通過,path路徑的方式向server端傳值;

注意事項:按位置,和按關鍵字路由系統只能用1種,不能混合使用;

1、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')
#注意如果按位置傳參的動態路由系統,必須在視圖函數添加對應的參數接收!

 

2、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')

 

3、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了

 

 

 

 四、路由別名(應用站點權限管理)

1、什么是路由別名?

給Django路由分發系統 URL--視圖函數對應關系命個名,

然后在模板中{% url "zhanggen" i i1%}反生成 訪問該站點URL,

或者在視圖函數中reverse()反向生產當前訪問URL;

2、作用

保證前后端數據一致性,后端修改了匹配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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM