这一节我们要完成登录登出与操作权限的设置。
前几节我们实现了添加、发布、修改、删除文章的功能,但现在这些功能是面向所有人开放的,也就是说任意进入这个网站的人都可以对文章进行操作,这显然是不安全的。因此这一节我们要完成登录登出与操作权限的设置,使这些功能只对登录用户开放,未登录用户只能使用详情页、归档等部分功能。
操作权限认证
我们要实现部分功能只对登录用户开放,也就是这几个功能的视图要受到保护。django为我们提供了很好的帮助类,其实就是利用了python中的decorators技术。 django中认证的装饰器位于模块django.contrib.auth.decorators中,名称叫login_required。
在mysite\blog\views.py里导入:
from django.contrib.auth.decorators import login_required
然后在需要视图保护的逻辑前加上装饰器@login_required
,比如添加文章功能要受到保护,那就是:
@login_required
def post_new(request):
... ...
此时,在admin页面退出登录,再回到主页面添加试试。``@login_required```装饰器检测到你尚未登陆的时候会重定向到login页面,由于还没有定义login的模板页面,所以这时候会是404错误页面。
用户登录
在mysite\mysite\urls.py里面导入:
import django.contrib.auth.views
添加url:
url(r'^accounts/login/$', django.contrib.auth.views.login, name='login'),
然后在mysite\templates\registration添加模板login.html:
{% extends "blog/base.html" %}
{% block content %}
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
{% endblock %}
最后在mysite\mysite\settings.py里面添加一行:
LOGIN_REDIRECT_URL = '/'
登陆后重定向首页面。
刷新试试,现在就可以正常使用login功能了。
改进显示
现在有一个问题就是未登录用户也可以看到登录用户才可以操作的添加文章等按钮。
把base.html的按钮区域代码改成:
<ul class="nav nav-pills">
<li class="active"><a href="{% url 'archives' %}"><span class="glyphicon glyphicon-briefcase"></span> 归档</a></li>
<li class="active"><a href="{% url 'about_me' %}"><span class="glyphicon glyphicon-user"></span> 关于</a></li>
{% if user.is_authenticated %}
<li class="active"><a href="{% url 'post_new' %}"><span class="glyphicon glyphicon-pencil"></span> 新建</a></li>
<li class="active"><a href="{% url 'post_draft_list' %}"><span class="glyphicon glyphicon-th-list"></span> 草稿箱</a></li>
{% else %}
<li class="active"><a href="{% url 'login' %}"><span class="glyphicon glyphicon-circle-arrow-up"></span>登录</a></li>
{% endif %}
</ul>
也就是登录时才可以看到新建、草稿箱和注销按钮,未登录时可以看到登录按钮。
然后在post_detail/html的按钮区域也修改如下:
<div class="date">
{% if post.published_date %}
{{ post.published_date|date:'M d, Y' }}
{% else %}
{% if user.is_authenticated %}
<a class="btn btn-default" href="{% url 'post_publish' pk=post.pk %}">Publish</a>
{% endif %}
{% endif %}
{% if user.is_authenticated %}
<a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-pencil"></span></a>
<a class="btn btn-default" href="{% url 'post_remove' pk=post.pk %}"><span class="glyphicon glyphicon-remove"></span></a>
{% endif %}
</div>
也就是登录时才可以看到发布、编辑、删除按钮。
用户登出
在base.html里,增加一个登录用户可见的注销按钮:
{% if user.is_authenticated %}
<li class="active"><a href="{% url 'post_new' %}"><span class="glyphicon glyphicon-pencil"></span> 新建</a></li>
<li class="active"><a href="{% url 'post_draft_list' %}"><span class="glyphicon glyphicon-th-list"></span> 草稿箱</a></li>
<li class="active"><a href="{% url 'logout' %}"><span class="glyphicon glyphicon-circle-arrow-down"></span> 注销</a></li>
{% else %}
<li class="active"><a href="{% url 'login' %}"><span class="glyphicon glyphicon-circle-arrow-up"></span>登录</a></li>
{% endif %}
然后在urls.py添加一个注销url:
url(r'^accounts/logout/$', django.contrib.auth.views.logout, name='logout', kwargs={'next_page': '/'}),
可以注销了。
这样我们就实现了对部分功能的权限设置和登录/登出功能。
更多资料请看官方网站:Using the Django authentication system
2016.10.26