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

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

99281b0b61d11196055848682d72cab4_bc3308d24b8747399757b9ecc5c08e95.png

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


d8aec38078ac4cb039cf26f52decfc70_355b591cb3c74c048803cb4d551e9004.png


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,都应限制对它们的访问。

目录
相关文章
|
4月前
|
测试技术 API Python
【10月更文挑战第1天】python知识点100篇系列(13)-几种方法让你的电脑一直在工作
【10月更文挑战第1天】 本文介绍了如何通过Python自动操作鼠标或键盘使电脑保持活跃状态,避免自动息屏。提供了三种方法:1) 使用PyAutoGUI,通过安装pip工具并执行`pip install pyautogui`安装,利用`moveRel()`方法定时移动鼠标;2) 使用Pymouse,通过`pip install pyuserinput`安装,采用`move()`方法移动鼠标绝对位置;3) 使用PyKeyboard,同样需安装pyuserinput,模拟键盘操作。文中推荐使用PyAutoGUI,因其功能丰富且文档详尽。
|
6月前
|
Python
python知识点
【8月更文挑战第27天】python知识点
3416 2
WK
|
6月前
|
存储 机器学习/深度学习 JSON
Python入门知识点
Python入门覆盖历史、设计理念、变量、数据类型、控制结构等。了解Python的发展,掌握动态类型的灵活性,熟悉整数、浮点数、字符串等数据类型。学会if/else、for/while循环构建逻辑流程,使用def定义函数,lambda快速创建匿名函数。通过类实现面向对象编程,利用模块和包组织代码。掌握try-except处理异常,open()进行文件操作。利用标准库和第三方库增强功能,理解集合、字典、列表推导式的应用,深入魔法方法、递归、装饰器等高级特性,以及上下文管理器和字符串、列表、元组的操作技巧。
WK
51 0
|
3月前
|
缓存 Java 索引
[Python]知识点
本文主要介绍了Python的一些高级知识点和使用细节,包括pip的使用、内置函数、列表、元组、字典、集合、变量、Lambda表达式、面向对象编程、异常处理、模块及标准库等。文章适合有一定Python基础的读者,重点在于深入理解和掌握Python的高级特性。文中还提供了大量示例代码,帮助读者更好地理解和应用这些知识点。
62 1
[Python]知识点
|
4月前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
140 3
python知识点100篇系列(15)-加密python源代码为pyd文件
|
4月前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
python知识点100篇系列(17)-替换requests的python库httpx
|
4月前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
4月前
|
Python Windows
python知识点100篇系列(24)- 简单强大的日志记录器loguru
【10月更文挑战第11天】Loguru 是一个功能强大的日志记录库,支持日志滚动、压缩、定时删除、高亮和告警等功能。安装简单,使用方便,可通过 `pip install loguru` 快速安装。支持将日志输出到终端或文件,并提供丰富的配置选项,如按时间或大小滚动日志、压缩日志文件等。还支持与邮件通知模块结合,实现邮件告警功能。
python知识点100篇系列(24)- 简单强大的日志记录器loguru
|
4月前
|
自然语言处理 Python Windows
python知识点100篇系列(23)- 使用stylecloud生成词云
【10月更文挑战第10天】`stylecloud` 是 `wordcloud` 的优化版,支持使用 Font Awesome 图标自定义词云形状,操作更简便。本文介绍如何安装 `jieba` 和 `stylecloud` 库,并使用它们生成中文词云。通过 `jieba` 进行分词,再利用 `stylecloud` 的 `gen_stylecloud` 方法生成具有特定形状和颜色的词云图像。
python知识点100篇系列(23)- 使用stylecloud生成词云
|
4月前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。

热门文章

最新文章