1.背景介绍
Python 是一种面向对象的高级编程语言,它的创造者Guido van Rossum(罗胖)于20世纪90年代末接手了当前的 Python 社区。他在创建 Python 时期曾经受到“Monty Python”的影响,其著名的蜘蛛侠故事作为 Python 的logo而被创作者拿来作为项目标识。虽然 Python 在 2020 年已经成为主流的高级编程语言,但其生态圈依然在蓬勃发展。据统计,截至目前,Python 有超过 7 亿行代码、有超过 3500 万个第三方库和扩展包,并在科技领域广泛应用。除了具备丰富的生态圈之外,Python 也有一些显著的特征值得我们去学习和借鉴。例如它支持动态类型检查,即允许变量的数据类型发生变化,加强了代码的可读性和易维护性;还拥有完善的标准库和第三方库支持,可以方便地解决日常开发中的很多问题;另外,Python 的编码风格简洁,代码紧凑,可读性良好,适合编写简单、快速且健壮的脚本或小型程序等场景。因此,在学习、掌握 Python 相关知识的同时,我们还要结合实际场景,不断地去探索 Python 各种特性,把它们运用到实际工作中去。
本文将通过对以下三个开源项目的分析,为你提供一个全面的认识和理解:
-
Django:一款著名的 Web 框架,其目标是在 web 开发中提供一个优雅、有效、可维护的框架。Django 拥有着庞大的用户群体和社区支持,并且功能齐全,适用于大型网站的开发。本文将从用户入口、配置项、路由机制、视图函数、模板引擎等几个方面进行了解。
-
Flask:一款轻量级的 Web 框架,目标是在 Web 开发中提供一个简单而灵活的框架。Flask 具有高效率、低资源消耗、高性能等特点,适用于小型网站、Web API 服务等场景。本文将从基础配置、URL 路由映射、请求处理流程、上下文管理器等方面进行了解。
-
Scrapy:一个开源的网络爬虫框架,其提供了多种方式进行数据抓取、解析和存储。Scrapy 主要支持基于Xpath、正则表达式、JSONPath等多种方式进行页面信息的提取,并内置了MongoDB数据库的支持。本文将从组件设计和运行流程、命令行接口、中间件等方面进行了解。
通过本文的分析,你可以对 Python 的生态有一个全面的认识和了解,掌握 Python 的基本语法和核心概念,并学会利用 Python 开发各类 Web 应用和爬虫程序。如果你愿意的话,欢迎随时反馈你所遇到的问题和建议,一起共同进步。
2.核心概念与联系
Python 中的一些重要核心概念及其联系如下图所示:
-
Python 解释器(interpreter):Python 解释器是一个能够读取源代码并运行其编译成字节码文件的工具。它把源代码转换成机器代码后,交由 CPU 执行。每当我们执行 python 文件时,就会启动解释器,并把该文件的内容传递给解释器。
-
Python 程序文件(script file):Python 源代码的文件扩展名是.py 。这些文件存放在磁盘上,可以直接编辑打开运行。
-
模块(module):模块就是 Python 中定义和组织代码的最小单位,它可以在其他地方被引用或者导入。模块可以分为内置模块和第三方模块。
-
包(package):包是指按照一定结构组织的代码集合,它包含多个模块,可以帮助我们更好的组织和管理代码。
-
函数(function):函数是 Python 中最基本的组织代码的方式。它接受输入参数,执行一系列的操作,最后返回结果。
-
对象(object):对象是 Python 中所有类的实例,它包含属性和方法。
-
类(class):类是 Python 中定义对象的蓝图,它描述了一个对象的行为和属性。
-
属性(attribute):属性是对象的一部分,它表示一个对象的状态或特征。
-
方法(method):方法是对象上的操作,它能够改变对象内部的状态。
-
异常(exception):异常是指程序运行过程中出现的错误信息,它会导致程序终止执行并打印出异常信息。
3.Django 核心原理与操作步骤
3.1 用户入口
在使用 Django 框架之前,首先需要安装 Django。你可以通过 pip 安装最新版本的 Django 或下载源码安装。
pip install django==3.2.8
然后在 Python 环境中导入 Django 模块并创建一个新的项目:
import django
django.setup() # 这个函数用来初始化 Django 配置
from django.conf import settings # 获取设置项
if __name__ == '__main__':
if not settings.configured:
settings.configure(
DATABASES={
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
},
INSTALLED_APPS=[
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
],
MIDDLEWARE=[],
ROOT_URLCONF='mysite.urls'
)
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
这里我们设置了默认的 SQLite3 数据库配置,并注册了 Django 默认的四个应用 auth、contentypes、sessions、messages 和 staticfiles。
然后我们在项目根目录下创建一个 urls.py 文件,定义项目的 URL 模式:
from django.urls import path
from.views import hello_world
urlpatterns = [
path('', hello_world),
]
这里我们定义了一个 '/' 路径的路由,对应的是 hello_world 函数。此时如果我们在浏览器中访问 http://localhost:8000/ ,我们应该可以看到 "Hello World!" 的输出。
def hello_world(request):
return HttpResponse("Hello World!")
3.2 配置项
Django 的配置文件存放在项目下的 mysite/settings.py 文件中。其中包含许多配置选项,比如:
-
DEBUG:指定是否开启调试模式,默认为 False。
-
ALLOWED_HOSTS:指定允许访问站点的主机列表,默认为 ['127.0.0.1'] 。
-
SECRET_KEY:加密密钥,用于生成密码,表单令牌等安全相关操作。
-
STATIC_ROOT:静态文件目录,用于保存上传的图片、CSS、JavaScript 文件等。
-
MEDIA_ROOT:媒体文件目录,用于保存上传的用户文件等。
-
TEMPLATES:配置模板的目录位置,包括模板文件的位置、加载顺序等。
-
WSGI_APPLICATION:指定部署的 WSGI 应用名称,默认为 None 。
-
DATABASES:数据库配置信息,包括数据库类型、地址、端口、用户名、密码等。
除此之外,还有更多的配置选项可以使用,具体可以参考官方文档。
3.3 路由机制
Django 通过 URLConf 来实现路由机制。每一个 Django 项目都必须包含一个 urls.py 文件,用于定义 URL 模式。
from django.urls import path
from.views import hello_world
urlpatterns = [
path('hello/', hello_world),
]
这里我们定义了一个 '/hello/' 路径的路由,对应的是 hello_world 函数。这样可以通过 http://localhost:8000/hello/ 来访问对应的函数。
def hello_world(request):
return HttpResponse("Hello World!")
当然也可以通过装饰器来实现:
from django.urls import path
from django.utils.decorators import decorator_from_middleware
@decorator_from_middleware(MiddlewareA)
@decorator_from_middleware(MiddlewareB)
def myview():
...
3.4 请求处理流程
Django 使用一个中间件 (Middleware) 的概念来处理请求,中间件是一个拦截请求和响应的插件。当客户端发起 HTTP 请求时,Django 将把请求发送给中间件链条中的每个中间件,依次返回响应。
在 Django 中间件是非常灵活的,你可以自定义任何想要的逻辑。Django 内置了一系列的中间件,可以帮助我们解决很多应用问题。
举个例子,假设我们希望所有的请求都进行 CSRF 检查,那么我们就可以实现一个 CsrfViewMiddleware 来实现该功能。该中间件会在每个请求到达 Django 时自动检查 CSRF 标记是否正确。
Django 对请求处理流程的概括可以总结为以下几个阶段:
-
第一阶段:URL 匹配:根据请求的 URL 模式,选择对应的 view 函数,进行参数绑定。
-
第二阶段:执行 view 函数:调用 view 函数,并传入参数和 request 对象。
-
第三阶段:渲染模板:如果有模板存在,则进行模板渲染,否则直接响应结果。
-
第四阶段:中间件处理:如果有中间件存在,则按顺序对请求进行处理,并在每个响应对象中设置相应的 headers。
3.5 views 函数
Views 函数负责处理 HTTP 请求,并返回 HTTP 响应。
举个例子,我们可以定义一个简单的 view 函数:
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("Hello World!")
这种 view 函数接收一个 HttpRequest 对象作为参数,并返回一个 HttpResponse 对象。HttpResponse 可以接收字符串作为参数,并以文本形式响应给客户端。
Django 提供了不同的 response 类型,比如 JsonResponse、FileResponse、StreamingHttpResponse 等。具体可以参考官方文档。
3.6 模板引擎
模板引擎可以让你在 HTML 中嵌入 Python 变量,并在服务器端完成复杂的计算。
Django 支持 Jinja2、Django Template 和 Mako 模板引擎,你也可以自己编写自己的模板引擎。
为了使用模板,我们需要在配置文件中配置模板的目录:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
这里我们配置了 DjangoTemplate 的后端,并设置了 app_dirs 为 True ,表示启用 APP_DIRS 配置。
然后我们在 templates 目录下创建一个 hello.html 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h1>{{ message }}</h1>
</body>
</html>
我们在 HTML 文件中使用两个模板变量 {{ title }} 和 {{ message }}。
最后,我们修改 view 函数来渲染模板:
from django.shortcuts import render
def index(request):
context = {'title': '首页','message': 'Welcome to MySite!'}
return render(request, 'hello.html', context=context)
这里我们引入了 render 函数,并传入了请求对象、模板文件名和上下文字典。最终会生成完整的 HTML 页面响应给客户端。
对于复杂的模板渲染需求,你还可以使用 Django 的模板继承和标签来完成。