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)