djangoにPUT,DELETEをサポートさせるスキーム

10587 ワード

第1のシナリオ
ajaxのtype方式を変更しheaderを設定し、putに対してデータ辞書を再構築します.
viewsのメソッドをクラスオブジェクトにカプセル化すると、djangoはpostやgetのようにデータをカプセル化することをサポートしていないことが分かった.ページ側でmethodメソッドを設定できないため、postmanとajaxでpycharmを開いてインタフェースのdebugテストを行ったところ、データをコミットした後、コードロジックに入っていないことが分かった.資料を調べたところ、djangoはputとdeleteメソッドをサポートしていることが分かった.クロスバウンド攻撃を防ぐため、Djangoのデフォルトでは、POST/PUT/DELETEのいくつかの操作についてcsrf tokenチェックが行われます.POSTはpostのパラメータに入れることができるが、DjangoはPUT/DELETEに対してHeaderを検査することによってcsrf tokenを検査するしかない.したがって、ajaxがフォームデータを送信する場合、ajaxヘッダファイルにcsrfテストコードセグメントを以下のように設定する必要があります.

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>testtitle>
head>
<body>
<form action="">
    {% csrf_token %}
       :<input type="text" name="username" id="username">
form>
<button type="button" id="btn">  button>
<span id="spa">span>
body>
html>
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.js">script>
<script>
    $('#btn').click(function () {
        var username = $('#username').val();
        $.ajaxSetup({
            beforeSend: function(xhr, settings) {
                if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });
        $.ajax({
            type:'PUT',
            url: '/test/',
            data: {
                'username':username
            },
            dataType: 'JSON',
            success: function (data) {
                $('#spa').text('  ')
            }
        })
    })
script>
from django.views.generic import View

class TestView(View):
    def get(self,request):
        return render(request,'test.html')
    def put(self,request):
        pass

同時にdjangoはPUT/DELETE要求に対してPOST/GETのように辞書構造を持っていない.手動でrequestを処理する必要があります.body取得パラメータ:
from django.http import QueryDict
    put = QueryDict(request.body)
    key = put.get('key')
    field = put.get('field')
    field_value = put.get('field-value')

put構造辞書コード断片は簡書に由来する:土を食べる男の上述の方法put設定header中のcsrf検証が通過し、コードロジックに入る
第2の方法
django-restframeworkモジュールの使用
pip install djangorestframework
pip install markdown       # Markdown support for the browsable API.
pip install django-filter  # Filtering support

同時にsettingsでpyでの設定
INSTALLED_APPS = (
    ...
    'rest_framework',
)

django-restframeworkスキームはテストされず、テスト後に更新がフィードバックされます.
3つ目の方法
フロントエンドヘッダにx-methodフィールドを構築し、ミドルウェアで検証し、フロントエンドでput、deleteメソッドを使用する場合はpost方式でデータをパッケージングするが、ミドルウェアによるmethodデータパッケージング転送を行う
util.pyでjson戻り値を設定する
まずjson戻り値を設定します
import json

from django.http.response import HttpResponse

def params_error(data):
    return HttpResponse(json.dumps({
        'status': 422,
        'data': data
    }))

middleware設定解析方法
import json

from django.utils.deprecation import MiddlewareMixin
from django.http.multipartparser import MultiPartParser

from .utils import params_error

class MethodConvertMiddleware(MiddlewareMixin):
    '''
       method  
    '''
    def process_request(self,request):
        method = request.method
        '''
              ,       
        '''
        #     ajax    
        if 'application/json' in request.META['CONTENT_TYPE']:
            try:
                data = json.loads(request.body.decode())
                files = None
            except Exception as e:
                return params_error({
                    'msg': '        '
                })
        #     form    
        elif 'multipart/form-data' in request.META['CONTENT_TYPE']:
            data,files = MultiPartParser(
                request,request.META,request.META.upload_handlers
            ).parse()
        #   get    
        elif:
            data = request.GET
            files = None
        #       headers         
        if 'HTTP_X_METHOD' in request.META:
            # ajax             
            method = request.META['HTTP_X_META'].upper()
            # request    method  
            setattr(request,'method',method)
        #         
        if files:
            setattr(request,'{method}_FILES'.format(method=method),files)
        # data     method 
        setattr(request,method,data)

ミドルウェアを設定した後、ajaxを使用してコミットされたrequestヘッダにcsrf情報を入れる必要はなく、postコミット方式を使用して’HTTP_をカスタマイズするだけです.X_METHOD’フィールドはputまたはdeleteであり、djangoによるputおよびdeleteのサポートを実現
質問があれば、コメントやブログの個人ブログのアドレスにアクセスしてください.