djangoにPUT,DELETEをサポートさせるスキーム
第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テストコードセグメントを以下のように設定する必要があります.
同時にdjangoはPUT/DELETE要求に対してPOST/GETのように辞書構造を持っていない.手動でrequestを処理する必要があります.body取得パラメータ:
put構造辞書コード断片は簡書に由来する:土を食べる男の上述の方法put設定header中のcsrf検証が通過し、コードロジックに入る
第2の方法
django-restframeworkモジュールの使用
同時にsettingsでpyでの設定
django-restframeworkスキームはテストされず、テスト後に更新がフィードバックされます.
3つ目の方法
フロントエンドヘッダにx-methodフィールドを構築し、ミドルウェアで検証し、フロントエンドでput、deleteメソッドを使用する場合はpost方式でデータをパッケージングするが、ミドルウェアによるmethodデータパッケージング転送を行う
util.pyでjson戻り値を設定する
まずjson戻り値を設定します
middleware設定解析方法
ミドルウェアを設定した後、ajaxを使用してコミットされたrequestヘッダにcsrf情報を入れる必要はなく、postコミット方式を使用して’HTTP_をカスタマイズするだけです.X_METHOD’フィールドはputまたはdeleteであり、djangoによるputおよびdeleteのサポートを実現
質問があれば、コメントやブログの個人ブログのアドレスにアクセスしてください.
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のサポートを実現
質問があれば、コメントやブログの個人ブログのアドレスにアクセスしてください.