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

news2024/11/16 18:02:57

目录

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.coloradmin.cn/o/1352753.html

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

相关文章

[Unity]实时阴影技术方案总结

一&#xff0c;Planar Shadow 原理就是将模型压扁之后绘制在需要接受阴影的物体上&#xff0c;这种方式十分高效&#xff0c;消耗很低。具体实现过程参考Unity Shader - Planar Shadow - 平面阴影。具按照自己的理解&#xff0c;其实就是根据光照方向计算片元在接受阴影的平面…

【备忘】今天写一下如何买免费证书

使用场景 使用微信支付宝支付转账时小游戏小程序接口开发时其它情况 开发中不可避免的会接触https&#xff0c;有的公司有运维去做这个事&#xff0c;有的是老板自己会搞https证书&#xff0c;咱多了解一项技术也是好事。 如何买证书 登录阿里云控制台&#xff0c;搜索ssl证…

Jenkins部署项目

一.安装jenkins 1.1进入jenkins官网下载jenkins war包&#xff0c;上传到服务器/usr/local目录。 1.2执行启动jenkins命令&#xff0c;&#xff08;注意jenkins版本需要的jdk版本&#xff09; /usr/local/java11/bin/java -Djava.awt.headlesstrue -jar /usr/local/jenkins.wa…

大文件快速传输解决办法汇总

在数据传输普及的当今时代&#xff0c;文件体量也在不断的突破它”大“的上线&#xff0c;很多企业也在面临着这类大文件快速传输的烦恼&#xff0c;而且这里面的“大”可不是一般意义的几M,几G的文件&#xff0c;它有可能上T级甚至是PB级别、TB级别的大文件&#xff0c;或者是…

使用 Docker 部署 SSCMS 内容管理系统

1&#xff09;SSCMS 介绍 官网&#xff1a;https://sscms.com/ GitHub&#xff1a;https://github.com/siteserver/cms SSCMS 基于 .NET Core&#xff0c;能够以最低的成本、最少的人力投入在最短的时间内架设一个功能齐全、性能优异、规模庞大并易于维护的网站平台。 2&#…

​如何把图片里背景的路人P掉?教你四种方法消除路人

在日常生活中&#xff0c;我们经常会遇到需要将图片中背景的路人P掉的情况。有时候&#xff0c;这些路人会破坏图片的整体美感&#xff0c;或者我们只想要图片中的某些元素&#xff0c;而路人的出现会分散注意力。那么&#xff0c;如何才能有效地将图片中的背景路人P掉呢&#…

2023我的编程之旅-地质人的山和水

引言 大家好&#xff0c;我是搞地质的。外行人有的说我们游山玩水&#xff0c;有的说我们灰头土脸&#xff0c;也有的说我们不是科学。 而我说&#xff0c;这是一门穷极一生青春&#xff0c;值得奉献的行业。这是一门贴近民生&#xff0c;又拥抱自然的学科。他的真理性在于探…

记事本在手机桌面上怎么找?手机里的记事本怎么找?

在日常生活、工作和学习中&#xff0c;我们时常需要随手记录一些重要的事项、灵感闪现的瞬间或者是待办的任务。比如&#xff0c;在超市购物前&#xff0c;列出购物清单&#xff1b;在开会时&#xff0c;记下重要的讨论点&#xff1b;在学习时&#xff0c;捕捉那一刹那的灵感。…

蓝桥圣诞树(C++)

问题描述 输入样例&#xff1a; 1 3 101 1 2 2 3 输出样例&#xff1a; YES 思路&#xff1a; 这道题还是比较好想的&#xff0c;因为它构造的二叉树是用边连接起来的&#xff0c;不是像之前一样从上到下从左到右按编号构造的&#xff0c;所以可以用邻接表来存每个点还有边&am…

Docker实战02|Namespace

在上一文《Docker实战01&#xff5c;容器与开发语言》中主要介绍了Docker的基本概念与Docker安装、Go语言安装等实战技巧。 本文继续针对Namespace技术展开讲解并利用Go语言进行实践。 本系列所有代码均已经开源。关公众号回复「Go语言实现Docker」即可获得。 目录 2.1.2 U…

如何评估 RAG 应用的质量?最典型的方法论和评估工具都在这里了

随着 LLM(Large Language Model)的应用逐渐普及&#xff0c;人们对 RAG(Retrieval Augmented Generation)场景的关注也越来越多。然而&#xff0c;如何定量评估 RAG 应用的质量一直以来都是一个前沿课题。 很显然&#xff0c;简单的几个例子的对比&#xff0c;并不能准确地衡量…

关于对物料计量单位的维护

1、业务背景 一般情况下&#xff0c;在设计产品时&#xff0c;明确了物料的计量单位&#xff0c;并在维护物料主数据时&#xff0c;维护完整单位数据。 但也有例外情况&#xff0c;例如当设计产品时&#xff0c;不明确未来的打包方式&#xff0c;不明确要维护哪些种计量单位&…

JVM虚拟机:各种JVM报错总结

错误 java.lang.StackOverflowError java.lang.OutOfMemoryError:java heap space java.lang.OutOfMemoryError:GC overhead limit exceeded java.lang.OutOfMemoryError:Direct buffer memory java.lang.OutOfMemoryError:unable to create new native thread java.lang.OutOf…

霹雳吧啦Wz《pytorch图像分类》-p2AlexNet网络

《pytorch图像分类》p2AlexNet网络基础及代码 一、零碎知识点1.过拟合2.使用dropout后的正向传播3.正则化regularization4.代码中所用的知识点 二、总体架构分析1.ReLU激活函数2.手算3.模型代码 三、训练花分类课程代码1.model.py2.train.py3.predict.py 一、零碎知识点 1.过拟…

LeetCode刷题---旋转图像

解题思路&#xff1a; 首先对主对角线两边的元素进行交换 接着走一轮遍历&#xff0c;将第1列和第n列进行交换&#xff0c;第2列和第n-1列进行交换&#xff0c;直至得到最终的矩阵。 代码实现&#xff1a; public void rotate(int[][] matrix) {//首先对主对角线的元素进行交换…

企业如何做好客户管理?有哪些关键因素?

客户管理是建立和维护客户关系的重要组成部分&#xff0c;对于企业的发展至关重要。下面就让我们来看看在做好客户管理时有哪些关键因素吧。 第一个关键因素是提供优质的客户服务。无论是线上还是线下&#xff0c;当客户需要帮助时&#xff0c;他们希望能够得到有效且及时的支持…

Spring ApplicationEvent事件处理

Spring的事件 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现&#xff0c;内部实现原理是观察者设计模式&#xff0c;设计初衷也是为了系统业务逻辑之间的解耦&#xff0c;提高可扩展性以及可维护性。 ApplicationEvent就是Spring的事件接口Applic…

南昌找工作用什么APP或者招聘网站

南昌找工作用吉鹿力招聘网 通过吉鹿力招聘网&#xff0c;可以随时查看最新职位&#xff0c;跟踪简历投递动态&#xff0c;与正在进行招聘的CEO、部门负责人、HR在线沟通&#xff0c;查看其他候选人面试该职位后对面试官、公司环境的面试评价等&#xff0c;为求职者提供参考。 …

阿里云2核2G3M服务器能放几个网站?有限制吗?

阿里云2核2g3m服务器可以放几个网站&#xff1f;12个网站&#xff0c;阿里云服务器网的2核2G服务器上安装了12个网站&#xff0c;甚至还可以更多&#xff0c;具体放几个网站取决于网站的访客数量&#xff0c;像阿里云服务器网aliyunfuwuqi.com小编的网站日访问量都很少&#xf…

2023年度最热 AI 应用 TOP 50,除了 ChatGPT 还有这么多宝藏

原文章链接&#xff1a;年度最热 AI 应用 TOP 50&#xff0c;除了 ChatGPT 还有这么多宝藏 - IT之家 更多消息&#xff1a;AI人工智能行业动态&#xff0c;aigc应用领域资讯 在 AI 工具激烈竞争的一年中&#xff0c;尽管ChatGPT在访问量上遥遥领先&#xff0c;但单次使用时长未…