## FBV /?CBV?
FBV:function base view
```
url(r'^index$',user)
```
~~~
def users(request):
return HttpResponse(‘OK’)
~~~
CBV:class base view
~~~
url(r'^students/', views.StudentsView.as_view())
~~~
```
from django.views import View
class StudentsView(View):
def get(self,request,*args,**kwargs):
return HttpResponse('GET')
def post(self, request, *args, **kwargs):
return HttpResponse('POST')
def put(self, request, *args, **kwargs):
return HttpResponse('PUT')
def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')
視圖
```
**CBV實現原理**
基于反射實現根據請求方式不同,執行不同的方法。具體實現流程:url中的as\_view() —》 view方法 —》 dispatch方法(根據反射執行相應函數)
CBV中可以使用的方法:
~~~
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
~~~
```
from django.views import View
class RestApi(View):
def dispatch(self,request,*args,**kwargs):
func = getattr(self,request.method.lower())
ret = func(request,*args,**kwargs)
return ret
def get(self,request,*args,**kwargs):
return HttpResponse('get')
def post(self,request,*args,**kwargs):
return HttpResponse('post')
def put(self,request,*args,**kwargs):
return HttpResponse('put')
def delete(self,request,*args,**kwargs):
return HttpResponse('delete')
手動實現dispatch方法
```
```
from django.views import View
class RestApi(View):
def dispatch(self,request,*args,**kwargs):
ret = super(RestApi, self).dispatch(request,*args,**kwargs)
return ret
def get(self,request,*args,**kwargs):
return HttpResponse('get')
def post(self,request,*args,**kwargs):
return HttpResponse('post')
def put(self,request,*args,**kwargs):
return HttpResponse('put')
def delete(self,request,*args,**kwargs):
return HttpResponse('delete')
手動繼承dispatch方法
```
## Django中間件
django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束后,django會根據自己的規則在合適的時機執行中間件中相應的方法。
我們從瀏覽器發出一個請求 Request,得到一個響應后的內容 HttpResponse ,這個請求傳遞到 Django的過程如下:

每一個請求都是先通過中間件中的 process\_request 函數,這個函數返回 None 或者 HttpResponse 對象,如果返回前者,繼續處理其它中間件,如果返回一個 HttpResponse,就處理中止,返回到網頁上。
中間件中可以定義4個方法,分別是:
1. process\_request(self,request) 發送請求
2. process\_view(self, request, callback, callback\_args, callback\_kwargs) 執行完 request 預處理函數并確定待執行的 view 之后,但在 view 函數實際執行之前。
3. process\_template\_response(self,request,response)
4. process\_exception(self, request, exception) 收集錯誤信息
5. process\_response(self, request, response) 必須返回 HttpResponse 對象. 這個 response 對象可以是傳入函數的那一個原始對象(通常已被修改),也可以是全新生成的。
執行順序也是按照以上順序執行的.
自定義中間件
```
from django.utils.deprecation import MiddlewareMixin
class test1(MiddlewareMixin):
def process_request(self, request):
print('wusir')
class test2(MiddlewareMixin):
def process_request(self, request):
print('jack')
```
注冊中間件
```
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'wusir.m1.test1',
'wusir.m1.test2',
]
```
終端輸出結果
~~~
wusir
jack
tom
[17/Dec/2018 17:08:04] "GET /app/aa HTTP/1.1" 200 2
~~~
PS:與mange.py在同一目錄下的文件夾 wusir下的m1.py文件中的test1,test2類
**中間件可以做什么**
* 權限
* 用戶登錄驗證
* Django的csrf的實現
```
情況一:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', # 全站使用csrf認證
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt # 該函數無需認證
def users(request):
user_list = ['alex','oldboy']
return HttpResponse(json.dumps((user_list)))
情況二:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware', # 全站不使用csrf認證
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
from django.views.decorators.csrf import csrf_exempt
@csrf_protect # 該函數需認證
def users(request):
user_list = ['alex','oldboy']
return HttpResponse(json.dumps((user_list)))
為某個函數單獨增加或取消CSRF認證
```
**CSRF在CBV中的使用補充**
裝飾器@csrf\_exempt,@csrf\_protect必須在dispatch方法中(單獨方法無效)
```
方式一:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator
class StudentsView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super(StudentsView,self).dispatch(request, *args, **kwargs)
def get(self,request,*args,**kwargs):
print('get方法')
return HttpResponse('GET')
def post(self, request, *args, **kwargs):
return HttpResponse('POST')
def put(self, request, *args, **kwargs):
return HttpResponse('PUT')
def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')
方式二:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt,name='dispatch')
class StudentsView(View):
def get(self,request,*args,**kwargs):
print('get方法')
return HttpResponse('GET')
def post(self, request, *args, **kwargs):
return HttpResponse('POST')
def put(self, request, *args, **kwargs):
return HttpResponse('PUT')
def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')
```
- Python學習
- Python基礎
- Python初識
- 列表生成式,生成器,可迭代對象,迭代器詳解
- Python面向對象
- Python中的單例模式
- Python變量作用域、LEGB、閉包
- Python異常處理
- Python操作正則
- Python中的賦值與深淺拷貝
- Python自定義CLI三方庫
- Python并發編程
- Python之進程
- Python之線程
- Python之協程
- Python并發編程與IO模型
- Python網絡編程
- Python之socket網絡編程
- Django學習
- 反向解析
- Cookie和Session操作
- 文件上傳
- 緩存的配置和使用
- 信號
- FBV&&CBV&&中間件
- Django補充
- 用戶認證
- 分頁
- 自定義搜索組件
- Celery
- 搭建sentry平臺監控
- DRF學習
- drf概述
- Flask學習
- 項目拆分
- 三方模塊使用
- 爬蟲學習
- Http和Https區別
- 請求相關庫
- 解析相關庫
- 常見面試題
- 面試題
- 面試題解析
- 網絡原理
- 計算機網絡知識簡單介紹
- 詳解TCP三次握手、四次揮手及11種狀態
- 消息隊列和數據庫
- 消息隊列之RabbitMQ
- 數據庫之Redis
- 數據庫之初識MySQL
- 數據庫之MySQL進階
- 數據庫之MySQL補充
- 數據庫之Python操作MySQL
- Kafka常用命令
- Linux學習
- Linux基礎命令
- Git
- Git介紹
- Git基本配置及理論
- Git常用命令
- Docker
- Docker基本使用
- Docker常用命令
- Docker容器數據卷
- Dockerfile
- Docker網絡原理
- docker-compose
- Docker Swarm
- HTML
- CSS
- JS
- VUE