下面主要记录下horizon登录和django框架的认证分析
运行服务器后,进入 http://0.0.0.0:8080后,首先进入setting.py中
根据url映射进入openstack_dashboard/urls.py
根据url匹配知 http:0.0.0.0:8080 交由openstack_dashboard/views.py.splash函数处理。查看views::splash函数
/openstack_dashboard/views.py
1 表单处理
在splash函数中,首先根据djanmgo session会话判断用户是否登录,如果登录,则转至用户主界面,否则就进入登录界面。此处分析登录流程。首先根据forms生成表单项,并将表单项传入splash.html模板中
进入 horizon/templates/splash.html
splash.html主要加载auth/_login.html,查看_login.html文件
进入horizon/templates/auth/_login.html
显示登录主界面后,对于用户输入用户名与密码,提交表单时,表单的action属性对应为url ‘login’,此时,django搜寻urls中 name=’login’的url,(ctrl+单击url,跳转至openstack_auth.urls)即对应为 openstack_auth.urls,也就是action为/auth/login.
_login.html表单继承自表单_modal_form.html模板,并重写了form_action属性
_modal_form.html:
这部分定义了action为form_action,methosd=”POST”,并定义了modal-body块用来填写用户名与密码。
_login.html文件重定义了action属性,modal-body内容。
django中{%url ‘login’%} 指代urls中name为’login’对应的地址并替代;解析出来的地址为0.0.0.0:8080/auth/login
参考地址
- https://docs.djangoproject.com/es/1.9/ref/templates/builtins/#url
- http://www.cnblogs.com/no13bus/p/3767521.html
- http://www.liujiangblog.com/course/django/89
2 表单url分级处理过程
当表单接受数据,并根据action=’auth/login’及django分级匹配:
django中include将截断匹配的url并将剩余的字符串发至包含的urls中再做处理。
进入/openstack_auth/urls.py
根据上图/login的地址对应openstack_auth.views:login函数处理。
3 表单内容处理
在本机安装部署horizon时,按照上一篇horizon二次开发部署,在 requirements.txt中会默认安装openstack_auth认证模块
进入/openstack_auth.views.py文件
整个login函数如下:
.........
from django.contrib.auth import views as django_auth_views
.........
# This is historic and is added back in to not break older versions of
# Horizon, fix to Horizon to remove this requirement was committed in
# Juno
from openstack_auth.forms import Login # noqa
from openstack_auth import user as auth_user
from openstack_auth import utils
@sensitive_post_parameters()
@csrf_protect
@never_cache
def login(request, template_name=None, extra_context=None, **kwargs):
"""Logs a user in using the :class:`~openstack_auth.forms.Login` form."""
if not request.is_ajax():
# If the u