django 學習之淺析類視圖凛虽、中間件

django

「django 學習」第 2 篇死遭,淺談類視圖、中間件

填坑

接上篇的學生管理系統(tǒng)凯旋,對于我們現在的需求來說呀潭。我們不必改寫為 Class-based View,這里只是演示用法至非。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from django.urls import reverse
from django.http import HttpResponseRedirect
from django.views import View
from .models import Student
from .forms import StudentForm


class IndexView(View):
  
  template_name = 'index.html'
  
  def get_context(self):
    students = Student.objects.all()
    context = {
        'students': students
    }
    return context
  
  def get(self, request):
    form = StudentForm()
    context.update({
        'form': form
    })
    return render(request, self.template_name, context)
  
  def post(self, request):
    form = StudentForm(request.POST)
    if form.is_valid():
      student = Student()
      student.name = form.cleand_data['name']
      student.sex = form.cleand_data['sex']
      student.profession = form.cleand_data['profession']
      student.email = form.cleand_data['email']
      student.qq = form.cleand_data['qq']
      student.save()
      return HttpResponseRedirect(reverse('index'))
    context.update({
        'form': form
    })
    return render(request, self.template_name, context)

在代碼層面上钠署,代碼量明顯增多了,但是邏輯上更清晰了荒椭,也方便我們日后維護谐鼎。我們來改寫 urls.py,代碼如下:

from django.conf.urls import url
from django.contrib import admin
from student import views

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^admin/', admin.site.urls),
]

只是調用了 as_view()趣惠,可以簡單的理解為把 getpost 做了一層封裝狸棍,然后做了判斷。

使用 Class-based View 可以方便復用味悄,比如項目中草戈,你的邏輯處理都沒變,只不過用的模板不一樣侍瑟。那么直接繼承唐片,替換模板文件即可。更多的可以參考官方文檔: django官方文檔

Middleware

中間件是 Django 處理 請求/響應 的鉤子框架涨颜。它是一個輕巧的低級 “插件” 系統(tǒng)费韭,用于全局改變Django的輸入或輸出。

在這之前咐低,我們先來看張圖:

default

一個 HttpRequest 進來揽思,是從上往下,一層層過濾的见擦。返回 HttpResponse钉汗,是從下往上的。
其實跟 Scrapy 的中間件很相似鲤屡,不過一個是主動發(fā)起的 request损痰,比如 Scrapy 中,你想要在發(fā)出 request 的時候帶上一些必要的請求頭酒来,可以這么來寫:

import random
from .agents import agents


class UAMiddleware(object):

    def process_request(self, request, spider):
        agent = random.choice(agents)
        request.headers["User-Agent"] = agent

如果把 Scrapy 中重寫中間件比作攻擊方卢未,那么在 Django 中就好比防守方。下面來看 Stack overflow 的一個例子:

class FilterIPMiddleware(object):
    # Check if client IP is allowed
    def process_request(self, request):
        allowed_ips = ['192.168.1.1', '123.123.123.123', etc...] # 允許的 IP
        ip = request.META.get('REMOTE_ADDR')
        if ip not in allowed_ips:
            raise Http403 # If user is not allowed raise Error 如果用戶不再允許的范圍內,拋出 Error

       return None

process_request:一個請求來到 middleware 層辽社,進入的第一個方法伟墙。一般我們可以做一些檢驗,比如用戶登錄滴铅,Http 請求頭驗證之類的戳葵。這個方法返回兩個值 HttpResponse 或者 None。

關于中間件的其他幾個方法汉匙,比如 process_response拱烁、process_exceptionprocess_view 噩翠、process_template_response戏自,并沒有仔細的去研究,就不多說了伤锚,大家可以自行查看官方文檔擅笔。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市见芹,隨后出現的幾起案子剂娄,更是在濱河造成了極大的恐慌,老刑警劉巖玄呛,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阅懦,死亡現場離奇詭異,居然都是意外死亡徘铝,警方通過查閱死者的電腦和手機耳胎,發(fā)現死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惕它,“玉大人怕午,你說我怎么就攤上這事⊙推牵” “怎么了郁惜?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甲锡。 經常有香客問我兆蕉,道長,這世上最難降的妖魔是什么缤沦? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任虎韵,我火速辦了婚禮,結果婚禮上缸废,老公的妹妹穿的比我還像新娘包蓝。我一直安慰自己驶社,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布测萎。 她就那樣靜靜地躺著亡电,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绳泉。 梳的紋絲不亂的頭發(fā)上逊抡,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天姆泻,我揣著相機與錄音零酪,去河邊找鬼。 笑死拇勃,一個胖子當著我的面吹牛四苇,可吹牛的內容都是我干的。 我是一名探鬼主播方咆,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼月腋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓣赂?” 一聲冷哼從身側響起榆骚,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煌集,沒想到半個月后妓肢,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡苫纤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年碉钠,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卷拘。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡喊废,死狀恐怖,靈堂內的尸體忽然破棺而出栗弟,到底是詐尸還是另有隱情污筷,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布乍赫,位于F島的核電站瓣蛀,受9級特大地震影響,放射性物質發(fā)生泄漏耿焊。R本人自食惡果不足惜揪惦,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罗侯。 院中可真熱鬧器腋,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至措左,卻和暖如春依痊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怎披。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工胸嘁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凉逛。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓性宏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親状飞。 傳聞我的和親對象是個殘疾皇子毫胜,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容