change get_user to use a protocol requiring a session (#522)

* change get_user to use a protocol requiring a session
define a "_HasSession" protocol, and update contrib.auth.get_user to use it
get_user only requires a session field, and idiomatic django testing frequently calls get_user with a TestClient

* run black

* use union for get_user instead of a protocol

* create tests for get_user typechecking

* properly import test client
This commit is contained in:
proxy
2020-11-07 03:38:45 -05:00
committed by GitHub
parent 1c4a7d25c7
commit aab8acf2ea
3 changed files with 21 additions and 7 deletions

View File

@@ -7,12 +7,11 @@ from django.core.handlers.wsgi import WSGIRequest
from django.db.models.base import Model from django.db.models.base import Model
from django.db.models.options import Options from django.db.models.options import Options
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.test.client import Client
from .signals import ( from .signals import user_logged_in as user_logged_in
user_logged_in as user_logged_in, from .signals import user_logged_out as user_logged_out
user_logged_out as user_logged_out, from .signals import user_login_failed as user_login_failed
user_login_failed as user_login_failed,
)
SESSION_KEY: str SESSION_KEY: str
BACKEND_SESSION_KEY: str BACKEND_SESSION_KEY: str
@@ -27,7 +26,7 @@ def login(
) -> None: ... ) -> None: ...
def logout(request: HttpRequest) -> None: ... def logout(request: HttpRequest) -> None: ...
def get_user_model() -> Type[Model]: ... def get_user_model() -> Type[Model]: ...
def get_user(request: HttpRequest) -> Union[AbstractBaseUser, AnonymousUser]: ... def get_user(request: Union[HttpRequest, Client]) -> Union[AbstractBaseUser, AnonymousUser]: ...
def get_permission_codename(action: str, opts: Options) -> str: ... def get_permission_codename(action: str, opts: Options) -> str: ...
def update_session_auth_hash(request: HttpRequest, user: AbstractBaseUser) -> None: ... def update_session_auth_hash(request: HttpRequest, user: AbstractBaseUser) -> None: ...

View File

@@ -8,7 +8,7 @@ from typing_extensions import Literal
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
_FormT = TypeVar('_FormT', bound=BaseForm) _FormT = TypeVar("_FormT", bound=BaseForm)
class AbstractFormMixin(ContextMixin): class AbstractFormMixin(ContextMixin):
initial: Dict[str, Any] = ... initial: Dict[str, Any] = ...

View File

@@ -0,0 +1,15 @@
- case: test_request_session
main: |
from django.contrib.auth import get_user
from django.contrib.sessions.middleware import SessionMiddleware
from django.http import HttpRequest
request = HttpRequest()
SessionMiddleware().process_request(request)
get_user(request)
- case: test_client_session
main: |
from django.contrib.auth import get_user
from django.test import Client
get_user(Client())