🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2300閲覧

Djangoアプリがデフォルトで取得するIPアドレスをミドルウェアでREMOTE_ADDRからHTTP_X_FORWARDED_FORに変更したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/01 12:29

編集2021/01/01 13:03

Heroku運用中のdjangoアプリが取得するIPアドレスのデフォルトをREMOTE_ADDRからHTTP_X_FORWARDED_FORに変更したいです。

そこで私はsettings.pyと同じ階層にmiddleware.pyを作成し、内容を以下の様にしました。

middleware.py

python

1from django.http import HttpResponse 2 3class RemoteAddrMiddleware(object): 4 def __init__(self, get_response): 5 self.get_response = get_response 6 7 def __call__(self, request): 8 return self.get_response(request) 9 10 def process_request(self, request): 11 if 'HTTP_X_FORWARDED_FOR' in request.META: 12 ip = request.META['HTTP_X_FORWARDED_FOR'].split(',')[0].strip() 13 request.META['REMOTE_ADDR'] = ip

settings.py

python

1MIDDLEWARE = [ 2 'django.middleware.security.SecurityMiddleware', 3 . 4 . 5 'myproject.middleware.RemoteAddrMiddleware', # 追記 6]

しかし、成功しましせんでした、どうすれば良いかわかる方がいましたらアドバイス頂けると嬉しいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

問題点: MIDDLEWARE MIDDLEWARE_CLASSES を混同されたような実装になってます。
(古い情報を元に実装されてないか、バージョンを確認して見て下さい)

  • まずは、logging 等を用いて、__call__process_request が呼ばれているか確認しましょう。
  • MiddlewareMixin の __call__ が process_request を呼び出します。

 現状の __call__ には、process_request 呼び出しがありません。
従来のミドルウェアであれば process_request を直接呼び出すので、
ミドルウェアの「実装方法」と「設定方法」が、別々のバージョンの情報に基づいてるように思います。

MIDDLEEARE に設定する場合

  • ミドルウェアのクラスはMiddlewareMixin を継承する
  • __call__ はオーバーライドしない

参考


リバースプロキシ用のミドルウェアについて、
古い情報ですが、以下の情報も確認してください。

HTTP_X_FORWARDED_FOR の参照は信頼できる場合でないと、
偽装できる的なことが書かれてます。

1.0 には django.middleware.http.SetRemoteAddrFromForwardedFor があったので、代替クラス等を調べてみてはどうでしょう。

削除される以前の実装は以下の通り、MIDDLEWARE_CLASSES で用られるものです。

SetRemoteAddrFromForwardedFor class

python

1class SetRemoteAddrFromForwardedFor(object): 2 """ 3 Middleware that sets REMOTE_ADDR based on HTTP_X_FORWARDED_FOR, if the 4 latter is set. This is useful if you're sitting behind a reverse proxy that 5 causes each request's REMOTE_ADDR to be set to 127.0.0.1. 6 Note that this does NOT validate HTTP_X_FORWARDED_FOR. If you're not behind 7 a reverse proxy that sets HTTP_X_FORWARDED_FOR automatically, do not use 8 this middleware. Anybody can spoof the value of HTTP_X_FORWARDED_FOR, and 9 because this sets REMOTE_ADDR based on HTTP_X_FORWARDED_FOR, that means 10 anybody can "fake" their IP address. Only use this when you can absolutely 11 trust the value of HTTP_X_FORWARDED_FOR. 12 """ 13 def process_request(self, request): 14 try: 15 real_ip = request.META['HTTP_X_FORWARDED_FOR'] 16 except KeyError: 17 return None 18 else: 19 # HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs. The 20 # client's IP will be the first one. 21 real_ip = real_ip.split(",")[0].strip() 22 request.META['REMOTE_ADDR'] = real_ip

投稿2021/01/04 11:09

teamikl

総合スコア8722

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問