Django 路由視圖FBV/CBV

路由層

 

 

  

 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能夠獲取用戶輸入的完整路徑。

相關文章
相關標籤/搜索