路由層 |
url路由層結構html
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$', views.index), url(r'^index/', views.index, name='index'), ] url(正則表達式, views視圖函數,參數,別名)
在Django1.0版本中路由層,第一個參數就是一個正則表達式,也就意味着路由在匹配的時候是按照正則表達式的規則取匹配的, 路由的匹配順序是從上到下依次匹配,匹配到以後立刻執行視圖前端
函數,不在向下繼續匹配路由。python
按照正則表達式語法,就能夠實現首頁的路由書寫方式,和不存在頁面(錯誤頁面404)路由的書寫方式git
,注意錯誤頁面位置放到最後。正則表達式
匹配一個到無限個數字的路由書寫方式:django
經常使用的解決錯誤匹配的方法:1 切換位置 2 換正則表達式。json
Django2.0版本中url 變爲了path,可是它也保留了正則的方式:後端
補充說明:瀏覽器
# 是否開啓URL訪問地址後面不爲/跳轉至帶有/的路徑的配置項 APPEND_SLASH=True Django settings.py配置文件中默認沒有 APPEND_SLASH 這個參數,但 Django 默認這個參數爲 APPEND_SLASH = True。 其做用就是自動在網址結尾加'/'。 其效果就是: 咱們定義了urls.py: from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^blog/$', views.blog), ] 訪問 http://www.example.com/blog 時,默認將網址自動轉換爲 http://www.example/com/blog/ 。 若是在settings.py中設置了 APPEND_SLASH=False,此時咱們再請求 http://www.example.com/blog 時就會提示找不到頁面。
Django 1.0 與2.0 的差異app
django2.0裏面的path第一個參數不支持正則,你寫什麼就匹配,100%精準匹配 django2.0裏面的re_path對應着django1.0裏面的url 雖然django2.0裏面的path不支持正則表達式,可是它提供五個默認的轉換器 str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式 int,匹配正整數,包含0。 slug,匹配字母、數字以及橫槓、下劃線組成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?) 自定義轉換器 1.正則表達式 2.類 3.註冊 # 自定義轉換器 class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value # 佔四位,不夠用0填滿,超了則就按超了的位數來! register_converter(FourDigitYearConverter, 'yyyy') PS:路由匹配到的數據默認都是字符串形式
有名分組與無名分組
分組的目的:利用正則分組手段,來實現參數的傳遞。例如在編輯用戶的時候,咱們須要獲取用戶的id,以前是藉助 href get請求傳值的方式,將用戶的id傳到後臺。如今咱們有了更專業的手段。
分組分類:
有名分組,我將其理解爲位置參數的傳值方式,使用方式以下圖,瀏覽器用戶輸入的網址中,test/ 後方的2018,在url.py 中利用正則分組的方式,將其做爲位置參數,傳給view層的test函數的xxx。
這樣就完成了前端對後端的參數傳遞,和以前利用a標籤在get模式下的傳參方式一模一樣。獲取到這個參數以後,就能夠進行新的一通騷操做了。
無名分組,我將其理解爲關鍵字參數的傳值方式,和無名分組大差不差,就是參數前面指定了一個名稱,這個名稱有指定的做用,和函數的位置與關鍵字傳參一模一樣。使用方式以下圖:
?P<year> 就是固定的書寫格式,year就是參數名稱,因此對應於view層中的函數也必須有year這個形參來接收。
注意:有名分組於無名分組不要混着用,這是規定,沒有爲何!固然相同類型也能夠傳多個參數。
反向解析
隨着功能的增長會出現更多的視圖,可能以前配置的正則表達式不夠準確,因而就要修改正則表達式,可是正則表達式一旦修改了,以前全部對應的超連接都要修改,真是一件麻煩的事情,並且可能還會漏掉一些超連接忘記修改,有辦法讓連接根據正則表達式動態生成嗎? 就是用反向解析的辦法。
應用範圍:
1 模板中的超連接
2 視圖中的重定向
正如上面所說,若是咱們時不時的更改正則表達式,此時咱們就要改不少的地方,那有沒有一種方式可以不那麼麻煩,也能隨意的改正則表達式呢,答案就是給這個url 命名。
如圖所示,在函數名後面加一個 name= ’名稱‘ 的方式,爲該url貼個名字,有了這
個名字以後,前端後端下次再只須要經過這個名字取匹配相應的url ,此時不管你怎樣去改動url中的正則表達式都無所謂,由於它們以及換成了 名字 來連接彼此了。此時要注意,這個
名字是必定不能重複的。 既然說是用名字來替代前面的url,那具體如何使用呢:
前端使用方式:
標準的模板語法。
後端使用方式,先解釋,後端是想經過這個名字反向獲得 名字所表明 url的正則表達式,以達到不管正則表達式怎麼變,我只要後端名字和url保持一致,就能拿到這個url中的正則表達式。
一般這裏是結合(redirect)重定向來使用,也就是你前面url正則隨意變,我重定向永遠能匹配到你。這裏就使用到了reverse 模塊。
首先是導入 reverse 而後如圖操做
結論:有了反向解析以後,咱們就不用再擔憂,改了url的正則表達式以後,又得改view 和 html中的正則表達式,有了名字以後,就省事多了。可是此時又有了新的問題,上面所說的有名分組和無名分組
的參數要怎麼結合着使用呢?
路由分發
項目中的urls層做爲一個大組長,每一個app就是一個個體,路由來了先由大組長分發到每一個個體中的urls.py中,來作匹配。這樣的好處在於,大組長裏不須要把全部的路由都寫下來,
結構更加清晰,適合一個項目中有多個app的場景。注意分發總路由千萬不要寫$結尾
僞靜態碼(seo搜索引擎優化)
做用:提高網頁顆粒度,讓搜索引擎更容易搜索到,由於搜索引擎會優先記錄以html結尾的靜態頁面。
模擬環境
爲啥要用虛擬環境:一個項目中須要的模塊是有限的,虛擬環境能夠避免導入一些無用的模塊,須要什麼模塊就導入什麼模塊。本質上就是下載了一個新的pycham,一個純淨的環境。
換源的方法:百度搜索pip源,複製清華源的url 在項目中添加,雙擊任意一個現有模塊,刪除以前的源,添加新源url。
FBV/CBV |
FBV fouction base view,基於函數的視圖
CBV class base view 基於函數的視圖
class MyCls(View): def get(self,request): return render(request,'index.html') def post(self,request): return HttpResponse('post')
使用JSON實現先後端分離
dumps 內部加入ensure——ascii以後 序列化的字符串中中午不會在自動編碼。Django自帶的方式,
JsonResponse(將相應的數據自動轉換成json格式,而後直接發送回瀏覽器)
導入模塊 from django.http import JsonResponse import json 原始方法: def index(request): res = {'name':'sgt','password':18} return HttpResponse(json.dumps(res)) JsonResponse方法: def index(request): return JsonResponse( {'name':'sgt','password':'1888888'}, json_dumps_params={'ensure_ascii':False} ) 注意:json_dumps_params={'ensure_ascii':False}這個的做用是,將Django默認轉碼功能取消,這樣就能顯示漢字了。
文件上傳
1 注意form表單數據提交的方式
2 請求經過點 FILES方法能夠獲取文件字典對象,經過get()方法能夠獲取字典中的值
3 get(‘my_file’)能夠獲取FILES請求中的文件數據。
request.path 與 request.get_full_path 區別:get_full_path能夠獲取用戶輸入的完整路徑。