1. 程式人生 > >Django-中介軟體-csrf擴充套件請求偽造攔截中介軟體-Django Auth模組使用-效仿 django 中介軟體配置實現功能插拔式效果-09

Django-中介軟體-csrf擴充套件請求偽造攔截中介軟體-Django Auth模組使用-效仿 django 中介軟體配置實現功能插拔式效果-09

目錄

  • 昨日補充:將自己寫的 login_auth 裝飾裝在 CBV 上
  • django 中介軟體
    • django 請求生命週期 *****
    • 預設中介軟體及其大概方法組成
    • 中介軟體的執行順序
      • 自定義中介軟體探究不同操作對中介軟體執行順序的影響
      • csrf 中介軟體 跨站請求偽造
    • post請求提交資料通過 csrf 校驗
      • form 表單
      • ajax 傳送
    • csrf 裝飾器相關
      • 未註釋掉 csrf 中介軟體時 單功能取消 csrf 校驗:csrf_exempt
      • 註釋掉 csrf 中介軟體時 單功能開啟 csrf 校驗:csrf_protect
  • Auth 模組
    • 使用 django 自帶的 auth 表做登入功能
      • 核心程式碼
    • 自定義擴充套件 autor 表字段
  • 效仿 django中介軟體配置 實現 功能插拔式效果
    • 程式碼實現

昨日補充:將自己寫的 login_auth 裝飾裝在 CBV 上

類裡面的方法一般都是類繫結方法 或者 物件繫結方法,第一個引數是類 或者 物件本身,那麼前面寫的裝飾器就要改引數才能用了,不過這裡我們可以用 django 給我們寫好的裝飾器,從不需要更改寫好的裝飾器

三種方式 (別忘了導模組)

from django.utils.decorators import method_decorator

# @method_decorator(login_auth, name='get')  # 第一種, name 引數必須指定
class MyHome(View):
    # @method_decorator(login_auth)  # 第二種, get 和 post 都會被裝飾(登入驗證)(直接把 dispatch 拿過來,加個裝飾器)
    def dispatch(self, request, *args, **kwargs):
        super().dispatch(request, *args, **kwargs)
     
    @method_decorator(login_auth)  # 第三種,直接裝飾在單個方法上
    def get(self, request):
        return HttpResponse('get')
    
    def post(self, request):
        return HttpResponse('post')

django 中介軟體

django 中介軟體 就類似於是 django 的門戶,請求來的時候需要先經過 中介軟體 才能到達 django 後端(urls),響應走的時候也需要經過 中介軟體 才能到達 web服務閘道器介面(wsgif 模組)

django 中介軟體可以用來做什麼

  • 做網站全域性的身份校驗,限制訪問頻率,許可權校驗(反爬)... 只要是涉及到全域性的校驗幾乎都可以在中介軟體中完成,第一時間該想到的也是中介軟體

django 的中介軟體是設計比較完善的,邏輯最清晰,最簡單(flask的中介軟體不如它)

講完這個中介軟體就知道為什麼我們前面每次提交 post 請求都會寫上先去 settings.py 裡把 csrf 這個中介軟體暫時註釋掉了

django 請求生命週期 *****

經過 中介軟體 之後才能進入 urls.py(再 views.py ... 一層一層遞進)

科普:

  1. wsgiref 不能夠承受高併發,所以上線之後會換成 uwsgi 模組(前面再加一個 nginx 做反向代理)
  • WSGI 與 wsgi 以及 uwsgi 分別什麼意思

​ WSGI是一個協議標準,wsgiref 和 uwsgi 都是實現了 WSGI 協議的功能模組

  1. 請求在進入第一層中介軟體時會去快取資料庫中判斷有沒有資料
  • 如果有的話會直接拿到資料並返回請求(這樣可以節約資源,降低伺服器以及資料庫的壓力)
  • 如果沒有的話會接著一層一層地走中介軟體,然後路由配置、views.py ...,等請求再次來到最後一層中介軟體時,在返回資料的同時,會儲存一份在快取資料庫中。(下次就可以直接在快取資料庫中拿到資料了)

具體原理等後期涉及到展開來講, 先知道這個概念就行

預設中介軟體及其大概方法組成

django 預設有七個中介軟體

django 支援使用者自定義自己的中介軟體,並且暴露給使用者,還暴露給使用者五個可以自定義中介軟體的方法

# settings.py 裡的七個預設中介軟體
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',
]

點進去觀察 中介軟體原始碼

'''
django.middleware.security.SecurityMiddleware
--> 本質是動態匯入(可以看最後面的那個模仿案例) 
# from django.middleware.security import SecurityMiddleware

django.middleware.csrf.CsrfViewMiddleware
--> from django.middleware.csrf import CsrfViewMiddleware
'''

發現 django 中介軟體 中有五個使用者可以自定義的方法

# django.middleware.csrf.CsrfViewMiddleware  --> from django.middleware.csrf import CsrfViewMiddleware
class CsrfViewMiddleware(MiddlewareMixin):
    def _accept(self, request):
    def _reject(self, request, reason):
    def _get_token(self, request):
    def _set_token(self, request, response):
    def process_request(self, request):
    def process_view(self, request, callback, callback_args, callback_kwargs):
    def process_response(self, request, response):

# django.middleware.security.SecurityMiddleware  --> django.middleware.security.SecurityMiddleware
class SecurityMiddleware(MiddlewareMixin):
    def __init__(self, get_response=None):
    def process_request(self, request):
    def process_response(self, request, response):      

# django.contrib.sessions.middleware.SessionMiddleware
class SessionMiddleware(MiddlewareMixin):
    def __init__(self, get_response=None):
    def process_request(self, request):
    def process_response(self, request, response):
  • 需要我們掌握的方法有
  1. process_ request() 方法
  2. process_ response ()方法
  • 需要了解的方法
  1. process_ view()
  2. process exception ()
  3. process_ template_ response ()

中介軟體的執行順序

大體同 django 請求生命週期 那張圖,可能會受以下情況的影響

自定義中介軟體探究不同操作對中介軟體執行順序的影響

測試思路:

  • 在 settings.py 裡註冊不同中介軟體,探究預設的執行順序
  • 在不同中介軟體的 process_request 和 process_response 等方法中 return HttpResponse 物件會對執行順序造成什麼影響
  • 瞭解五種方法的觸發時機

自定義中介軟體

  1. 新建一個資料夾(放在全域性或 app 內)
  2. 寫一個類繼承 MiddlewareMiXin 類
  3. 裡面書寫需要的(五個方法中的某些)方法
  4. 一定要在 settings.py 裡配置中介軟體

程式碼

mymiddleware/mdd.py 自定義中介軟體

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class MyMdd(MiddlewareMixin):
    def process_request(self, request):
        print('我是第一個中介軟體裡面的process_request方法')

    def process_response(self, request, response):
        print('我是第一個中介軟體裡面的process_response方法')
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print(view_func)
        print(view_args)
        print(view_kwargs)
        print('我是第一個中介軟體裡面的process_view方法')

    def process_exception(self, request, exception):
        print('我是第一個中介軟體裡面的process_exception')

    def process_template_response(self, request, response):
        print('我是第一個中介軟體裡面的process_template_response')
        return response


class MyMdd1(MiddlewareMixin):
    def process_request(self, request):
        print('我是第二個中介軟體裡面的process_request方法')

    def process_response(self, request, response):
        print('我是第二個中介軟體裡面的process_response方法')
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print(view_func)
        print(view_args)
        print(view_kwargs)
        print('我是第二個中介軟體裡面的process_view方法')

    def process_exception(self, request, exception):
        print('我是第二個中介軟體裡面的process_exception')

    def process_template_response(self, request, response):
        print('我是第二個中介軟體裡面的process_template_response')
        return response


class MyMdd2(MiddlewareMixin):
    def process_request(self, request):
        print('我是第三個中介軟體裡面的process_request方法')

    def process_response(self, request, response):
        print('我是第三個中介軟體裡面的process_response方法')
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print(view_func)
        print(view_args)
        print(view_kwargs)
        print('我是第三個中介軟體裡面的process_view方法')

    def process_exception(self, request, exception):
        print('我是第三個中介軟體裡面的process_exception')

    def process_template_response(self, request, response):
        print('我是第三個中介軟體裡面的process_template_response')
        return response

在 settings.py 中的配置

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',
    'mymiddleware.mdd.MyMdd',  # 配置上
    'mymiddleware.mdd.MyMdd1',  # 配置上
    'mymiddleware.mdd.MyMdd2',  # 配置上
]

需要掌握的方法

process_request

請求來的時候會依次執行 settings.py 配置檔案中註冊了的中介軟體裡的該方法

  • 如果沒有該方法則直接跳過,走下一個中介軟體
  • 如果該方法裡返回了 HttpResponse 物件,那麼會直接從當前中介軟體的 process_response 方法 從下往上依次執行返回,不會再接著往下執行
  • 執行順序:從上往下
  • 該方法可以實現對使用者身份的校驗,訪問頻率的限制,使用者許可權的校驗...

基於該特點就可以做訪問頻率限制

process_response

響應走的時候會依次執行 settings.py 配置檔案中註冊了的中介軟體裡的該方法(必須將 response 形參返回,因為這個 response 指代的就是返回給前端的資料)

  • 如果沒有該方法則直接跳過,走下一個中介軟體
  • 執行順序:從下往上
  • 該方法可以幫你實現快取機制(減緩伺服器、資料庫的壓力)

需要了解的方法

process_view

路由匹配成功 執行檢視函式之前 自動觸發(從上往下依次執行)

process_exception

當檢視函式報錯了,自動觸發(從下往上依次執行)

process_template_response

檢視函式返回的 HttpResponse 物件中包含了 render 屬性時會觸發,或者是表明一個物件時 TemplateResponse 物件或等價方法 的時候也會觸發(從下往上依次執行)

def index(request):
    print("我是 index 檢視函式")
    def render():
        return HttpRespone('使用者最終能夠看到的結果')  # ******
    obj = HttpResponse('index')
    obj.render = render  # 返回的 HttpResponse 物件中必須包含 render 屬性,才能觸發中介軟體裡定義的 process_template_response 方法
    return obj

強調:

在寫中介軟體的時候,只要形參中有 response ,就要記得將其返回,這個Response 是要給前端的資訊

csrf 中介軟體 跨站請求偽造

釣魚網站

原理:寫了一個一模一樣的網站,一個隱藏框,傳送往隱藏當做收錢方

問題:如何區分當前使用者朝我們網站傳送的請求頁面是不是我們本網站給的

防止思路

網站會給返回給使用者的 form 表單頁面 偷偷塞一個隨機字串

請求到來的時候,會先比對隨機字串是否一致,如果不一致,直接拒絕(403 FORBIDDEN)

解決方案

在頁面上放一個 隱藏的 input 框,value 裡面放的是一個字串,每次重新整理都會更新裡面的 value,這樣別人的網站就不知道;,這個 value 就無法偽造了

django 的實現 {% csrf_token %}

該隨機字串有以下特點:

  • 同一個瀏覽器每一次訪問都不一樣
  • 不同瀏覽器絕對不一樣

post請求提交資料通過 csrf 校驗

form 表單

form 表單傳送 post 請求的時候,需要你做的是寫一段程式碼 {% csrf_token %} 即可,不需要註釋 csrf 中介軟體了

ajax 傳送

三種方式(第三種可以用在前後端分離時)

  1. 先在頁面上寫 {% csrf_token %},利用標籤查詢,獲取到該 input 鍵值資訊,放到 data 裡

  2. ajax data 值 那裡直接寫 {{ csrf_token }}data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},

  3. 參考官方文件推薦,自定義 js 檔案,在要用到的頁面載入這個 js 指令碼,自動獲取並傳遞 csrf 校驗 *****

    • 你可以將下面的 js 程式碼 放到一個 js 檔案中
    // js 程式碼(一般放在 static 資料夾下)
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    
    var csrftoken = getCookie('csrftoken');
    
    
    function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    
    $.ajaxSetup({
        beforeSend: function (xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            }
        }
    });
    • 之後要用到的的地方 <script src="{% static 'setjs.js' %}"></script> 匯入就行
    • 這樣就不需要 在 html 中寫 {% csrf_token %} 或在 ajax 中寫 {{ csrf_token }}

csrf 裝飾器相關

其他中介軟體也可以效仿下面的方法來校驗或者取消校驗

兩個問題

當你網站全域性都需要校驗 csrf 的時候(未註釋掉 csrf 中介軟體時),有幾個不需要校驗該如何處理? @csrf_exempt

當你的網站全域性不校驗 csrf 的時候(註釋掉 csrf 中介軟體時),有幾個需要校驗該如何處理 ?@csrf_protect

未註釋掉 csrf 中介軟體時 單功能取消 csrf 校驗:csrf_exempt

FBV

from django.views.decorators.csrf import csrf_exempt

# 全域性開啟時,區域性禁用
@csrf_exempt
def index(request):
  pass

CBV

有兩種方式,不能針對單個方法,是針對全域性的

# CBV比較特殊,不能單獨加在某個方法上
# 只能加在類上或dispatch方法上
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt


# @method_decorator(csrf_exempt,name='dispatch')  # 第一種
class Csrf_Token(View):
  @method_decorator(csrf_exempt)  # 第二種
  def dispatch(self,request,*args,**kwargs):
    res = super().dispatch(request,*args,**kwargs)
    return res
  # @method_decorator(csrf_exempt)  # 這裡這麼寫不行!!!
  def get(self,request):
    pass
  def post(self,request):
    pass

註釋掉 csrf 中介軟體時 單功能開啟 csrf 校驗:csrf_protect

FBV

from django.views.decorators.csrf import csrf_protect


@csrf_protect
def lll(request):
    return HttpResponse('lll')

CBV 還要改改

有三種方式,既可以針對全域性的,也可以針對單個的

from django.views.decorators.csrf import csrf_protect

from django.views import View
from django.utils.decorators import method_decorator


# 第一種方式
# @method_decorator(csrf_protect,name='post')  # 有效的
class MyView(View):
    @method_decorator(csrf_protect)  # 第三種方式
    def dispatch(self, request, *args, **kwargs):
        res = super().dispatch(request, *args, **kwargs)
        return res

    def get(self, request):
        return HttpResponse('get')

    # 第二種方式
    # @method_decorator(csrf_protect)  # 有效的
    def post(self, request):
        return HttpResponse('post')

總結:csrf 裝飾器中只有 csrf_exempt 是特例,其他的裝飾器在給CBV 裝飾的時候 都可以有三種方式

Auth 模組

科普提示小點:

  • 一個方法的放回結果打印出來是 “字串” 最好 type 確認一下,可能是物件重寫了 __str__() 方法
  • django 後臺管理只有超級使用者才能進入
  • 用了 Auth 模組的方法 ,就最好都用 Auth 模組的方法
  • 修改密碼必須呼叫 .save() 儲存,否則無效

使用 django 自帶的 auth 表做登入功能

涉及到的 auth 相關方法

python3 manage.py createsuperuser  # 命令列下建立超級使用者(可以擁有登入 django admin 後臺管理的許可權)

# 查詢使用者是否存在
user_obj = auth.authenticate(username=username, password=password)  # 資料庫中的密碼是密文的(該方法不能只傳使用者名稱一個引數),返回值要麼是物件,要麼是 None

# 記錄使用者狀態
auth.login(request, user_obj)  # 登入,會自動存 session
# 優點:只要執行了這一句話,你就可以在後端任意位置通過 request.user 拿到當前登入的使用者物件(未登入會報錯,AnonymousUser 匿名使用者)

# 獲取使用者物件
request.user  # 使用者登入了直接獲取使用者物件,使用者沒登入獲取到 AnonymousUser 匿名使用者

# 判斷當前使用者是否登入,未登入(AnonymousUser)會返回 False,其他情況下返回 True
request.user.is_authenticated

# 驗證使用者密碼是否正確
is_right = request.user.check_password(old_password)  # 將獲取的使用者密碼,自動加密,然後去資料庫中對比(返回布林值)

# 修改密碼
request.user.set_password(new_password)  # 修改密碼
request.user.save()  # 需要儲存才能生效

# 登出使用者
auth.logout(request)  # 等價於 request.session.flush() (刪除了 session
表中記錄,瀏覽器 cookie)


# 登入驗證裝飾器
from django.contrib.auth.decorators import login_required

# @login_required  # 自動校驗當前使用者是否登入,如果沒有登入,(未傳引數的情況下)預設跳轉到 django 自帶的登入頁面(還是 404 ?)
# ------ 區域性配置
@login_required(login_url='/login/')
def set_password(request):
    pass

# ------ 全域性配置(不用在裡面寫配置了)
# 在 settings.py 中寫
LOGIN_URL = '/login/'


# 註冊使用者
from django.contrib.auth.models import User  # 這就是那張 auth 表
# 建立普通使用者
User.objects.create_user(username=username, password=password)
# 建立超級使用者
User.objects.create_superuser(username=username, password=password, email='[email protected]')  # 建立超級使用者必須傳郵箱
# 不能用 User.objects.create(username=username, password=password)  (這樣密碼沒有加密)

核心程式碼

app01/views.py

from django.shortcuts import render, HttpResponse
from django.contrib import auth


def xxx(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 取資料庫查詢當前使用者資料
        # models.User.objects.filter(username=username,password=password).first()
        user_obj = auth.authenticate(username=username, password=password)  # 必須要用 因為資料庫中的密碼欄位是密文的 而你獲取的使用者輸入的是明文
        print(user_obj)
        # print(user_obj)
        # print(user_obj.username)
        # print(user_obj.password)
        # 儲存使用者狀態
        # request.session['user'] = user_obj
        auth.login(request, user_obj)  # 將使用者狀態記錄到session中
        """只要執行了這一句話  你就可以在後端任意位置通過request.user獲取到當前使用者物件"""
    return render(request, 'xxx.html')


def yyy(request):
    print(request.user)  # 如果沒有執行auth.login那麼拿到的是匿名使用者
    print(request.user.is_authenticated)  # 判斷使用者是否登入  如果是你們使用者會返回False
    # print(request.user.username)
    # print(request.user.password)
    return HttpResponse('yyy')


from django.contrib.auth.decorators import login_required


# 修改使用者密碼
@login_required  # 自動校驗當前使用者是否登入  如果沒有登入 預設跳轉到 一個莫名其妙的登陸頁面
def set_password(request):
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        # 先判斷原密碼是否正確
        is_right = request.user.check_password(old_password)  # 將獲取的使用者密碼 自動加密 然後去資料庫中對比當前使用者的密碼是否一致
        if is_right:
            print(is_right)
            # 修改密碼
            request.user.set_password(new_password)
            request.user.save()  # 修改密碼的時候 一定要save儲存 否則無法生效
    return render(request, 'set_password.html')


@login_required
def logout(request):
    # request.session.flush()
    auth.logout(request)
    return HttpResponse("logout")


from django.contrib.auth.models import User


def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = User.objects.filter(username=username)
        if not user_obj:
            # User.objects.create(username =username,password=password)  # 建立使用者名稱的時候 千萬不要再使用create 了
            # User.objects.create_user(username =username,password=password)  # 建立普通使用者
            User.objects.create_superuser(username=username, password=password, email='[email protected]')  # 建立超級使用者
    return render(request, 'register.html')

自定義擴充套件 autor 表字段

前提:

settings.py 新增額外配置

# ... 其他配置
# 告訴 django 不再使用 auth 預設的表  而是使用你自定義的表
AUTH_USER_MODEL = 'app01.Userinfo'  # '應用名.模型表類名'
# ... 其他配置

兩種方式

app01/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser


# Create your models here.
# 第一種 使用一對一關係  不考慮


# 第二種方式   使用類的繼承
class Userinfo(AbstractUser):
    # 千萬不要跟原來表(AbstractUser)中的欄位有衝突
    phone = models.BigIntegerField()
    avatar = models.CharField(max_length=32)
    # 別忘了去 settings.py 裡配置

後續操作

執行資料庫遷移命令(python3 manage.py makemigrations、python3 manage.py migrate

這樣以後,所有的 auth 模組功能,全部都基於你建立的表,而不再使用 auth_user(不會再自動創那些表了)

效仿 django中介軟體配置 實現 功能插拔式效果

django 的中介軟體 其實就是一個類,一個個功能可以寫成類,註釋掉就不執行了

我們效仿中介軟體(後面要學的 restframework 的設計思想也是這樣的),做一個通知功能, 可以發微信通知、簡訊通知、右鍵通知

程式碼實現

重點配置部分(設計思想好好學學)

start.py 入口檔案

import notify

notify.send_all('國慶放假了 記住放八天哦')

notify/__init__.py 關鍵程式碼(結合了 importlib 動態匯入、反射 等知識點)

import settings
import importlib


def send_all(content):
    for path_str in settings.NOTIFY_LIST:  # 1.拿出一個個的字串   'notify.email.Email'
        module_path, class_name = path_str.rsplit('.', maxsplit=1)  # 2.從右邊開始 按照點切一個 ['notify.email', 'Email']
        module = importlib.import_module(module_path)  # from notity import msg/email/wechat
        cls = getattr(module, class_name)  # 利用反射 一切皆物件的思想 從檔案中獲取屬性或者方法 cls = 一個個的類名
        obj = cls()  # 類例項化生成物件
        obj.send(content)  # 物件調方法

settings.py 配置(可以在這裡開啟或關閉功能)

NOTIFY_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
    # 'notify.wechat.WeChat',  # 註釋掉了,這個功能就不執行了
    'notify.qq.QQ',
]

功能擴充套件部分

然後是各個功能的檔案(拆分成了各個檔案,搭配 settings.py 起到可插拔式效果),要想新增這種功能直接加個檔案實現這幾個程式碼即可

notify/email.py

class Email(object):
    def __init__(self):
        pass  # 傳送郵件需要的程式碼配置

    def send(self, content):
        print('郵件通知:%s' % content)

notify/msg.py

class Msg(object):
    def __init__(self):
        pass  # 傳送簡訊需要的程式碼配置

    def send(self, content):
        print('簡訊通知:%s' % content)

notify/qq.py

class QQ(object):
    def __init__(self):
        pass  # 傳送qq需要的程式碼準備

    def send(self, content):
        print('qq通知:%s' % content)

notify/wechat.py

class WeChat(object):
    def __init__(self):
        pass  # 傳送微信需要的程式碼配置

    def send(self, content):
        print('微信通知:%s' % content)
補充:pycharm 使用技巧

想知道當前跳進來的程式碼的位置,可以點選圖中的圖示,快速定位,可以讓你知道目錄結構(看看推測對不對)

相關推薦

Django-中介軟體-csrf擴充套件請求偽造攔截中介軟體-Django Auth模組使用-效仿 django 中介軟體配置實現功能效果-09

目錄 昨日補充:將自己寫的 login_auth 裝飾裝在 CBV 上 django 中介軟體 django 請求生命週期 ***** 預設中介軟體及其大概方法組成 中介軟體的執行順序

django中csrftoken跨站請求偽造的幾種方式

urn pre 並不是 coo 註釋 cli bsp ucc UNC 1.介紹 我們之前從前端給後端發送數據的時候,一直都是把setting中中間件裏的的csrftoken這條給註釋掉,其實這個主要起了一個對保護作用,以免惡意性數據的攻擊。但是這樣直接註釋掉並不是理智型的

第五篇 基於.net搭建熱web框架(攔截器---請求管道)

  好了,前邊我們把核心內容介紹完了,接下來要做的就是攔截使用者的請求,並把請求轉向沙箱內。   這裡我們準備通過實現一個HttpModule類來完成請求的攔截與轉發。新建一個HuberHttpModule類,並繼承IHttpModule。下面我們暫時只處理Application_BeginRequest事

php反射機制以及利用php反射機制實現擴充套件的外掛架構

反射是什麼? 它是指在PHP執行狀態中,擴充套件分析PHP程式,匯出或提取出關於類、方法、屬性、引數等的詳細資訊,包括註釋。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為反射API。 反射是操縱面向物件範型中元模型的API,其功能十分強大,可幫助我們構建複雜,可擴充

Django框架(十八)—— 中介軟體CSRF跨站請求偽造

中介軟體 一、什麼是中介軟體 中介軟體是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入與輸出 二、中介軟體的作用 如果你想修改請求,例如被傳送到view中的HttpRequest物件。 或者你想修改view返回的HttpRespon

Django-csrf跨站請求偽造

.com form表單提交 input 語法 渲染 serve o-c bsp es2017 方式一: 下列代碼插入ajax提交之$.ajaxSetup({ data: {csrfmiddlewaretoken: ‘{{ csrf_token }}‘ },

Django框架 之 基於Ajax中csrf跨站請求偽造

set lin cells ret body div nta java val ajax中csrf跨站請求偽造 方式一 1 2 3 $.ajaxSetup({ data: {csrfmiddlewaretoken: ‘{{ csrf_token

Django - CSRF(Cross-site request forgery 跨站請求偽造

目錄 一、CSRF(Cross-site request forgery 跨站請求偽造) 1-1 CSRF 攻擊原理 1-3 CSRF 攻擊防範方式(主流的三種策略)  1-3-1 驗證HTTP Referer 欄位 1-3-2 在請求地址中新增token並驗證 1

Django CSRF跨站請求偽造的禁用和使用

CSRF (Cross-site request forgery) Django後臺設定 全域性和區域性設定 # 全站使用 'django.middleware.csrf.CsrfViewMiddleware', # 區域性禁用 from django.view

Django框架(十八)—— 中間件、CSRF跨站請求偽造

exce meta messages options prot function port 信任 隨機 中間件 一、什麽是中間件 中間件是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全局上改變django的輸入與輸出 二、中間件的作用

django 淺談CSRF(Cross-site request forgery)跨站請求偽造 淺談CSRF(Cross-site request forgery)跨站請求偽造(寫的非常好)

淺談CSRF(Cross-site request forgery)跨站請求偽造(寫的非常好) 本文目錄 一 CSRF是什麼 二 CSRF攻擊原理 三 CSRF攻擊防範

django 淺談CSRF(Cross-site request forgery)跨站請求偽造

指向 其他 喜歡 發生 過期 hid 偽造 有一個 結束 一 CSRF是什麽 二 CSRF攻擊原理 三 CSRF攻擊防範 回到目錄 一 CSRF是什麽 CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Att

Django框架全面講解 -- 跨站請求偽造csrf

django為使用者實現防止跨站請求偽造的功能,通過中介軟體 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設定防跨站請求偽造功能有分為全域性和區域性。 全域性: 中介軟體 django.mi

django中介軟體直接返回請求

栗子: #coding=utf-8 import json import gevent from django.http import HttpResponse from sdsom.web.r

跨站點請求偽造CSRF

googl 不能 csr bsp 提取 返回 head afa 多種方式 CSRF(Cross Site Request Forgery)跨站點請求偽造:攻擊者誘使用戶在訪問 A 站點的時候點擊一個掩蓋了目的的鏈接,該鏈接能夠在 B 站點執行某個操作,從而在用戶不知情的情況

Python之路67-防CSRF跨站請求偽造

python目錄一、簡介二、應用三、官方示例一、簡介django為用戶實現防止跨站請求偽造的功能,通過中間件django.middleware.csrf.CsrfViewMiddleware來完成。而對於django中設置防跨站請求偽造功能有分為全局和局部。全局: 中間件 django.middlewa

跨站請求偽造CSRF

聊天 根據 oca 網站 mage 關閉瀏覽器 url 資金 action 轉載自:http://www.cnblogs.com/dolphinX/p/3403520.html CSRF是Cross Site Request Forgery的縮寫,乍一看和XSS差不多的樣子

Ajax csrf跨站請求偽造

css 請求 cli 跨站請求偽造 html val scrip .html jquery 方式一: ///僅限js代碼在HTML內//// $.ajaxSetup({ data: {csrfmiddlewaretoken: ‘{{ csrf_token }}‘

Ajax--參數,csrf跨站請求偽造,serialize(),上傳文件formdata

chrome true multi 編碼格式 token static error res files https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js. 一:參數,processData,conten

python之路--web--2--Django-6-跨站請求偽造

跨站 orm 使用 ade safe spa doctype n) java 三、 跨站請求偽造 一、簡介 django為用戶實現防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於djang