Django之路由分配系統

前言:

Django大體工做流程

一、客戶端發送請求(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()
View Code

 

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

 

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

 

2、在客戶端經過url中的 path向後端傳參數 

 在前端咱們不只能夠經過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/')

 

 

 

 

3、路由分發

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了

 

 

 

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

一、什麼是路由別名?

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