Django篇(三)

  • 2019 年 10 月 6 日
  • 筆記

視圖

1、視圖的功能

接受請求,和模板頁(T)、models進行交互,並返回應答。

可以返回一個內容HttpResponse,也可以重定向redirect。

2、視圖的使用

2.1必須有一個request參數,來接收伺服器返回給我們的內容,

比如在登陸的時候的帳號密碼發送過來,我們就是用request這個參數來接收。

2.2必須要配置url,才能映射到我們的方法。

3、簡述url的匹配過程:

比如瀏覽器中輸入127.0.0.1:8000/aindex,

瀏覽去發送到項目的urls.py文件中進行匹配,如果我項目的url匹配是這樣的:

urlpatterns = [

url(r'^admin/', include(admin.site.urls)),

url(r'^a', include('student.urls')),

]

那麼我們Django框架從瀏覽器中拿到aindex來和url中匹配,很明顯第一個和我們的url並不匹配,

第二個匹配,於是就映射到student這個應用下的urls.py文件中,假如我們student.py下的url.py匹配規則是這樣:

urlpatterns = [

url(r'^index$', views.index),

]

從項目中匹配的a會過濾掉,就只剩下index發送到我們應用(student)下的urls.py中,剛好匹配,就會映射到我們視圖

中的index方法。

注意:如果訪問的地址是這樣:127.0.0.1:8000/aindex?id=1.

其中的?id=1是不參與匹配的,他代表的是參數,在視圖中我也可以通過request對象獲取到。

4、當我們瀏覽器訪問一個不存在的頁面會報錯404,當我們模板有錯誤的時候會報錯500,

並且都會提示哪裡有錯誤,這在項目上線後是不允許的,怎麼讓他只顯示404或者500,不會提示具體的錯誤資訊?

需要在setting.py中,將DEBUG=True修改為DEBUG=False,將ALLOWED_HOSTS=[]修改成ALLOWED_HOSTS=[*]表示允許所有人訪問。

當然在開發的時候還是True好點。

4.1當做了上面一系列修改後,錯誤頁面就只會顯示Not Found,這種簡單的資訊。

如果你認為這個404頁面不好看,或者500頁面不好看,我們只需要在模板(Templates)下創建404.html

或者500.html,當找不到頁面的時候,就會自動訪問404.html,無需其他配置。

5、捕獲url參數

在上一篇實例中,我們就使用過,上一篇文章中應用下的url.py是這樣的:

urlpatterns = [

url(r'^classinfo$', views.show_classname),

url(r'^classinfo/(d+)$', views.show_stuinfo),

]

其中帶有正則中帶有括弧的,就是我們用來捕捉url參數的,你想要什麼內容,就用()將它括起來。

我們在視圖中,需要在該對應的視圖方法上再添加一個參數,這個參數接收的就是我們正則中括起來的部分。

6、cookie和session

由於HTTP協議是無狀態的,他不會記住你上一次做了什麼操作。

所以我們需要cookie和session來幫助我們需要記住的東西,(比如帳號密碼)

那麼為什麼需要兩個來保存呢?

cookie是儲存在本地,也就是你磁碟的文本,是不安全的,session是儲存在服務端的,所以需要這兩個相輔相成。

cookie的請求過程:

瀏覽器輸入網址,發送給伺服器請求,伺服器進行處理,設置cookie資訊,返回給瀏覽器set-cookie這個欄位,瀏覽器保存到本地,

下次再次請求這個域名相關的網站,瀏覽器會將cookie一起發送給伺服器,伺服器如果接收到cookie,從中取出帳號等,就不用我們再次登陸了。

cooike是由過期時間的,如果不設置,就會在關閉瀏覽器的時候失效。

session:

依賴於cookie。請求的過程差不多,session是放在cookie張保存的。

cookie常用於記住用戶名。

session常用於記住登陸狀態,等要求安全係數高的數據。

模板

1、模板的作用

展示我們的html頁面。

2、模板的查找順序

首先會在我們自己創建的templates下查找模板文件,如果沒有,會在配置文件setting.py的INSTALLED_APPS中查找,

必須要有templates這個文件夾,他才會去查找,所有隻會再去查找前兩個應用時候有該文件。所以404.html不用我們配置,他就會找到。

3、變數使用

3.1、模板使用返回的數據

{{數據}}

3.2、for循環

{% for i in 可遍歷對象%}

數據 xxx

顯示遍歷的次數,從1開始

{{forloop.counter}}

數據為空

{ empty}

為空時輸出

{% endfor%}

if判斷

{% if 條件%}

{%elif 條件%}

{%else%}

{%endif%}

其中的比較運算符,運算符左右需要空格隔開。

4、過濾器

常用操作:

date:改變日期的顯示格式

lenth:求長度。

default:設置默認值

使用格式:模板變數|過濾器:參數

比如stuinfo.bir_date是從view返回的生日

我們寫成:{{stuinfo.bir_date|date:'Y年-m月-d-日'}}

求長度:沒有參數比如 name|lenth

設置默認值:name|defaulf:'zhangsan'

還有很多,遇到再說。

5、模板注釋

單行注釋:{% 注釋內容 %}

多行注釋:{% comment %}

內容

{%endcomment%}

html注釋:<!– 內容 –>

6、繼承模板頁

很多時候,我們頁面大多數的菜單,頭部,底部都是一樣的,我們不可能每次都寫一遍,所以就需要繼承模板頁。

{% extends '父頁面路徑'%},同時我們也要在父模板中預留位置來存放子頁面:

{%block 塊名%}

{%endblock 塊名%}

塊名,為自定義名字。子模版也寫上同樣的:

{%block 塊名%}

{%endblock 塊名%}

7、登錄裝飾器

我們基本大部分頁面都是需要登陸才可以訪問,此時我們就需要寫一個登陸的裝飾器來幫助我們。

寫一個裝飾器函數:

def login_required(func):

def wrapper(request,*view_args,**view_kwargs):

# 判斷是否存在session,不存在表示沒登錄

if request.session.has_key('你的session名字')

return func(request,*view_args,**view_keargs)

else:

# 重定向

return redirect('登陸頁的視圖函數')

return wrapper

8、url反向解析

如果每個頁面都有返回主頁,但是我們的主頁方法改了,那麼每個返回主頁的鏈接都要修改,很麻煩。

可以將我們的url寫成動態的。

在寫成動態之前需要:

將項目下的url.py,添加一個namespace參數:

urlpatterns = [

url(r'^admin/', include(admin.site.urls)),

url(r'^a', include('student.urls',namespace='student')),

]

我在include中添加了一個namespace參數,一般給應用名,再修改應用下的urls.py添加一個name屬性:

urlpatterns = [

url(r'^classinfo$', views.show_classname,name = 'classinfo'),

url(r'^classinfo/(d+)$', views.show_stuinfo),

]

此時:我們頁面返回classinfo的頁面可以寫成:

<a href="{% student:classinfo %}">classinfo</a>

就會自動的去訪問classinfo頁。如果在url中捕捉的有參數:需要寫成

<a href="{% url 'student:classinfo' 參數1 %}">classinfo</a>,如果還有參數直接添加就好了。