1. 程式人生 > >Django框架之第二篇

Django框架之第二篇

一、知識點回顧

1、MTV模型

  model:模型,和資料庫相關的

  template:模板,存放html檔案,模板語法(目的是將變數如何巧妙的嵌入到HTML頁面中)。

   views:檢視函式

另加urls:url路徑與檢視函式的對映關係,,可以不是一一對應的。

2、相關的一些命令

  建立一個Django專案:django-admin  startproject  projectname

  建立一個專案下的應用:python3  manage.py  startapp  appname

  執行:python3  manage.py  runserver  IP PORT

3、url配置(URLconf)urls.py

  功能:建立起url與檢視函式的對映關係

  url(正則表示式(規則),檢視函式,[可選引數])

     url:http://127.0.0.1:8080/blog/articles/2003/05?a=1&b=2

     匹配字串:使用者輸入的url對應的路徑    /blog/articles/2003/05

 注意:

  (1)出現覆蓋現象的情況,也就是匹配規則衝突的時候,匹配第一個url

  (2)無名分組:url(r'^articles/(\d{4})/(\d{2})$', views.year_month),  # year(requset,1990,12)   按位置傳引數

  (3)有名分組:url(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_month),  # year(requset,year=1990,month=12)   按位置傳引數

  (4)url分發:url(r'^blog/',include('blog.urls'))

二、檢視函式的補充

1、檢視函式:一定是要包含兩個物件的(render原始碼裡面有HttpResponse物件)

               request物件:-----》所有的請求資訊

                HttpResponse:-----》響應的內容(字串)

2、get請求傳送資料:http://127.0.0.1:8000/login.html?user=asd&pwd=asd

  重點:request裡包含哪些資料
    1、request.GET: GET請求的資料,如果沒有資料是一個空字典    {}
    2、request.POST:POST請求的資料 ,如果沒有資料是一個空字典  {}
    3、request.method:請求方式:GET 或 POST
    4、請求某個鍵下多個值時:request.POST.getlist("hobby")
              5、 request.path : 請求路徑(只會拿到路徑,不拿資料)    

          請求url:http://127.0.0.1:8000/index.html/23?a=1
          path:request.path:/index.html/23
              6、  request.get_full_path()  :請求路徑(路徑和資料都會拿到)
         請求url:http://127.0.0.1:8000/index.html/23?a=1
         request.get_full_path():/index.html/23?a=1

  

三、render函式和redirect函式的區別

render:只會返回頁面內容,但是未傳送第二次請

redirect:發揮了第二次請求,url更新

 

 四、反向解析

在使用Django 專案時,一個常見的需求是獲得URL 的最終形式,以用於嵌入到生成的內容中(檢視中和顯示給使用者的URL等)或者用於處理伺服器端的導航(重定向等)。

人們強烈希望不要硬編碼這些URL(費力、不可擴充套件且容易產生錯誤)或者設計一種與URLconf 毫不相關的專門的URL 生成機制,因為這樣容易導致一定程度上產生過期的URL。

句話講,需要的是一個DRY 機制。除了其它有點,它還允許設計的URL 可以自動更新而不用遍歷專案的原始碼來搜索並替換過期的URL。

獲取一個URL 最開始想到的資訊是處理它檢視的標識(例如名字),查詢正確的URL 的其它必要的資訊有檢視引數的型別(位置引數、關鍵字引數)和值。

Django 提供一個辦法是讓URL 對映是URL 設計唯一的地方。你填充你的URLconf,然後可以雙向使用它:

  • 根據使用者/瀏覽器發起的URL 請求,它呼叫正確的Django 檢視,並從URL 中提取它的引數需要的值。
  • 根據Django 檢視的標識和將要傳遞給它的引數的值,獲取與之關聯的URL。

第一種方式是我們在前面的章節中一直討論的用法。第二種方式叫做反向解析URL、反向URL 匹配、反向URL 查詢或者簡單的URL 反查。

在需要URL 的地方,對於不同層級,Django 提供不同的工具用於URL 反查:

  • 在模板中:使用url 模板標籤。
  • Python 程式碼中:使用django.core.urlresolvers.reverse() 函式。
  • 在更高層的與處理Django 模型例項相關的程式碼中:使用get_absolute_url() 方法。

例子:

考慮下面的URLconf:

from django.conf.urls import re_path

from . import views

urlpatterns = [
    #...
    re_path(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    #...
]

根據這裡的設計,某一年nnnn對應的歸檔的URL是/articles/nnnn/

你可以在模板的程式碼中使用下面的方法獲得它們:

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>

<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

在Python 程式碼中,這樣使用:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect

def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

如果出於某種原因決定按年歸檔文章釋出的URL應該調整一下,那麼你將只需要修改URLconf 中的內容。

在某些場景中,一個檢視是通用的,所以在URL 和檢視之間存在多對一的關係。對於這些情況,當反查URL 時,只有檢視的名字還不夠。

 

例子中:

分析:想我們一開始寫的硬編碼,也就是把action要跳轉的路徑寫死了。但是像淘寶,天貓等都會經常更新新東西,,那麼你的頁面上的url路徑也

會時不時的變化。但是如果有特別多的商品,那麼你就得去服務端一個一個的改,這樣顯得很麻煩,那麼有沒有一種機制幫我們解決問題呢?那就

按照我下面的辦法解決。就把url路徑寫活了

1、首先給url起一個別名

2、然後在login.html中寫上{%  url ‘別名’’  %}    ,如果在頁面中點選檢視元素,它會變成login.html,,,當然我的是分發了,,就會變成test/login.html

3、這樣你就可以修改你的正則了,,因為他是按照別名走的,不會影響。

urls.py

login.html

檢視元素的結果:

 

 這樣的好處是:無論你怎麼改你要匹配的url,只要你寫上了別名。在html實現了模板語法,就會去找別名對應的那個url,以後不管你怎麼改url都

沒事,就寫活了,就不像一開始寫的硬編碼了。