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

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

338e3d2798b720666e04e20c74793abe_5e2e012c552240c2b897b15e69e3b135.png

18.2.7 Django shell

输入一些数据后,就可通过交互式终端会话以编程方式查看这些数据了。这种交互式环境称 为Django shell,是测试项目和排除其故障的理想之地。下面是一个交互式shell会话示例:


(ll_env)learning_log$ python manage.py shell
1 >>> from learning_logs.models import Topic
>>> Topic.objects.all()
[<Topic: Chess>, <Topic: Rock Climbing>]

在活动的虚拟环境中执行时,命令python manage.py shell启动一个Python解释器,可使用 它来探索存储在项目数据库中的数据。在这里,我们导入了模块learning_logs.models中的模型 Topic(见1),然后使用方法Topic.objects.all()来获取模型Topic的所有实例;它返回的是一个列表,称为查询集(queryset)。 我们可以像遍历列表一样遍历查询集。下面演示了如何查看分配给每个主题对象的ID:


>>> topics = Topic.objects.all()
>>> for topic in topics:
... print(topic.id, topic)
...
1 Chess
2 Rock Climbing

我们将返回的查询集存储在topics中,然后打印每个主题的id属性和字符串表示。从输出可 知,主题Chess的ID为1,而Rock Climbing的ID为2。 知道对象的ID后,就可获取该对象并查看其任何属性。下面来看看主题Chess的属性text和 date_added的值:


>>> t = Topic.objects.get(id=1)
>>> t.text
'Chess'
>>> t.date_added
datetime.datetime(2015, 5, 28, 4, 39, 11, 989446, tzinfo=<UTC>)

我们还可以查看与主题相关联的条目。前面我们给模型Entry定义了属性topic,这是一个 ForeignKey,将条目与主题关联起来。利用这种关联,Django能够获取与特定主题相关联的所有 条目,如下所示:


1 >>> t.entry_set.all()
[<Entry: The opening is the first part of the game, roughly...>, <Entry: In the opening phase of the
game, it's important t...>]

为通过外键关系获取数据,可使用相关模型的小写名称、下划线和单词set(见1)。例如, 假设你有模型Pizza和Topping,而Topping通过一个外键关联到Pizza;如果你有一个名为my_pizza 的对象,表示一张比萨,就可使用代码my_pizza.topping_set.all()来获取这张比萨的所有配料。 编写用户可请求的网页时,我们将使用这种语法。确认代码能获取所需的数据时,shell很有 帮助。如果代码在shell中的行为符合预期,那么它们在项目文件中也能正确地工作。如果代码引 发了错误或获取的数据不符合预期,那么在简单的shell环境中排除故障要比在生成网页的文件中 排除故障容易得多。我们不会太多地使用shell,但应继续使用它来熟悉对存储在项目中的数据进 行访问的Django语法。


注意

每次修改模型后,你都需要重启shell,这样才能看到修改的效果。要退出shell会话,可 按Ctr + D;如果你使用的是Windows系统,应按Ctr + Z,再按回车键。


18.3 创建网页:学习笔记主页

使用Django创建网页的过程通常分三个阶段:定义URL、编写视图和编写模板。首先,你必 须定义URL模式。URL模式描述了URL是如何设计的,让Django知道如何将浏览器请求与网站 URL匹配,以确定返回哪个网页。


每个URL都被映射到特定的视图——视图函数获取并处理网页所需的数据。视图函数通常调 用一个模板,后者生成浏览器能够理解的网页。为明白其中的工作原理,我们来创建学习笔记的 主页。我们将定义该主页的URL、编写其视图函数并创建一个简单的模板。


鉴于我们只是要确保“学习笔记”按要求的那样工作,我们将暂时让这个网页尽可能简单。 Web应用程序能够正常运行后,设置样式可使其更有趣,但中看不中用的应用程序毫无意义。就 目前而言,主页只显示标题和简单的描述。


18.3.1 映射 URL

用户通过在浏览器中输入URL以及单击链接来请求网页,因此我们需要确定项目需要哪些 URL 。主页的 URL 最重要,它是用户用来访问项目的基础 URL 。当前,基础 URL (http://localhost:8000/)返回默认的Django网站,让我们知道正确地建立了项目。我们将修改这一 点,将这个基础URL映射到“学习笔记”的主页。 打开项目主文件夹learning_log中的文件urls.py,你将看到如下代码:


urls.py

1 from django.conf.urls import include, url
from django.contrib import admin
2 urlpatterns = [
3 url(r'^admin/', include(admin.site.urls)),
]

前两行导入了为项目和管理网站管理URL的函数和模块(见1)。这个文件的主体定义了变 量urlpatterns(见2)。在这个针对整个项目的urls.py文件中,变量urlpatterns包含项目中的应 用程序的URL。3处的代码包含模块admin.site.urls,该模块定义了可在管理网站中请求的所有 URL。 我们需要包含learning_logs的URL:


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

在1处,我们添加了一行代码来包含模块learning_logs.urls。这行代码包含实参 namespace,让我们能够将learning_logs的URL同项目中的其他URL区分开来,这在项目开始扩 展时很有帮助。


默认的urls.py包含在文件夹learning_log中,现在我们需要在文件夹learning_logs中创建另一 个urls.py文件:


urls.py

1 """定义learning_logs的URL模式"""
2 from django.conf.urls import url
3 from . import views
4 urlpatterns = [
 # 主页
5 url(r'^$', views.index, name='index'),
]

为弄清楚当前位于哪个urls.py文件中,我们在这个文件开头添加了一个文档字符串(见1)。 接下来,我们导入了函数url,因为我们需要使用它来将URL映射到视图(见2)。我们还导入了 模块views(见3),其中的句点让Python从当前的urls.py模块所在的文件夹中导入视图。在这个 模块中,变量urlpatterns是一个列表,包含可在应用程序learning_logs中请求的网页(见4)。


实际的URL模式是一个对函数url()的调用,这个函数接受三个实参(见)。第一个是一个 正则表达式。Django在urlpatterns中查找与请求的URL字符串匹配的正则表达式,因此正则表达 式定义了Django可查找的模式。


我们来看看正则表达式r'^$'。其中的r让Python将接下来的字符串视为原始字符串,而引号 告诉Python正则表达式始于和终于何处。脱字符(^)让Python查看字符串的开头,而美元符号让 Python查看字符串的末尾。总体而言,这个正则表达式让Python查找开头和末尾之间没有任何东 西的URL。Python忽略项目的基础URL(http://localhost:8000/),因此这个正则表达式与基础URL 匹配。其他URL都与这个正则表达式不匹配。如果请求的URL不与任何URL模式匹配,Django 将返回一个错误页面。


url()的第二个实参(见5)指定了要调用的视图函数。请求的URL与前述正则表达式匹配时, Django将调用views.index(这个视图函数将在下一节编写)。第三个实参将这个URL模式的名称 指定为index,让我们能够在代码的其他地方引用它。每当需要提供到这个主页的链接时,我们 都将使用这个名称,而不编写URL。


注意

正则表达式通常被称为regex,几乎每种编程语言都使用它。它们的用途多得难以置信, 但需要经过一定的练习才能熟悉。如果你不明白前面介绍的内容,也不用担心,你在完 成这个项目的过程中,将会看到很多正则表达式。


18.3.2 编写视图

视图函数接受请求中的信息,准备好生成网页所需的数据,再将这些数据发送给浏览器—— 这通常是使用定义了网页是什么样的模板实现的。 learning_logs中的文件views.py是你执行命令python manage.py startapp时自动生成的,当前 其内容如下:


views.py

from django.shortcuts import render
# 在这里创建视图

当前,这个文件只导入了函数render(),它根据视图提供的数据渲染响应。下面的代码演示 了该如何为主页编写视图:


from django.shortcuts import render
def index(request):
 """学习笔记的主页"""
 return render(request, 'learning_logs/index.html')

URL请求与我们刚才定义的模式匹配时,Django将在文件views.py中查找函数index(),再将 请求对象传递给这个视图函数。在这里,我们不需要处理任何数据,因此这个函数只包含调用 render()的代码。这里向函数render()提供了两个实参:原始请求对象以及一个可用于创建网页 的模板。下面来编写这个模板。


18.3.3 编写模板

模板定义了网页的结构。模板指定了网页是什么样的,而每当网页被请求时,Django将填入 相关的数据。模板让你能够访问视图提供的任何数据。我们的主页视图没有提供任何数据,因此 相应的模板非常简单。 在文件夹learning_logs中新建一个文件夹,并将其命名为templates。


在文件夹templates中,再 新建一个文件夹,并将其命名为learning_logs。这好像有点多余(我们在文件夹learning_logs中创 建了文件夹templates,又在这个文件夹中创建了文件夹learning_logs),但建立了Django能够明确 解读的结构,即便项目很大,包含很多应用程序亦如此。在最里面的文件夹learning_logs中,新 建一个文件,并将其命名为index.html,再在这个文件中编写如下代码:


index.html

<p>Learning Log</p>
<p>Learning Log helps you keep track of your learning, for any topic you're
learning about.</p>

这个文件非常简单。对于不熟悉HTML的读者,这里解释一下:标签<p></p>


标识段落;标签


指出了段落的开头位置,而标签


指出了段落的结束位置。这里定义了两个段落:第一个 充当标题,第二个阐述了用户可使用“学习笔记”来做什么。 现在,如果你请求这个项目的基础URL——http://localhost:8000/,将看到刚才创建的网页, 而不是默认的Django网页。Django接受请求的URL,发现该URL与模式r'^$'匹配,因此调用函 数views.index(),这将使用index.html包含的模板来渲染网页,结果如图18-3所示。


d4c2f45be791b0b9a5912ffaf7ef3657_00085fd9470544e0b5b3df42a7e839f3.png


创建网页的过程看起来可能很复杂,但将URL、视图和模板分离的效果实际上很好。这让我 们能够分别考虑项目的不同方面,且在项目很大时,让各个参与者可专注于其最擅长的方面。例 如,数据库专家可专注于模型,程序员可专注于视图代码,而Web设计人员可专注于模板。

目录
相关文章
|
8天前
|
测试技术 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,因其功能丰富且文档详尽。
|
2月前
|
Python
python知识点
【8月更文挑战第27天】python知识点
3387 2
WK
|
2月前
|
存储 机器学习/深度学习 JSON
Python入门知识点
Python入门覆盖历史、设计理念、变量、数据类型、控制结构等。了解Python的发展,掌握动态类型的灵活性,熟悉整数、浮点数、字符串等数据类型。学会if/else、for/while循环构建逻辑流程,使用def定义函数,lambda快速创建匿名函数。通过类实现面向对象编程,利用模块和包组织代码。掌握try-except处理异常,open()进行文件操作。利用标准库和第三方库增强功能,理解集合、字典、列表推导式的应用,深入魔法方法、递归、装饰器等高级特性,以及上下文管理器和字符串、列表、元组的操作技巧。
WK
31 0
|
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文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
5天前
|
网络协议 数据库连接 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
|
1天前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
2天前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
|
3天前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
6天前
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
python知识点100篇系列(16)-python中如何获取线程的返回值
|
7天前
|
Python
python知识点100篇系列(14)-分割大文件然后在合并
【10月更文挑战第2天】在工作中,因邮件附件大小限制或网络条件不佳,常需将大文件分割为小文件发送,接收后再合并。Python的文件读写功能可轻松实现此需求,也可借助第三方库filesplit简化操作。安装filesplit后,仅需几行代码即可完成文件的分割与合并,但掌握Python内置方法同样重要。