Django リクエストボディの属性を変更する AttributeError: 属性を設定できない
2022-02-10 19:19:19
結論から言うと、request.bodyの値は以下のコードで変更可能です。
request._body = b'xxxxxxxxxx'
Django リクエストボディの属性を変更する AttributeError: 属性を設定できない
ここで、すべてのHttpリクエストをブロックし、後でhttpボディ(request.body)の値を変更するインターセプターを追加する要件がある。しかし、それを直接変更すると、次のような例外がスローされます "AttributeError: can't set attribute"
request.body = b'{"key": "value2"}'
Traceback (most recent call last):
File "D:\Python36\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "D:\Python36\lib\site-packages\django\utils\deprecation.py", line 90, in __call__
response = self.process_request(request)
File "C:\Users\Administrator\PycharmProjects\CeleryDemo\CeleryDemo\UserMiddleware.py", line 22, in process_request
request.body = b'{"key": "value2"}'
AttributeError: can't set attribute
class HttpRequest:
@property
def body(self):
if not hasattr(self, '_body'):
if self._read_started:
raise RawPostDataException("You cannot access body after reading from request's data stream")
# Limit the maximum request data size that will be handled in-memory.
if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and
if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and int(self.META.get('CONTENT_LENGTH') or 0) > settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
raise RequestDataTooBig('Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')
try:
self._body = self.read()
except IOError as e:
raise UnreadablePostError(*e.args) from e
self._stream = BytesIO(self._body)
return self._body
Django のソースコードを見る
request._body = b'{"key": "value2"}'
このコードでは、そのbodyプロパティが@propertyで変更されているので、読み取り専用のプロパティであることがわかります。ソースコードを見ればわかりますが、bodyプロパティは_bodyから取得しているので、_bodyを変更するだけでOKです。
request._body = b'{"key": "value2"}'
関連
-
PythonでクロールするときにAttributeError: 'NoneType' オブジェクトに 'find_all' 属性がないのを解決する
-
[Django] CSRF 検証に失敗しました。
-
Python pipのインストールと使用方法の詳細
-
ImportError: 名前のインポートができない imsave エラー
-
ImportError: Windows の Django でプロジェクトを作成するとき、django.core solution という名前のモジュールがない。
-
pythonのstring()モジュール
-
python error TypeError: 'range' object does not support item assignment, solution
-
plt.acorr() 関数の使用例 - ValueError: object too deep for desired array (オブジェクトが深すぎて、必要な配列が得られない)
-
python 1e-5とはどういう意味ですか?
-
pygalマッピング "AttributeError: 'NoneType' オブジェクトには 'decode' という属性がありません"
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ModuleNotFoundError: django という名前のモジュールがない 問題1解決済み
-
Python組み込み関数 - min関数とmax関数 - 詳細解説
-
Python pipを使ったpymysqlモジュールのインストール (Error: ImportError: No module named pymysql)
-
np.random.multivariate_normalメソッド解析
-
移動平均のPython実装
-
Python Djangoプロジェクトログクエリシステム
-
TypeError: Json オブジェクトは str, bytes または bytearray でなければならず、'TextIOWrapper' ではありません。
-
Python error TypeError: 'type' object is not subscriptable
-
ValueError: 解凍に0以上の値が必要
-
Python - pickleファイルの異なるPython環境への変換