Я пытаюсь решить проблему, описанную здесь , но код, указанный в , этот ответ не работает для последней версии django == 2.2
Я попытался портировать этокод, но не с этим
settings.py:
MIDDLEWARE = ['polls.mymiddleware.CookieMiddleware',
mysite / polls / authbackend.py:
from django.contrib.auth.backends import RemoteUserBackend, UserModel
class Backend(RemoteUserBackend):
def authenticate(**credentials):
"""We could authenticate the token by checking with OpenAM
Server. We don't do that here, instead we trust the middleware to do it.
"""
try:
user = UserModel.objects.get(username=credentials['remote_user'])
print('__user exists')
except UserModel.DoesNotExist:
user = UserModel.objects.create(username=credentials['remote_user'])
print('__user not exists')
# Here is a good place to map roles to Django Group instances or other features.
return user
mysite / polls / mymiddleware.py:
from django.contrib.auth import authenticate, login, ImproperlyConfigured
class CookieMiddleware(object):
"""Authentication Middleware for OpenAM using a cookie with a token.
Backend will get user.
"""
def process_request(self, request):
if not hasattr(request, 'user'):
raise ImproperlyConfigured()
if "thecookiename" not in request.COOKIES:
return
# token = request.COOKIES["thecookiename"]
# REST request to OpenAM server for user attributes.
# token, attribute, role = identity_manager.get_attributes(token)
# user = authenticate(remote_user=attribute['uid'][0])
user = authenticate(remote_user=1) # simplified for test
request.user = user
login(request, user)
результат этого:
File "C:\Users\Administrator\Desktop\my_scripts\mysite\mysite\wsgi.py", line 16, in <module>
application = get_wsgi_application()
File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\core\wsgi.py", line 13, in get_wsgi_application
return WSGIHandler()
File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\core\handlers\wsgi.py", line 135, in __init__
self.load_middleware()
File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\core\handlers\base.py", line 37, in load_middleware
mw_instance = middleware(handler)
TypeError: object() takes no parameters
Обновление 1: исправлена ошибкавыше, спасибо @Daniel_Rossman за это:
необходимо установить промежуточное ПО после SessionMiddleware в настройках MIDDLEWARE.
, но теперь возникла новая проблема:
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\utils\deprecation.py", line 93, in __call__
response = self.process_request(request)
File "C:\Users\Administrator\Desktop\my_scripts\mysite\polls\mymiddleware.py", line 22, in process_request
login(request, user, backend='polls.mymiddleware.CookieMiddleware')
File "C:\Users\Administrator\Desktop\my_scripts\venv\lib\site-packages\django\contrib\auth\__init__.py", line 126, in login
request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
AttributeError: 'NoneType' object has no attribute '_meta'
[25/Apr/2019 12:40:07] "GET /admin/ HTTP/1.1" 500 64298