19_5 让用户拥有自己的数据

  • 用户应该能输入其专有的数据
  • 创建一个系统,确定各项数据所属的用户,再限制对页面的访问,让用户只能使用自己的数据

1. 使用@login_required限制访问

Django提供了装饰器@login_required,只允许已登录的用户访问某些页面。装饰器(decorator)是放在函数定义前面的指令,Python在函数运行前根据它来修改函数代码的行为。

a.限制访问显示所有主题的页面

每个主题都归属于特定的用户,所以只允许已登录的用户请求显示所有主题的页面-在noways_app/views.py中添加如下代码:

views.py

19_5 让用户拥有自己的数据插图
19_5 让用户拥有自己的数据插图1

首先导入函数login_required()-->将login_required()作为装饰器应用于视图函数topics()-->在它前面加上符号@和login_required,让Python在运行topics()的代码之前运行login_required()的代码。

login_required()的代码检查用户是否已登陆,仅当用户已经登陆时,Django才运行topics()的代码。如果未登录就重定向到登陆页面

为了实现这种重定向,需要修改settings.py,让Django知道到那里去查找登录页面。在settings.py中:

settings.py

19_5 让用户拥有自己的数据插图2

现在如果未登录的用户请求装饰器@login_required保护的页面,Django将重定向到settings.py中的LOGIN_URL指定的URL

要测试这个设置,可注销并进入主页,再单击链接Topics,这将重定向到登陆页面,然后使用账户登录,并再次单击主页中的Topics链接,将看到显示所有主题的页面。

b.全面限制对项目“学习笔记”的访问

Django让你能够轻松地限制对页面的访问,但你必须确定要保护哪些页面。最好先确定项目的哪些页面不需要被保护,再限制对其他所有页面的访问。可轻松修改过于严格的访问限制,比起不限制对敏感页面的访问,这样做的风险更低。

在项目‘学习笔记’中,将不限制对主页和注册页面的访问,限制对其他所有页面的访问

在下面的noways_app/views.py中,对除index()外的每个视图都应用了装饰器@login_required:

views.py

19_5 让用户拥有自己的数据插图3

2. 将数据关联到用户

现在,需要将数据关联到提交它们的用户。只需将最高层的数据关联到用户,更低层的数据就会自动关联到用户。例如,在项目'学习笔记'中,应用程序的最高层数据是主题,而所有条目都与特定主题相关联。只要每个主题都归属于特定用户,就能确定数据库中每个条目的所有者。

接下来修改模型Topic,在其中添加一个关联到用户的外键。这样做之后,必须对数据库进行迁移。最后需要修改某些视图,使其只显示与当前登录的用户相关联的数据。

a.修改模型Topic

对models.py中的修改只涉及两行代码:

models.py

19_5 让用户拥有自己的数据插图4
19_5 让用户拥有自己的数据插图5

首先导入django.contrib.auth中的模型User,然后在Topic中添加字段owner,他建立到模型User的外键关系。用户被删除时所有与之相关的主题都将被删除

b.确定当前有哪些用户

迁移数据库时,Django将对数据库进行修改,使其能够存储主题和用户之间的关联。为执行迁移,Django需要知道该将各个既有主题关联到哪个用户。最简单的办法是,将既有主题都关联到同一个用户,如超级用户。为此需要知道用户ID。

  • 3.for user in User.objects.all():
    • print(user.username,user.id)
  1. from djangp.contrib.auth.models import User
    • 此处导入模型User
  2. User.objects.all()----》然后查看到目前为止创建了的用户
  3. 此处遍历用户列表并且打印每位用户的用户名和id

c.迁移数据库

知道用户ID后,就可以开始迁移数据库。python将会询问你是否要暂时将模型Topic关联到特定用户,还是在文件models.py中指定默认用户,选择第一个选项

版权声明:
作者:RHZ
链接:https://www.rhzhz.cn/?p=290
来源:RHZ | 用文字记录工作和学习生活
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
19_5 让用户拥有自己的数据
用户应该能输入其专有的数据创建一个系统,确定各项数据所属的用户,再限制对页面的访问,让用户只能使用自己的数据 1. 使用@login_required限制访问 D……
<<上一篇
下一篇>>