1、‘未经授权的访问’如何控制?
<form class="form-signin" action="{% url 'account:login' %}" method="post">
{% csrf_token %}
{% comment %}<label for="inputEmail" class="sr-only">Email address</label>
<input type="email" id="inputEmail" class="form-control" placeholder="Email" required autofocus>
<label for="inputPassword" class="sr-only">Password</label>
<input type="password" id="inputPassword" class="form-control" placeholder="Password" required>{% endcomment %}
{{ form.non_field_errors }}
{% for field in form %}
{{ field }}
{{ field.errors }}
{% endfor %}
<input type="hidden" name="next" value="{{ redirect_to }}">
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
<div class="checkbox">
{% comment %}<a class="pull-right">Need help?</a>{% endcomment %}
<label>
<input type="checkbox" value="remember-me" name="remember"> Stay signed in
</label>
</div>
{% load oauth_tags %}
{% load_oauth_applications request%}
</form>
在模板定义了一个表单form,实参action指定发送到视图的login. 我们则使用 {% csrf_token%} 来防止攻击者利用表单来获得对服务器未经授权的访问。攻击称为跨站请求伪造。
2、如何让用户拥有自己的数据
django提供了装饰器 @login_required 只允许已登录用户访问某些页面。装饰器需要放到函数前面来修饰。
如下面限制只能是已登录用户查看所有主题。需要从django里导入如下第4行。
让用户有自己的数据,首先就是在新建的数据中有当前的用户信息。
owner = models.ForeignKey(User, on_delete=models.CASCADE)
想让用户只能访问自己的数据就在查询时过滤数据,数据=当前用户。
topics = Topic.objects.filter(owner=request.user).order_by('date_added')
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Topic(models.Model):
""" user learning topic"""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE) #数据中关联用户信息
def __str__(self):
"""return string of model"""
return self.text
@login_required
def topics(request):
"""显示所有主题"""
# topics = Topic.objects.order_by('date_added')
topics = Topic.objects.filter(owner=request.user).order_by('date_added') #展示的主题是当前用户的数据
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
保护非当前用户不准修改数据。
if topic.owner != request.user:
@login_required
def topic(request, topic_id):
"""显示单个主题所有内容"""
topic = Topic.objects.get(id=topic_id)
#确认请求的主题是当前用户
if topic.owner != request.user: #保护数据,操作用户!=数据拥有者,报错404
raise Http404
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)