重定向login.html之后,URL,视图和模板如何知道他们正在处理的用户?

时间:2019-02-02 09:09:59

标签: django django-templates django-views

我正在使用django.auth中提供的login.html(默认是在templates / registration / login.html中吗?)这是login.html:

<!-- templates/registration/login.html -->
{% extends 'base.html' %}

{% block title %}Login{% endblock %}

{% block content %}
<h2>Login</h2>
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Login</button>
</form>
{% endblock %}

通知我没有通知任何信息(例如user.username)传递给下一个URL。我将LOGIN_REDIRECT_URL更改为应用程序中的网址 是:

app_name = 'ride'

urlpatterns = [
    path('', views.home, name='home'),
]

再次注意,URL中没有任何内容。然后它将转到views.py:

def home(request):
    return render(request,'ride/home.html')

只有一个请求对象可以传递给模板。 这是ride / home.html:

<!-- ride/templates/ride/home.html -->

{% extends 'ride/base.html' %}

{% block title %}HOmeeeeeeeeeee {% endblock %}

{% block content %}
{% if user.is_authenticated %}
  Hi {{ user.username }}
{% else %}
  <p>Welcome to CJ & XY's Ride Sharing Service!</p>
  <a href="{% url 'login' %}">login</a> |
  <a href="{% url 'login:signup' %}">signup</a>
{% endif %}
{% endblock %}

我在此模板中使用user.username,它显示完美。

所以我的问题是,此最终模板如何知道哪个用户已通过身份验证以及哪个用户的用户名?因为从一开始,我就没有传递任何用户信息,例如user.id或重定向,URL和视图时的信息。这太神奇了。

有人可以给我钥匙吗?谢谢!

1 个答案:

答案 0 :(得分:2)

这里有几个步骤。

当您log in时,Django将在会话中存储经过身份验证的用户的ID和对其进行身份验证的后端。会话基本上是存储在数据库中的值的字典,并通过存储在用户计算机上的cookie中的ID与特定用户相关联。 (请注意,cookie中的ID与用户的ID无关。)

在每个请求上,AuthenticationMiddleware都会检查此ID并从数据库中获取相关用户,使其可以作为request.user使用。 (实际上,这是偷懒完成的,因此,如果您不访问用户,则不会打入数据库。)

呈现模板时,auth context processor从请求中获取用户,并将其作为模板user用作变量;