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

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

f244b7813a237c993b6bb53fb840c45a_7b73edddff8040fcabf969539b5a56f1.png

from django.shortcuts import render
--snip--
from .models import Topic, Entry
from .forms import TopicForm, EntryForm
--snip--
def edit_entry(request, entry_id):
 """编辑既有条目"""
1 entry = Entry.objects.get(id=entry_id)
topic = entry.topic
 if request.method != 'POST':
 # 初次请求,使用当前条目填充表单
2 form = EntryForm(instance=entry)
 else:
 # POST提交的数据,对数据进行处理
3 form = EntryForm(instance=entry, data=request.POST)
 if form.is_valid():
4 form.save()
5 return HttpResponseRedirect(reverse('learning_logs:topic',
 args=[topic.id]))
 context = {'entry': entry, 'topic': topic, 'form': form}
 return render(request, 'learning_logs/edit_entry.html', context)


我们首先需要导入模型Entry。在1处,我们获取用户要修改的条目对象,以及与该条目相 关联的主题。在请求方法为GET时将执行的if代码块中,我们使用实参instance=entry创建一个 EntryForm实例(见2)。这个实参让Django创建一个表单,并使用既有条目对象中的信息填充它。 用户将看到既有的数据,并能够编辑它们。


处理POST请求时,我们传递实参instance=entry和data=request.POST(见3),让Django根 据既有条目对象创建一个表单实例,并根据request.POST中的相关数据对其进行修改。然后,我 们检查表单是否有效,如果有效,就调用save(),且不指定任何实参(见4)。接下来,我们重 定向到显示条目所属主题的页面(见5),用户将在其中看到其编辑的条目的新版本。


3. 模板edit_entry

下面是模板edit_entry.html,它与模板new_entry.html类似:


edit_entry.html

{% extends "learning_logs/base.html" %}
{% block content %}
 <p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p>
 <p>Edit entry:</p>
1 <form action="{% url 'learning_logs:edit_entry' entry.id %}" method='post'>
 {% csrf_token %}
 {{ form.as_p }}
2 <button name="submit">save changes</button>
 </form>
{% endblock content %}

在1处,实参action将表单发回给函数edit_entry()进行处理。在标签{% url %}中,我们将 条目ID作为一个实参,让视图对象能够修改正确的条目对象。我们将提交按钮命名为save changes,以提醒用户:单击该按钮将保存所做的编辑,而不是创建一个新条目(见2)。


4. 链接到页面edit_entry

现在,在显示特定主题的页面中,需要给每个条目添加到页面edit_entry的链接:


topic.html

--snip--
 {% for entry in entries %}
 <li>
 <p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
 <p>{{ entry.text|linebreaks }}</p>
 <p>
 <a href="{% url 'learning_logs:edit_entry' entry.id %}">edit entry</a>
 </p>
 </li>
--snip--

我们将编辑链接放在每个条目的日期和文本后面。在循环中,我们使用模板标签{% url %} 根据URL模式edit_entry和当前条目的ID属性(entry.id)来确定URL。链接文本为"edit entry", 它出现在页面中每个条目的后面。图19-3显示了包含这些链接时,显示特定主题的页面是什么 样的。


e8efcb05c76eb944b42d8b602bcd6a55_e6c09741b25641409c6af50ff2ac0095.png


至此,“学习笔记”已具备了需要的大部分功能。用户可添加主题和条目,还可根据需要查 看任何一组条目。在下一节,我们将实现一个用户注册系统,让任何人都可向“学习笔记”申请 账户,并创建自己的主题和条目。


19.2 创建用户账户

在这一节,我们将建立一个用户注册和身份验证系统,让用户能够注册账户,进而登录和注销。我们将创建一个新的应用程序,其中包含与处理用户账户相关的所有功能。我们还将对模型 Topic稍做修改,让每个主题都归属于特定用户。


19.2.1 应用程序 users

我们首先使用命令startapp来创建一个名为users的应用程序:


(ll_env)learning_log$ python manage.py startapp users
(ll_env)learning_log$ ls
1 db.sqlite3 learning_log learning_logs ll_env manage.py users
(ll_env)learning_log$ ls users
2 admin.py __init__.py migrations models.py tests.py views.py

这个命令新建一个名为users的目录(见1),其结构与应用程序learning_logs相同(见2)。


1. 将应用程序users添加到settings.py中

在settings.py中,我们需要将这个新的应用程序添加到INSTALLED_APPS中,如下所示:


settings.py

--snip--
INSTALLED_APPS = (
 --snip--
 # 我的应用程序
 'learning_logs',
 'users',
)
--snip--

这样,Django将把应用程序users包含到项目中。


2. 包含应用程序users的URL

接下来,我们需要修改项目根目录中的urls.py,使其包含我们将为应用程序users定义的URL:


urls.py

from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
 url(r'^admin/', include(admin.site.urls)),
 url(r'^users/', include('users.urls', namespace='users')),
 url(r'', include('learning_logs.urls', namespace='learning_logs')),
]

我们添加了一行代码,以包含应用程序users中的文件urls.py。这行代码与任何以单词users 打头的URL(如http://localhost:8000/users/login/)都匹配。我们还创建了命名空间'users',以便 将应用程序learning_logs的URL同应用程序users的URL区分开来。


19.2.2 登录页面

我们首先来实现登录页面的功能。为此,我们将使用Django提供的默认登录视图,因此URL 模式会稍有不同。在目录learning_log/users/中,新建一个名为urls.py的文件,并在其中添加如下 代码:


urls.py

"""为应用程序users定义URL模式"""
from django.conf.urls import url
1 from django.contrib.auth.views import login
from . import views
urlpatterns = [
 # 登录页面
2 url(r'^login/$', login, {'template_name': 'users/login.html'},
 name='login'),
]

我们首先导入了默认视图login(见1)。登录页面的URL模式与URL http://localhost:8000/ users/login/匹配(见2)。这个URL中的单词users让Django在users/urls.py中查找,而单词login让 它将请求发送给Django默认视图login(请注意,视图实参为login,而不是views.login)。鉴于 我们没有编写自己的视图函数,我们传递了一个字典,告诉Django去哪里查找我们将编写的模板。 这个模板包含在应用程序users而不是learning_logs中。


1. 模板login.html

用户请求登录页面时,Django将使用其默认视图login,但我们依然需要为这个页面提供模 板。为此,在目录learning_log/users/中,创建一个名为templates的目录,并在其中创建一个名为 users的目录。以下是模板login.html,你应将其存储到目录learning_log/users/templates/users/中:


login.html

{% extends "learning_logs/base.html" %}
{% block content %}
1 {% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
2 <form method="post" action="{% url 'users:login' %}">
{% csrf_token %}
3 {{ form.as_p }}
4 <button name="submit">log in</button>
5 <input type="hidden" name="next" value="{% url 'learning_logs:index' %}" />
 </form> 
{% endblock content %}

这个模板继承了base.html,旨在确保登录页面的外观与网站的其他页面相同。请注意,一个 应用程序中的模板可继承另一个应用程序中的模板。


如果表单的errors属性被设置,我们就显示一条错误消息(见1),指出输入的用户名—密码 对与数据库中存储的任何用户名—密码对都不匹配。


我们要让登录视图处理表单,因此将实参action设置为登录页面的URL(见2)。登录视图 将一个表单发送给模板,在模板中,我们显示这个表单(见3)并添加一个提交按钮(见4)。 在5处,我们包含了一个隐藏的表单元素——'next',其中的实参value告诉Django在用户成功登 录后将其重定向到什么地方——在这里是主页。


2. 链接到登录页面

下面在base.html中添加到登录页面的链接,让所有页面都包含它。用户已登录时,我们不想 显示这个链接,因此将它嵌套在一个{% if %}标签中:


base.html

<p>
 <a href="{% url 'learning_logs:index' %}">Learning Log</a> -
 <a href="{% url 'learning_logs:topics' %}">Topics</a> -
1 {% if user.is_authenticated %}
2 Hello, {{ user.username }}.
{% else %}
3 <a href="{% url 'users:login' %}">log in</a>
{% endif %}
</p>
{% block content %}{% endblock content %}

在Django身份验证系统中,每个模板都可使用变量user,这个变量有一个is_authenticated 属性:如果用户已登录,该属性将为True,否则为False。这让你能够向已通过身份验证的用户 显示一条消息,而向未通过身份验证的用户显示另一条消息。


在这里,我们向已登录的用户显示一条问候语(见1)。对于已通过身份验证的用户,还设 置了属性username,我们使用这个属性来个性化问候语,让用户知道他已登录(见2)。在3处, 对于还未通过身份验证的用户,我们再显示一个到登录页面的链接。


3. 使用登录页面

前面建立了一个用户账户,下面来登录一下,看看登录页面是否管用。请访问 http://localhost:8000/admin/,如果你依然是以管理员的身份登录的,请在页眉上找到注销链接并 单击它。


注销后,访问http://localhost:8000/users/login/,你将看到类似于图19-4所示的登录页面。输入 你在前面设置的用户名和密码,将进入页面index。。在这个主页的页眉中,显示了一条个性化问 候语,其中包含你的用户名。

目录
相关文章
|
1月前
|
测试技术 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,因其功能丰富且文档详尽。
|
3月前
|
Python
python知识点
【8月更文挑战第27天】python知识点
3397 2
|
15天前
|
缓存 Java 索引
[Python]知识点
本文主要介绍了Python的一些高级知识点和使用细节,包括pip的使用、内置函数、列表、元组、字典、集合、变量、Lambda表达式、面向对象编程、异常处理、模块及标准库等。文章适合有一定Python基础的读者,重点在于深入理解和掌握Python的高级特性。文中还提供了大量示例代码,帮助读者更好地理解和应用这些知识点。
19 1
[Python]知识点
WK
|
3月前
|
存储 机器学习/深度学习 JSON
Python入门知识点
Python入门覆盖历史、设计理念、变量、数据类型、控制结构等。了解Python的发展,掌握动态类型的灵活性,熟悉整数、浮点数、字符串等数据类型。学会if/else、for/while循环构建逻辑流程,使用def定义函数,lambda快速创建匿名函数。通过类实现面向对象编程,利用模块和包组织代码。掌握try-except处理异常,open()进行文件操作。利用标准库和第三方库增强功能,理解集合、字典、列表推导式的应用,深入魔法方法、递归、装饰器等高级特性,以及上下文管理器和字符串、列表、元组的操作技巧。
WK
34 0
|
30天前
|
安全 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文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
1月前
|
网络协议 数据库连接 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
|
27天前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
25天前
|
Python Windows
python知识点100篇系列(24)- 简单强大的日志记录器loguru
【10月更文挑战第11天】Loguru 是一个功能强大的日志记录库,支持日志滚动、压缩、定时删除、高亮和告警等功能。安装简单,使用方便,可通过 `pip install loguru` 快速安装。支持将日志输出到终端或文件,并提供丰富的配置选项,如按时间或大小滚动日志、压缩日志文件等。还支持与邮件通知模块结合,实现邮件告警功能。
python知识点100篇系列(24)- 简单强大的日志记录器loguru
|
25天前
|
自然语言处理 Python Windows
python知识点100篇系列(23)- 使用stylecloud生成词云
【10月更文挑战第10天】`stylecloud` 是 `wordcloud` 的优化版,支持使用 Font Awesome 图标自定义词云形状,操作更简便。本文介绍如何安装 `jieba` 和 `stylecloud` 库,并使用它们生成中文词云。通过 `jieba` 进行分词,再利用 `stylecloud` 的 `gen_stylecloud` 方法生成具有特定形状和颜色的词云图像。
python知识点100篇系列(23)- 使用stylecloud生成词云
|
29天前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。