響應對象
HttpResponse
respone = HttpResponse(content=響應體, content_type=響應體數據MIME類型, status=狀態碼)
respone['響應頭key'] = 響應頭值
JsonResponse【重點】
# 傳遞字典類型的數據 content_type: application/json
JsonResponse({"city":"廣州"})
# 傳遞列表數據
JsonResponse([{"city":"廣州"}, {'name': '北京'}], safe=False)
重定向
def resp(request):
# 重定向到首頁 狀態碼:302
# HttpResponseRedirect
return redirect('/index')
reverse函數【知道-用得較少】
動態地生成url地址,解決url重定向硬編碼維護麻煩的問題
url配置:
# 項目的urls.py
url(r'^', include('users.urls', namespace='命名空間')),
# 應用的urls.py
url(r'^index$', views.index, name='url配置項名'),
# 生成方式
url = reverse('命名空間:url配置項名稱')
<RegexURLPattern index ^index$>,
<RegexURLPattern None ^resp$>,
<RegexURLPattern None ^my_redirect$>,
<RegexURLPattern None ^set_cookie$>,
示例
# 項目的urls.py
url(r'^', include('users.urls', namespace='users')),
# 應用的urls.py
url(r'^home$', views.index, name='index'),
def my_redirect(request):
# 生成的url的值爲 /home
url = reverse('users:index')
return redirect(url) # 重定向
狀態保存【理解】
cookie
特點:
- 由服務器生成保存在客戶端的鍵值對數據
操作
-
保存cookie:使用 響應對象:
response.set_cookie('鍵', 值)
-
讀取cookie: 使用 request對象:
request.COOKIES.get('鍵)
有效期:默認爲關閉瀏覽器後 cookie 就失效
session
-
session工作原理
-
django默認保存session到數據庫表中
-
一條記錄保存一個瀏覽器(一個用戶)的所有的session鍵值對數據
-
通過sessionid來區分不同的瀏覽器(不同用戶)
-
-
通過session相關命令
request.session['鍵']= 值 # 保存 request.session.get('鍵') # 讀取 request.session.set_expiry(value) # 設置有效期,默認爲2周 del request.session['鍵'] # 刪除一個鍵值 request.session.flush() # 刪除當前訪問用戶所有session數據: 刪除一條表記錄 request.session.clear() # 刪除當前訪問用戶所有session數據: 清空字段中的值
-
session默認有效期:兩週
Django是如何保存和註銷用戶登錄狀態的【擴展】
- 管理後臺登錄界面
- 登錄成功調用login方法,通過session保存登錄用戶id
- 註銷一個用戶會清除session數據
- 登錄之後,通過 request.user 就能得到登錄用戶對象
類視圖
類視圖使用【重點】
-
定義類視圖,繼承View類,在類視圖中定義get, post, put等相關方法
class PostView(View): def get(self, request): return render(request, 'post2.html') def post(self, request): return HttpResponse('執行發帖操作')
-
配置路由時,調用類視圖的.as_view()方法
urlpatterns = [ ... url(r'^post2$', views.PostView.as_view()), ]
類視圖使用裝飾器
- method_decorator: 爲函數裝飾器補充第一個self參數,使它可以應用到類的方法中。
方式1:
class PostView(View):
def get(self, request):
return render(request, 'post2.html')
@method_decorator(check_ip)
def post(self, request):
return HttpResponse('處理髮帖操作')
方式2:
@method_decorator(check_ip, name='get')
#@method_decorator(check_ip, name='dispatch')
class PostView(View):
def get(self, request):
return render(request, 'post2.html')
def post(self, request):
return HttpResponse('處理髮帖操作')
中間件【理解】
作用:在視圖執行前或執行後,作一些額外的操作,比如:
- 在視圖執行前判斷ip是否爲黑名單
中間件的執行順序
中間件使用
- 定義中間件
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
print('before 視圖')
# 注意:可以返回None或者response對象,如果返回response對象,則視圖函數就不會再執行了
def process_response(self, request, response):
print('after 視圖')
return response # 必須要有返回值
- 在settings文件中配置
MIDDLEWARE = [
...
'middlewares.MyMiddleware', # 註冊中間件
]
request.user對象從何而來【擴展】
- django提供了一個認證中間件
- 在視圖執行前會查詢登錄的用戶對象
- get_user方法:會取出用戶id查去查詢
- 從session讀取出用戶id