Python入门实战:Python的开源项目分析

114 阅读8分钟

1.背景介绍

Python 是一种面向对象的高级编程语言,它的创造者Guido van Rossum(罗胖)于20世纪90年代末接手了当前的 Python 社区。他在创建 Python 时期曾经受到“Monty Python”的影响,其著名的蜘蛛侠故事作为 Python 的logo而被创作者拿来作为项目标识。虽然 Python 在 2020 年已经成为主流的高级编程语言,但其生态圈依然在蓬勃发展。据统计,截至目前,Python 有超过 7 亿行代码、有超过 3500 万个第三方库和扩展包,并在科技领域广泛应用。除了具备丰富的生态圈之外,Python 也有一些显著的特征值得我们去学习和借鉴。例如它支持动态类型检查,即允许变量的数据类型发生变化,加强了代码的可读性和易维护性;还拥有完善的标准库和第三方库支持,可以方便地解决日常开发中的很多问题;另外,Python 的编码风格简洁,代码紧凑,可读性良好,适合编写简单、快速且健壮的脚本或小型程序等场景。因此,在学习、掌握 Python 相关知识的同时,我们还要结合实际场景,不断地去探索 Python 各种特性,把它们运用到实际工作中去。

本文将通过对以下三个开源项目的分析,为你提供一个全面的认识和理解:

  1. Django:一款著名的 Web 框架,其目标是在 web 开发中提供一个优雅、有效、可维护的框架。Django 拥有着庞大的用户群体和社区支持,并且功能齐全,适用于大型网站的开发。本文将从用户入口、配置项、路由机制、视图函数、模板引擎等几个方面进行了解。

  2. Flask:一款轻量级的 Web 框架,目标是在 Web 开发中提供一个简单而灵活的框架。Flask 具有高效率、低资源消耗、高性能等特点,适用于小型网站、Web API 服务等场景。本文将从基础配置、URL 路由映射、请求处理流程、上下文管理器等方面进行了解。

  3. 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 的模板继承和标签来完成。