私はdjango 1.10を使用してウェブサイトを構築しています。私がログインしていないユーザーのためのページビュー数を制限するためのミドルウェアクラスを書かれている。私は別のアプリケーションのpagerestrict "django - このカスタムミドルウェアが動作しないのはなぜですか?
settings.py [関連エントリ]に、この機能を実装し
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'pagerestrict.apps.PagerestrictConfig',
# ...
]
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',
'pagerestrict.middleware.CheckPageAccessMiddleware',
]
ミドルウェアコード(middleware.py):
from django.http import HttpResponseRedirect
from decouple import config
class CheckPageAccessMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_request(self, request):
if not request.user.is_authenticated():
current_page_url = request.path_info.lstrip('/')
ignore_list = config('PAGE_RESTRICT_PAGE_IGNORES', cast=lambda v: [s.strip() for s in v.split(',')])
#if not current_page_url or not any(current_page_url != url for url in ignore_list):
if not current_page_url in ignore_list:
# first things first ...
if not has_attr(request, 'pages_visited'):
request.pages_visited = set()
if not has_attr(request, 'page_count'):
request.page_count = 0
if current_page_url not in request.pages_visited:
request.pages_visited.add(current_page_url)
request.page_count += 1
if request.page_count > config('PAGE_RESTRICT_PAGE_LIMIT'):
return HttpResponseRedirect(config('PAGE_RESTRICT_REDIRECT_URL'))
私は何回か私のホームページに行くと、ブラウザをリフレッシュすることでこれをテストした
- コードがトリガーされたことはありませんでした。私は何が欠けていますか?
感謝を。しかし、問題は解決されません - ** N **回以上のページ(http:// localhost:8000/foobar)を更新することができ、ミドルウェアは起動していないようです。 print文を 'process_request()'に置いても、コンソール、ブラウザ、またはdjangoのログファイルには何も印字されないので、暗闇の中を完全に飛んでいます。 –
@HomunculusReticulli私はまだ間違っている可能性のある明白な何も表示されません。サーバーを再起動しましたか? Djangoは正しい設定ファイルを使用していますか? – knbk
はいサーバーを再起動します。とにかくミドルウェアクラスのprintステートメントをコンソールに(またはその場所のどこにでも)印刷するようにしますか? - 少なくとも、私は何が起こっているのか把握する機会があります。現時点では、私はそれが全く呼び出されていないと思う。 –