关于“Python”的核心知识点整理大全58

目录

19.2.3 注销

1. 注销URL

urls.py

2. 视图函数logout_view()

views.py

3. 链接到注销视图

base.html

19.2.4 注册页面

1. 注册页面的URL模式

urls.py

2. 视图函数register()

views.py

3. 注册模板

register.html

4. 链接到注册页面

base.html

注意

19.3 让用户拥有自己的数据

19.3.1 使用@login_required 限制访问

1. 限制对topics页面的访问

views.py

settings.py

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

views.py

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!


19.2.3 注销

现在需要提供一个让用户注销的途径。我们不创建用于注销的页面,而让用户只需单击一个 链接就能注销并返回到主页。为此,我们将为注销链接定义一个URL模式,编写一个视图函数, 并在base.html中添加一个注销链接。

1. 注销URL

下面的代码为注销定义了URL模式,该模式与URL http://locallwst:8000/users/logout/匹配。修 改后的users/urls.py如下:

urls.py
--snip--
urlpatterns = [# 登录页面--snip--# 注销url(r'^logout/$', views.logout_view, name='logout'),
] 

这个URL模式将请求发送给函数logout_view()。这样给这个函数命名,旨在将其与我们将在 其中调用的函数logout()区分开来(请确保你修改的是users/urls.py,而不是learning_log/ urls.py)

2. 视图函数logout_view()

函数logout_view()很简单:只是导入Django函数logout(),并调用它,再重定向到主页。请 打开users/views.py,并输入下面的代码:

views.py
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse 
1 from django.contrib.auth import logout
def logout_view(request):"""注销用户"""
2 logout(request)
3 return HttpResponseRedirect(reverse('learning_logs:index'))

我们从django.contrib.auth中导入了函数logout()(见1)。在2处,我们调用了函数logout(), 它要求将request对象作为实参。然后,我们重定向到主页(见3)。

3. 链接到注销视图

现在我们需要添加一个注销链接。我们在base.html中添加这种链接,让每个页面都包含它; 我们将它放在标签{% if user.is_authenticated %}中,使得仅当用户登录后才能看到它:

base.html
--snip—{% if user.is_authenticated %}Hello, {{ user.username }}.<a href="{% url 'users:logout' %}">log out</a>{% else %}<a href="{% url 'users:login' %}">log in</a>{% endif %}
--snip-- 

图19-5显示了用户登录后看到的主页。这里的重点是创建能够正确工作的网站,因此几乎没 有设置任何样式。确定所需的功能都能正确运行后,我们将设置这个网站的样式,使其看起来更 专业。

19.2.4 注册页面

下面来创建一个让新用户能够注册的页面。我们将使用Django提供的表单UserCreationForm, 但编写自己的视图函数和模板

1. 注册页面的URL模式

下面的代码定义了注册页面的URL模式,它也包含在users/urls.py中:

urls.py
--snip--
urlpatterns = [# 登录页面--snip--# 注册页面url(r'^register/$', views.register, name='register'),
] 

这个模式与URL http://localhost:8000/users/register/匹配,并将请求发送给我们即将编写的函 数register()。

2. 视图函数register()

在注册页面首次被请求时,视图函数register()需要显示一个空的注册表单,并在用户提交 填写好的注册表单时对其进行处理。如果注册成功,这个函数还需让用户自动登录。请在 users/views.py中添加如下代码:

views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.forms import UserCreationForm
def logout_view(request):
--snip--
def register(request):"""注册新用户"""if request.method != 'POST':# 显示空的注册表单
1 form = UserCreationForm()else:# 处理填写好的表单
2 form = UserCreationForm(data=request.POST)
3 if form.is_valid():
4 new_user = form.save()# 让用户自动登录,再重定向到主页
5 authenticated_user = authenticate(username=new_user.username,password=request.POST['password1'])
6 login(request, authenticated_user)
7 return HttpResponseRedirect(reverse('learning_logs:index'))context = {'form': form}return render(request, 'users/register.html', context)

我们首先导入了函数render(),然后导入了函数login()和authenticate(),以便在用户正确 地填写了注册信息时让其自动登录。我们还导入了默认表单UserCreationForm。在函数register() 中,我们检查要响应的是否是POST请求。如果不是,就创建一个UserCreationForm实例,且不给 它提供任何初始数据(见1)。

如果响应的是POST请求,我们就根据提交的数据创建一个UserCreationForm实例(见2), 并检查这些数据是否有效:就这里而言,是用户名未包含非法字符,输入的两个密码相同,以及 用户没有试图做恶意的事情。

如果提交的数据有效,我们就调用表单的方法save(),将用户名和密码的散列值保存到数据 库中(见4)。方法save()返回新创建的用户对象,我们将其存储在new_user中。

保存用户的信息后,我们让用户自动登录,这包含两个步骤。首先,我们调用authenticate(), 并将实参new_user.username和密码传递给它(见5)。用户注册时,被要求输入密码两次;由于 表单是有效的,我们知道输入的这两个密码是相同的,因此可以使用其中任何一个。在这里,我 们从表单的POST数据中获取与键'password1'相关联的值。如果用户名和密码无误,方法 authenticate()将返回一个通过了身份验证的用户对象,而我们将其存储在authenticated_user 中。接下来,我们调用函数login(),并将对象request和authenticated_user传递给它(见6), 这将为新用户创建有效的会话。最后,我们将用户重定向到主页(见7),其页眉中显示了一条 个性化的问候语,让用户知道注册成功了。

3. 注册模板

注册页面的模板与登录页面的模板类似,请务必将其保存到login.html所在的目录中:

register.html
{% extends "learning_logs/base.html" %}
{% block content %}<form method="post" action="{% url 'users:register' %}">{% csrf_token %}{{ form.as_p }}<button name="submit">register</button><input type="hidden" name="next" value="{% url 'learning_logs:index' %}" /></form>
{% endblock content %}

这里也使用了方法as_p,让Django在表单中正确地显示所有的字段,包括错误消息——如果 用户没有正确地填写表单。

4. 链接到注册页面

接下来,我们添加这样的代码,即在用户没有登录时显示到注册页面的链接:

base.html
--snip--{% if user.is_authenticated %}Hello, {{ user.username }}.<a href="{% url 'users:logout' %}">log out</a>{% else %}<a href="{% url 'users:register' %}">register</a> -<a href="{% url 'users:login' %}">log in</a>{% endif %}
--snip-- 

现在,已登录的用户看到的是个性化的问候语和注销链接,而未登录的用户看到的是注册链 接和登录链接。请尝试使用注册页面创建几个用户名各不相同的用户账户。 在下一节,我们将对一些页面进行限制,仅让已登录的用户访问它们,我们还将确保每个主 题都属于特定用户。


注意

这里的注册系统允许用户创建任意数量的账户。有些系统要求用户确认其身份:发送一 封确认邮件,用户回复后其账户才生效。通过这样做,系统生成的垃圾账户将比这里使 用的简单系统少。然而,学习创建应用程序时,完全可以像这里所做的那样,使用简单 的用户注册系统。


19.3 让用户拥有自己的数据

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

在本节中,我们将修改模型Topic,让每个主题都归属于特定用户。这也将影响条目,因为 每个条目都属于特定的主题。我们先来限制对一些页面的访问。

19.3.1 使用@login_required 限制访问

Django提供了装饰器@login_required,让你能够轻松地实现这样的目标:对于某些页面,只 允许已登录的用户访问它们。装饰器(decorator)是放在函数定义前面的指令,Python在函数运行前,根据它来修改函数代码的行为。下面来看一个示例。

1. 限制对topics页面的访问

每个主题都归特定用户所有,因此应只允许已登录的用户请求topics页面。为此,在 learning_logs/views.py中添加如下代码:

views.py
--snip--
from django.core.urlresolvers import reverse
from django.contrib.auth.decorators import login_required
from .models import Topic, Entry
--snip--
@login_required
def topics(request):"""显示所有的主题"""--snip-- 

我们首先导入了函数login_required()。我们将login_required()作为装饰器用于视图函数 topics()——在它前面加上符号@和login_required,让Python在运行topics()的代码前先运行 login_required()的代码。 login_required()的代码检查用户是否已登录,仅当用户已登录时,Django才运行topics() 的代码。如果用户未登录,就重定向到登录页面。 为实现这种重定向,我们需要修改settings.py,让Django知道到哪里去查找登录页面。请在 settings.py末尾添加如下代码:

settings.py
"""
项目learning_log的Django设置
--snip--
# 我的设置
LOGIN_URL = '/users/login/' 

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

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

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

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

在项目“学习笔记”中,我们将不限制对主页、注册页面和注销页面的访问,并限制对其他 所有页面的访问。

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

views.py
--snip--
@login_required
def topics(request):--snip--
@login_required
def topic(request, topic_id):--snip--
@login_required
def new_topic(request):--snip--
@login_required
def new_entry(request, topic_id):--snip--
@login_required
def edit_entry(request, entry_id):--snip-- 

如果你在未登录的情况下尝试访问这些页面,将被重定向到登录页面。另外,你还不能单击 到new_topic等页面的链接。但如果你输入URL http://localhost:8000/new_topic/,将重定向到登录 页面。对于所有与私有用户数据相关的URL,都应限制对它们的访问。



关于“Python”的核心知识点整理大全25-CSDN博客

关于“Python”的核心知识点整理大全12-CSDN博客

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/592700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.2作业

温湿度数据通过中断处理显示到数码管中 main.c #include "spi.h"#include"si7006.h"int main(){int i0,j0,m0,n0;int num[10] {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6};SPI_init();unsigned short hum;short tem;//进行si7006的初始化si700…

计算机网络 VLAN

路由器将多个局域网连接起来&#xff0c;而交换机将一个局域网里的设备连接起来。 路由器的端口分配局域网的网段&#xff08;子网网段&#xff09;&#xff0c;局域网的内部设备的ip都在这个网段里&#xff0c;再由交换机将数据派发到目的设备&#xff0c;交换机是按照MAC地址…

CMake入门教程【核心篇】编译类型Debug、Release、MinSizeRel、RelWithDebInfo

文章目录 1.说明1.1 Debug 配置1.2 Release 配置1.3 MinSizeRel 配置1.4 RelWithDebInfo 配置 2.提供的编译类型3.示例结论 1.说明 CMake作为一款强大的构建系统&#xff0c;提供了多种编译配置选项。这些配置影响编译过程中的优化级别和调试信息的包含情况。以下是CMake提供的…

技术人员的升级之路:六西格玛黑带培训的力量

在我从一名刚接触质量管理的新人成长为六西格玛黑带的过程中&#xff0c;有一个观念一直伴随着我&#xff0c;那就是改善和卓越不是一个项目&#xff0c;而是一场永无止境的旅程&#xff01; 退一步说&#xff0c;六西格玛管理带来的改变对一个组织有多么深刻呢&#xff1f;它…

10 个值得收藏的顶级手机数据恢复软件【2024年最新】

手机数据恢复&#xff0c;不要担心&#xff0c;今天就给大家分享10款数据恢复软件&#xff01; 现代人的手机中存储了许多重要数据&#xff0c;如照片、视频、消息、联系人等文件&#xff0c;如果手机损坏或数据丢失&#xff0c;这是一件非常烦恼的事情。此时&#xff0c;一款好…

教育CRM系统选型必看,CRM的这四大功能对教育企业来说必不可少

教育行业是出了名的“卷”&#xff0c;对教育企业来说&#xff0c;学生和家长也属于客户&#xff0c;培育与学生、家长的关系是成功的关键。然而&#xff0c;教育机构对CRM管理系统的需求复杂多变&#xff0c;很难找到满意的解决方案。与传统的CRM系统不同&#xff0c;教育机构…

信号可达1公里以上,Wi-Fi HaLow如何做到比传统Wi-Fi强?

随着物联网&#xff08;IoT&#xff09;技术的蓬勃发展&#xff0c;对于能够支持大量设备、长距离传输且功耗低的无线通信技术的需求日益增长。Wi-Fi HaLow&#xff08;基于IEEE 802.11ah标准&#xff09;是专为物联网需求量身定制的突破性无线解决方案。本文将深入探讨Wi-Fi H…

Zookeeper之Java客户端实战

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。第三方的Java客户端API&#xff0c;比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…

Linux系统文件IO

Linux系统文件IO 每个系统都有自己的专属函数&#xff0c;我们习惯称其为系统函数。系统函数并不是内核函数&#xff0c;因为内核函数是不允许用户使用的&#xff0c;系统函数就充当了二者之间的桥梁&#xff0c;这样用户就可以间接的完成某些内核操作了。 在前面介绍了文件描…

【5G PHY】5G 物理层加速卡介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

vue3项目创建

安装node.js vue --version &#xff08;4.5.0以上&#xff09; npm install -g vue/cli vue create 项目名称 npm run dev 启动 npm run build 打包 ———————— vite 创建工程 npm create vuelatest npm i npm run dev 启动 npm run build 打包 项目结构…

CloudQuery 的过去、现在和未来

CloudQuery (后续简称「CQ」)这个产品从设计/研发到现在&#xff0c;一晃已经 5 年多时间了&#xff0c;在不断的完善中&#xff0c;也积累了不少的社区/企业用户&#xff0c;我意识到&#xff0c;CQ 已经从一个 Idea 变成了公众软件&#xff0c;开始有它的使命、责任和价值主张…

Pycharm恢复默认设置

window 系统 找到下方目录-->删除. 再重新打开Pycharm C:\Users\Administrator\.PyCharm2023.3 你的不一定和我名称一样 只要是.PyCharm*因为版本不同后缀可能不一样 mac 系统 请根据需要删除下方目录 # Configuration rm -rf ~/Library/Preferences/PyCharm* # Caches …

算法分析与设计 第二次课外作业

算法分析与设计 第二次课外作业 文章目录 算法分析与设计 第二次课外作业一. 单选题&#xff08;共4题&#xff0c;40分&#xff09;二. 填空题&#xff08;共5题&#xff0c;50分&#xff09;三. 判断题&#xff08;共1题&#xff0c;10分&#xff09; 一. 单选题&#xff08;…

「Verilog学习笔记」异步复位同步释放

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule ali16 (input clk,input rst_n,input d,output reg dout );//*************code***********//reg rst0, rst1 ; always (posedge clk or negedge…

【QT搭建】搭建可以生成手机APP的环境

一.问题分析 1.在原来的QT版本上安装Android(不推荐) 此方法暂时未实践成功,记录调试过程,可跳过 如果原来安装过QT桌面级PC软件的,可能没有配置JDK和SDK就会在QT选项的设备栏目种看到报错的提示。 并且Kits的选项里面没有Android,所以解决的问题是,缺少Kit套件Andro…

drf知识-09

自定义频率类 # throttling 频率限制 # 简单方案 from rest_framework.throttling import SimpleRateThrottle class CommonThrottle(SimpleRateThrottle):rate 3/mdef get_cache_key(self, request, view):ip request.META.get(REMOTE_ADDR)return ip# 复杂方案---》通用方案…

【LeetCode-剑指offer】--15.找到字符串中所有字母异位词

15.找到字符串中所有字母异位词 方法&#xff1a;滑动窗口 class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> ans new ArrayList<>();int m s.length(),n p.length();if(n > m){return ans;}int[] cnt1 new i…

YoloV7改进策略:AAAI 2024 最新的轴向注意力|即插即用,改进首选|全网首发,包含数据集和代码,开箱即用!

摘要 https://arxiv.org/pdf/2312.08866.pdf 本文提出了一种名为Multi-scale Cross-axis Attention(MCA)的方法,用于解决医学图像分割中的多尺度信息和长距离依赖性问题。该方法基于高效轴向注意力,通过计算两个平行轴向注意力之间的双向交叉注意力,更好地捕获全局信息。…

无人机集群反制与对抗技术探讨

源自&#xff1a;指挥与控制学报 作者&#xff1a;任 智 张 栋 唐 硕 王孟阳 李智军 “人工智能技术与咨询” 发布 摘 要 无人机集群系统是现代信息化战争体系对抗中重要的新质作战力量, 是未来网络化、智能化作战的关键发展方向. 随着无人集群系统装备实战化技术的…