私の質問がこれと非常に似ていて、問題を解決しようとする私のアプローチがその質問への回答に基づいている場合はお詫びしますが、これはもう少し複雑で、完全に理解していない Django の一部を対象とする可能性があると思います.
Django 1.5 で記述された CMS システムがあり、ブラウザのように Cookie を使用できない 2 つのデスクトップ アプリケーションからアクセスできるいくつかの API があります。
アプリケーションの 1 つによって API 呼び出しが行われるたびに (3 秒に 1 回)、新しいエントリがdjango_session
テーブルに追加されることに気付きました。この表とコードをよく見ると、特定の URL へのすべてのエントリに同じsession_data
値が与えられていますが、異なるsession_key
. これはおそらく、Django が、これらの呼び出しのいずれかが Cookie を使用しないアプリケーションから行われた場合request.session._session_key
、None
.
その結果、毎日数千のエントリがdjango_session
テーブルに作成され、毎日の cron を使用して単純に実行./manage clearsessions
しても、このテーブルからエントリが削除されないため、データベース全体が非常に大きくなり、明らかな利点はありません。set_expiry(1)
私もこれらのリクエストを試みましたが、./manage clearsessions
まだそれらを取り除かないことに注意してください。
Django でこの問題を解決するには、SessionMiddleware、AuthenticationMiddleware、MessageMiddleware を使用しているため、3 つの Django ミドルウェアをオーバーライドする必要がありました。
from django.contrib.sessions.middleware import SessionMiddleware
from django.contrib.auth.middleware import AuthenticationMiddleware
from django.contrib.messages.middleware import MessageMiddleware
class MySessionMiddleware(SessionMiddleware):
def process_request(self, request):
if ignore_these_requests(request):
return
super(MySessionMiddleware, self).process_request(request)
def process_response(self, request, response):
if ignore_these_requests(request):
return response
return super(MySessionMiddleware, self).process_response(request, response)
class MyAuthenticationMiddleware(AuthenticationMiddleware):
def process_request(self, request):
if ignore_these_requests(request):
return
super(MyAuthenticationMiddleware, self).process_request(request)
class MyMessageMiddleware(MessageMiddleware):
def process_request(self, request):
if ignore_these_requests(request):
return
super(MyMessageMiddleware, self).process_request(request)
def ignore_these_requests(request):
if request.POST and request.path.startswith('/api/url1/'):
return True
elif request.path.startswith('/api/url2/'):
return True
return False
上記は機能しますが、実際にはこれをより複雑にした可能性があり、リクエストごとに4つの追加チェックが行われるため、これは最も効率的なアプローチではないという考えを止めることはできません.
Djangoで上記を行うより良い方法はありますか? どんな提案でも大歓迎です。