蚊章汇 - Django
type: channel
link: https://linuxcn.bwsl.wang/tag/Django/
items: 如何借助 Django 来编写一个 Python Web API
items: Python Web 应用程序 Django 框架简介
items: 简化 Django 开发的八个 Python 包
items: 如何 Docker 化 Python Django 应用程序
items: Django ORM 简介
items: 在 Linux 上使用 Nginx 和 Gunicorn 托管 Django 应用
items: Instagram 基于 Python 语言的 Web Service 效率提升之道
items: 5 个最受人喜爱的开源 Django 包

如何借助 Django 来编写一个 Python Web API
type: item
date: 2020-01-11T22:25:00+08:00
description: Django 是 Python API 开发中最流行的框架之一，在这个教程中，我们来学习如何使用它。Django 所有 Web 框架中最全面的，也是最受欢迎的一个。自 2005 年以来，其流行度大幅上升。Django 是由 Django 软件基金会维护，并且获得了社区的大力支持，在全球拥有超过 11,600 名成员。在 Stack Overflow 上，约有 191,000 个带 Django 标签的问题。Spotify、YouTube 和 Instagram 等都使用 Django 来构建应用程序和数据管理。本文演示了一个简单的 API，通过它可以使用 HTTP 协议的 GET 方法来从服务器获取数据。构建一个项目首先，为你的 Django 应用程序创建一个目录结构，你可以在系统的任何位置创建：$ mkdir myproject $ cd myproject然后，在项目目录中创建一个虚拟环境来隔离本地包依赖关系：$ python3 -m venv env $ source env/bin/activate在 Windows 上，使用命令 env\Scripts\activate 来激活虚拟环境。安装 Django 和 Django REST framework然后，安装 Django 和 Django REST 模块：$ pip3 install django $ pip3 install djangorestframework实例化一个新的 Django 项目现在你的应用程序已经有了一个工作环境，你必须实例化一个新的 Django 项目。与 Flask 这样微框架不同的是，Django 有专门的命令来创建（注意第一条命令后的 . 字符）。$ django-admin startproject tutorial . $ cd tutorial $ django-admin startapp quickstartDjango 使用数据库来管理后端，所以你应该在开始开发之前同步数据库，数据库可以通过 manage.py 脚本管理，它是在你运行 django-admin 命令时创建的。因为你现在在 tutorial 目录，所以使用 ../ 符号来运行脚本，它位于上一层目录：$ python3 ../manage.py makemigrations No changes detected $ python3 ../manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying sessions.0001_initial... OK在 Djan…

Python Web 应用程序 Django 框架简介
type: item
date: 2018-12-01T03:00:57+08:00
description: 在这个比较 Python 框架的最后一篇中，让我们看看 Django。在本系列（由四部分组成）的前三篇文章中，我们讨论了 Pyramid、Flask 和 Tornado 这 3 个 Web 框架。我们已经构建了三次相同的应用程序，最终我们遇到了 Django。总的来说，Django 是目前 Python 开发人员使用的主要 Web 框架，并且原因显而易见。它擅长隐藏大量的配置逻辑，让你专注于能够快速构建大型应用程序。也就是说，当涉及到小型项目时，比如我们的待办事项列表应用程序，Django 可能有点像用消防水管来进行水枪大战。让我们来看看它们是如何结合在一起的。关于 DjangoDjango 将自己定位为“一个鼓励快速开发和整洁、实用的设计的高级 Python Web 框架。它由经验丰富的开发人员构建，解决了 Web 开发的很多麻烦，因此你可以专注于编写应用程序而无需重新发明轮子”。而且它确实做到了！这个庞大的 Web 框架附带了非常多的工具，以至于在开发过程中，如何将所有内容组合在一起协同工作可能是个谜。除了框架本身很大，Django 社区也是非常庞大的。事实上，它非常庞大和活跃，以至于有一个网站专门用于为人们收集第三方包，这些第三方包可集成进 Django 来做一大堆事情。包括从身份验证和授权到完全基于 Django 的内容管理系统，电子商务附加组件以及与 Stripe（LCTT 译注：美版“支付宝”）集成的所有内容。至于不要重新发明轮子：如果你想用 Django 完成一些事情，有人可能已经做过了，你只需将它集成进你的项目就行。为此，我们希望使用 Django 构建 REST API，因此我们将使用流行的 Django REST 框架。它的工作是将 Django 框架（Django 使用自己的模板引擎构建 HTML 页面）转换为专门用于有效地处理 REST 交互的系统。让我们开始吧。Django 启动和配置$ mkdir django_todo $ cd django_todo $ pipenv install --python 3.6 $ pipenv shell (django-someHash) $ pipenv install django djangorestframework作为参考，我们使用的是 django-2.0.7 和 djangorestframework-3.8.2。与 Flask, Tornado 和 Pyramid 不同，我们不需要自己编写 setup.py 文件，我们并不是在做一个可安装的 Python 发布版。像很多事情一样，Django 以自己的方式处理这个问题。我们仍然需要一个 requirements.txt 文件来跟踪我们在其它地方部署的所有必要安装。但是，就 Django 项目中的目标模块而言，Django 会让我们列出我们想要访问的子目录，然后允许我们从这些目录中导入，就像它们是已安装的包一样。首先，我们必须创建一个 Django 项目。当我们安装了 Django 后，我们还安装了命令行脚本 django-admin。它的工作是管理所有与 Django 相关的命令，这些命令有助于我们将项目整合在一起，并在我们继续开发的过程中对其进行维护。django-admin 并不是让我们从头开始构建整个 Django 生态系统，而是让我们从标准 Django 项目所需的所有必要文件（以及更多）的基础上开始。调用 django-admin 的 start-project 命令的语法是 django-admin startproject <项目名称> <存放目录>。我们希望文件存于当前的工作目录中，所以：(django-someHash) $ django-admin startproject django_todo .输入 ls 将显示一个新文件和一个新目录。(django-someHash) $ ls manage.py django_todomanage.py 是一个可执行命令行 Python 文件，它最终成为 django-admin 的封装。因此，它的工作与 django-admin 是一样的：帮助我们管理项目。因此得名 manage.py。它在 django_todo 目录里创建了一个新目录 django_todo，其代表了我们项目的配置根目录。现在让我们深入研究一下。配置 Django可以将 django_todo 目录称为“配置根目录”，我们的意思是这个目录包含了通常配置 Django 项目所需的文件。几乎所有这个目录之外的内容都只关注与项目模型、视图、路由等相关的“业务逻辑”。所有连接项目的点都将在这里出现。在 django_todo 目录中调用 ls 会显示以下四个文件：(d…

简化 Django 开发的八个 Python 包
type: item
date: 2018-10-06T05:41:14+08:00
description: 这个月的 Python 专栏将介绍一些 Django 包，它们有益于你的工作，以及你的个人或业余项目。Django 开发者们，在这个月的 Python 专栏中，我们会介绍一些能帮助你们的软件包。这些软件包是我们最喜欢的 Django 库，能够节省开发时间，减少样板代码，通常来说，这会让我们的生活更加轻松。我们为 Django 应用准备了六个包，为 Django 的 REST 框架准备了两个包。几乎所有我们的项目里，都用到了这些包，真的，不是说笑。不过在继续阅读之前，请先看看我们关于让 Django 管理后台更安全的几个提示，以及这篇关于 5 个最受欢迎的开源 Django 包 的文章。有用又省时的工具集合：django-extensionsdjango-extensions 这个 Django 包非常受欢迎，全是有用的工具，比如下面这些管理命令：shell_plus 打开 Django 的管理 shell，这个 shell 已经自动导入了所有的数据库模型。在测试复杂的数据关系时，就不需要再从几个不同的应用里做导入操作了。clean_pyc 删除项目目录下所有位置的 .pyc 文件create_template_tags 在指定的应用下，创建模板标签的目录结构。describe_form 输出模型的表单定义，可以粘贴到 forms.py 文件中。（需要注意的是，这种方法创建的是普通 Django 表单，而不是模型表单。）notes 输出你项目里所有带 TODO、FIXME 等标记的注释。Django-extensions 还包括几个有用的抽象基类，在定义模型时，它们能满足常见的模式。当你需要以下模型时，可以继承这些基类：TimeStampedModel：这个模型的基类包含了 created 字段和 modified 字段，还有一个 save() 方法，在适当的场景下，该方法自动更新 created 和 modified 字段的值。ActivatorModel：如果你的模型需要像 status、activate_date 和 deactivate_date 这样的字段，可以使用这个基类。它还自带了一个启用 .active() 和 .inactive() 查询集的 manager。TitleDescriptionModel 和 TitleSlugDescriptionModel：这两个模型包括了 title 和 description 字段，其中 description 字段还包括 slug，它根据 title 字段自动产生。django-extensions 还有其他更多的功能，也许对你的项目有帮助，所以，去浏览一下它的文档吧！12 因子应用的配置：django-environ在 Django 项目的配置方面，django-environ 提供了符合 12 因子应用 方法论的管理方法。它是另外一些库的集合，包括 envparse 和 honcho 等。安装了 django-environ 之后，在项目的根目录创建一个 .env 文件，用这个文件去定义那些随环境不同而不同的变量，或者需要保密的变量。（比如 API 密钥，是否启用调试，数据库的 URL 等）然后，在项目的 settings.py 中引入 environ，并参考官方文档的例子设置好 environ.PATH() 和 environ.Env()。就可以通过 env('VARIABLE_NAME') 来获取 .env 文件中定义的变量值了。创建出色的管理命令：django-clickdjango-click 是基于 Click 的，（我们之前推荐过… 两次 Click)，它对编写 Django 管理命令很有帮助。这个库没有很多文档，但是代码仓库中有个存放测试命令的目录，非常有参考价值。 django-click 基本的 Hello World 命令是这样写的：# app_name.management.commands.hello.py import djclick as click @click.command() @click.argument('name') def command(name): click.secho(f'Hello, {name}')在命令行下调用它，这样执行即可：>> ./manage.py hello Lacey Hello, Lacey处理有限状态机：django-fsmdjango-fsm 给 Django 的模型添加了有限状态机的支持。如果你管理一个新闻网站，想用类似于“写作中”、“编辑中”、“已发布”来流转文章的状态，django-fsm 能帮你定义这些状态，还能管理状态变化的规则与限制。Django-fsm 为模型提供了 FSMFie…

如何 Docker 化 Python Django 应用程序
type: item
date: 2018-09-13T06:42:00+08:00
description: Docker 是一个开源项目，为开发人员和系统管理员提供了一个开放平台，可以将应用程序构建、打包为一个轻量级容器，并在任何地方运行。Docker 会在软件容器中自动部署应用程序。Django 是一个用 Python 编写的 Web 应用程序框架，遵循 MVC（模型-视图-控制器）架构。它是免费的，并在开源许可下发布。它速度很快，旨在帮助开发人员尽快将他们的应用程序上线。在本教程中，我将逐步向你展示在 Ubuntu 16.04 中如何为现有的 Django 应用程序创建 docker 镜像。我们将学习如何 docker 化一个 Python Django 应用程序，然后使用一个 docker-compose 脚本将应用程序作为容器部署到 docker 环境。为了部署我们的 Python Django 应用程序，我们需要其它 docker 镜像：一个用于 Web 服务器的 nginx docker 镜像和用于数据库的 PostgreSQL 镜像。我们要做什么？安装 Docker-ce安装 Docker-compose配置项目环境构建并运行测试步骤 1 - 安装 Docker-ce在本教程中，我们将从 docker 仓库安装 docker-ce 社区版。我们将安装 docker-ce 社区版和 docker-compose（其支持 compose 文件版本 3）。在安装 docker-ce 之前，先使用 apt 命令安装所需的 docker 依赖项。sudo apt install -y \ apt-transport-https \ ca-certificates \ curl \ software-properties-common现在通过运行以下命令添加 docker 密钥和仓库。curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"更新仓库并安装 docker-ce。sudo apt update sudo apt install -y docker-ce安装完成后，启动 docker 服务并使其能够在每次系统引导时启动。systemctl start docker systemctl enable docker接着，我们将添加一个名为 omar 的新用户并将其添加到 docker 组。useradd -m -s /bin/bash omar usermod -a -G docker omar以 omar 用户身份登录并运行 docker 命令，如下所示。su - omar docker run hello-world确保你能从 Docker 获得 hello-world 消息。Docker-ce 安装已经完成。步骤 2 - 安装 Docker-compose在本教程中，我们将使用支持 compose 文件版本 3 的最新 docker-compose。我们将手动安装 docker-compose。使用 curl 命令将最新版本的 docker-compose 下载到 /usr/local/bin 目录，并使用 chmod 命令使其有执行权限。运行以下命令：sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose现在检查 docker-compose 版本。docker-compose version确保你安装的是最新版本的 docker-compose 1.21。已安装支持 compose 文件版本 3 的 docker-compose 最新版本。步骤 3 - 配置项目环境在这一步中，我们将配置 Python Django 项目环境。我们将创建新目录 guide01，并使其成为我们项目文件的主目录，例如包括 Dockerfile、Django 项目、nginx 配置文件等。登录到 omar 用户。su - omar创建一个新目录 guide01，并进入目录。mkdir -p guide01 cd guide01/现在在 guide01 目录下，创建两个新目录 project 和 conf…

Django ORM 简介
type: item
date: 2017-12-18T02:51:56+08:00
description: 学习怎么去使用 Python 的 web 框架中的对象关系映射与你的数据库交互，就像你使用 SQL 一样。你可能听说过 Django，它是一个被称为“完美主义者的最后期限” 的 Python web 框架。它是一匹 可爱的小矮马。Django 的一个强大的功能是它的 对象关系映射 Object-Relational Mapper （ORM），它允许你就像使用 SQL 一样去和你的数据库交互。事实上，Django 的 ORM 就是创建 SQL 去查询和操作数据库的一个 Python 式方式，并且获得 Python 风格的结果。 我说的是一种方式，但实际上，它是一种非常聪明的工程方法，它利用了 Python 中一些很复杂的部分，而使得开发者更加轻松。在我们开始去了解 ORM 是怎么工作之前，我们需要一个可以操作的数据库。和任何一个关系型数据库一样，我们需要去定义一堆表和它们的关系（即，它们相互之间联系起来的方式)。让我们使用我们熟悉的东西。比如说，我们需要去建模一个有博客文章和作者的博客。每个作者有一个名字。一位作者可以有很多的博客文章。一篇博客文章可以有很多的作者、标题、内容和发布日期。在 Django 村里，这个文章和作者的概念可以被称为博客应用。在这个语境中，一个应用是一个自包含一系列描述我们的博客行为和功能的模型和视图的集合。用正确的方式打包，以便于其它的 Django 项目可以使用我们的博客应用。在我们的项目中，博客正是其中的一个应用。比如，我们也可以有一个论坛应用。但是，我们仍然坚持我们的博客应用的原有范围。这是为这个教程事先准备的 models.py：from django.db import models class Author(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField() published_date = models.DateTimeField(blank=True, null=True) author = models.ManyToManyField(Author, related_name="posts") def __str__(self): return self.title 现在，看上去似乎有点令人恐惧，因此，我们把它分解来看。我们有两个模型：作者（Author）和文章（Post）。它们都有名字（name）或者标题（title）。文章有个放内容的大的文本字段，以及用于发布时间和日期的 DateTimeField。文章也有一个 ManyToManyField，它同时链接到文章和作者。大多数的教程都是从头开始的，但是，在实践中并不会发生这种情况。实际上，你会得到一堆已存在的代码，就像上面的 model.py 一样，而你必须去搞清楚它们是做什么的。因此，现在你的任务是去进入到应用程序中去了解它。做到这一点有几种方法，你可以登入到 Django admin，这是一个 Web 后端，它会列出全部的应用和操作它们的方法。我们先退出它，现在我们感兴趣的东西是 ORM。我们可以在 Django 项目的主目录中运行 python manage.py shell 去访问 ORM。/srv/web/django/ $ python manage.py shell Python 3.6.3 (default, Nov 9 2017, 15:58:30) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwin Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> 这将带我们进入到交互式控制台。shell 命令 为我们做了很多设置，包括导入我们的设置和配置 Django 环境。虽然我们启动了 shell，但是，在我们导入它之前，我们并不能访问我们的博客模型。>>> from blog.models import * 它导入了全部的博客模型，因此，我们可以玩我们的博客了。首先，我们列出所有的作者：>>> Author.objects.all() 我们将从这个命令取得结果，它是一个 QuerySet，它列出了我们所有的作者对象。它不会充满我们的整个控制台，因为，如果有很多查询结果，Django 将…

在 Linux 上使用 Nginx 和 Gunicorn 托管 Django 应用
type: item
date: 2017-04-16T00:35:19+08:00
description: 介绍托管 Django Web 应用程序相当简单，虽然它比标准的 PHP 应用程序更复杂一些。 让 Web 服务器对接 Django 的方法有很多。 Gunicorn 就是其中最简单的一个。Gunicorn（Green Unicorn 的缩写）在你的 Web 服务器 Django 之间作为中间服务器使用，在这里，Web 服务器就是 Nginx。 Gunicorn 服务于应用程序，而 Nginx 处理静态内容。Gunicorn安装使用 Pip 安装 Gunicorn 是超级简单的。 如果你已经使用 virtualenv 搭建好了你的 Django 项目，那么你就有了 Pip，并且应该熟悉 Pip 的工作方式。 所以，在你的 virtualenv 中安装 Gunicorn。$ pip install gunicorn 配置Gunicorn 最有吸引力的一个地方就是它的配置非常简单。处理配置最好的方法就是在 Django 项目的根目录下创建一个名叫 Gunicorn 的文件夹。然后在该文件夹内，创建一个配置文件。在本篇教程中，配置文件名称是 gunicorn-conf.py。在该文件中，创建类似于下面的配置：import multiprocessing bind = 'unix:///tmp/gunicorn1.sock' workers = multiprocessing.cpu_count() * 2 + 1 reload = True daemon = True 在上述配置的情况下，Gunicorn 会在 /tmp/ 目录下创建一个名为 gunicorn1.sock 的 Unix 套接字。 还会启动一些工作进程，进程数量相当于 CPU 内核数量的 2 倍。 它还会自动重新加载并作为守护进程运行。运行Gunicorn 的运行命令有点长，指定了一些附加的配置项。 最重要的部分是将 Gunicorn 指向你项目的 .wsgi 文件。gunicorn -c gunicorn/gunicorn-conf.py -D --error-logfile gunicorn/error.log yourproject.wsgi 上面的命令应该从项目的根目录运行。 -c 选项告诉 Gunicorn 使用你创建的配置文件。 -D 再次指定 gunicorn 为守护进程。 最后一部分指定 Gunicorn 的错误日志文件在你创建 Gunicorn 文件夹中的位置。 命令结束部分就是为 Gunicorn 指定 .wsgi 文件的位置。Nginx现在 Gunicorn 配置好了并且已经开始运行了，你可以设置 Nginx 连接它，为你的静态文件提供服务。 本指南假定你已经配置好了 Nginx，而且你通过它托管的站点使用了单独的 server 块。 它还将包括一些 SSL 信息。如果你想知道如何让你的网站获得免费的 SSL 证书，请查看我们的 Let'sEncrypt 指南。# 连接到 Gunicorn upstream yourproject-gunicorn { server unix:/tmp/gunicorn1.sock fail_timeout=0; } # 将未加密的流量重定向到加密的网站 server { listen 80; server_name yourwebsite.com; return 301 https://yourwebsite.com$request_uri; } # 主服务块 server { # 设置监听的端口，指定监听的域名 listen 443 default ssl; client_max_body_size 4G; server_name yourwebsite.com; # 指定日志位置 access_log /var/log/nginx/yourwebsite.access_log main; error_log /var/log/nginx/yourwebsite.error_log info; # 告诉 nginx 你的 ssl 证书 ssl on; ssl_certificate /etc/letsencrypt/live/yourwebsite.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourwebsite.com/privkey.pem; # 设置根目录 root /var/www/yourvirtualenv/yourproject; # 为 Nginx 指定静态文件路径 location /static/ { # Autoindex the files to make them browsable if you wan…

Instagram 基于 Python 语言的 Web Service 效率提升之道
type: item
date: 2016-10-02T03:14:38+08:00
description: Instagram 目前部署了世界上最大规模的 Django Web 框架（该框架完全使用 Python 编写）。我们最初选用 Python 是因为它久负盛名的简洁性与实用性，这非常符合我们的哲学思想——“先做简单的事情”。但简洁性也会带来效率方面的折衷。Instagram 的规模在过去两年中已经翻番，并且最近已突破 5 亿用户，所以急需最大程度地提升 web 服务效率以便我们的平台能够继续顺利地扩大。在过去的一年，我们已经将 效率计划 （ efficiency program ） 提上日程，并在过去的六个月，我们已经能够做到无需向我们的 Django 层 （ Django tiers ） 添加新的容量来维持我们的用户增长。我们将在本文分享一些由我们构建的工具以及如何使用它们来优化我们的日常部署流程。为何需要提升效率？Instagram，正如所有的软件，受限于像服务器和数据中心能源这样的物理限制。鉴于这些限制，在我们的效率计划中有两个我们希望实现的主要目标：Instagram 应当能够利用持续代码发布正常地提供通信服务，防止因为自然灾害、区域性网络问题等造成某一个数据中心区丢失。Instagram 应当能够自由地滚动发布新产品和新功能，不必因容量而受阻。想要实现这些目标，我们意识到我们需要持续不断地监控我们的系统并与 回归 （ regressions ） 进行战斗。定义效率Web services 的瓶颈通常在于每台服务器上可用的 CPU 时间。在这种环境下，效率就意味着利用相同的 CPU 资源完成更多的任务，也就是说， 每秒处理更多的用户请求 （ requests per second，RPS ） 。当我们寻找优化方法时，我们面临的第一个最大的挑战就是尝试量化我们当前的效率。到目前为止，我们一直在使用“每次请求的平均 CPU 时间”来评估效率，但使用这种指标也有其固有限制：设备多样性。使用 CPU 时间来测量 CPU 资源并非理想方案，因为它同时受到 CPU 型号与 CPU 负载的影响。请求影响数据。测量每次请求的 CPU 资源并非理想方案，因为在使用 每次请求测量 （ per-request measurement ） 方案时，添加或移除轻量级或重量级的请求也会影响到效率指标。相对于 CPU 时间来说，CPU 指令是一种更好的指标，因为对于相同的请求，它会报告相同的数字，不管 CPU 型号和 CPU 负载情况如何。我们选择使用了一种叫做” 每个活动用户 （ per active user ） “的指标，而不是将我们所有的数据关联到每个用户请求上。我们最终采用“ 每个活动用户在高峰期间的 CPU 指令 （ CPU instruction per active user during peak minute ） ”来测量效率。我们建立好新的度量标准后，下一步就是通过对 Django 的分析来更多的了解一下我们的回归。Django web services 分析通过分析我们的 Django web services，我们希望回答两个主要问题：CPU 回归会发生吗？是什么导致了 CPU 回归发生以及我们该怎样修复它？想要回答第一个问题，我们需要追踪“ 每个活动用户的 CPU 指令 （ CPU-instruction-per-active-user ） ”指标。如果该指标增加，我们就知道已经发生了一次 CPU 回归。我们为此构建的工具叫做 Dynostats。Dynostats 利用 Django 中间件以一定的速率采样用户请求，记录关键的效率以及性能指标，例如 CPU 总指令数、端到端请求时延、花费在访问内存缓存（memcache）和数据库服务的时间等。另一方面，每个请求都有很多可用于聚合的 元数据 （ metadata ） ，例如端点名称、HTTP 请求返回码、服务该请求的服务器名称以及请求中最新提交的 哈希值 （ hash ） 。对于单个请求记录来说，有两个方面非常强大，因为我们可以在不同的维度上进行切割，那将帮助我们减少任何导致 CPU 回归的原因。例如，我们可以根据它们的端点名称聚合所有请求，正如下面的时间序列图所示，从图中可以清晰地看出在特定端点上是否发生了回归。CPU 指令对测量效率很重要——当然，它们也很难获得。Python 并没有支持直接访问 CPU 硬件计数器（CPU 硬件计数器是指可编程 CPU 寄存器，用于测量性能指标，例如 CPU 指令）的公共库。另一方面，Linux 内核提供了 perf_event_open 系统调用。通过 Python ctypes 桥接技术能够让我们调用标准 C 库的系统调用函数 syscall，它也为我们提供了兼容 C 的数据类型，从而可以编程硬件计数器并从它们读取数据。使用 Dy…

5 个最受人喜爱的开源 Django 包
type: item
date: 2016-08-14T04:35:00+08:00
description: Django 围绕“可重用应用”的思想建立：自包含的包提供了可重复使用的特性。你可以将这些可重用应用组装起来，在加上适用于你的网站的特定代码，来搭建你自己的网站。Django 具有一个丰富多样的、由可供你使用的可重用应用组建起来的生态系统——PyPI 列出了超过 8000个 Django 应用——可你该如何知道哪些是最好的呢？为了节省你的时间，我们总结了五个最受喜爱的 Django 应用。它们是：Cookiecutter: 建立 Django 网站的最佳方式。Whitenoise: 最棒的静态资源服务器。Django Rest Framework: 使用 Django 开发 REST API 的最佳方式。Wagtail: 基于 Django 的最佳内容管理系统（CMS）。django-allauth: 提供社交账户登录的最佳应用（如 Twitter, Facebook, GitHub 等）。我们同样推荐你看看 Django Packages，这是一个可重用 Django 应用的目录。Django Packages 将 Django 应用组织成“表格”，你可以在功能相似的不同应用之间进行比较并做出选择。你可以查看每个包中提供的特性和使用统计情况。（比如：这是 REST 工具的表格，也许可以帮助你理解我们为何推荐 Django REST Framework。为什么你应该相信我们？我们使用 Django 的时间几乎比任何人都长。在 Django 发布之前，我们当中的两个人（Frank 和 Jacob）就在 Lawrence Journal-World （Django 的发源地）工作（事实上，是他们两人推动了 Django 开源发布的进程）。我们在过去的八年当中运行着一个咨询公司，来建议公司怎样最好地应用 Django。所以，我们见证了 Django 项目和社群的完整历史，我们见证了那些流行的软件包的兴起和没落。在我们三个之中，我们个人可能试用了 8000 个应用中至少一半以上，或者我们知道谁试用过这些。我们对如何使应用变得坚实可靠有着深刻的理解，并且我们对给予这些应用持久力量的来源也有着深入的了解。建立 Django 网站的最佳方式：Cookiecutter建立一个新项目或应用总是有些痛苦。你可以用 Django 内建的 startproject。不过，如果你像我们一样，对如何做事比较挑剔。Cookiecutter 为你提供了一个快捷简单的方式来构建项目或易于重用的应用模板，从而解决了这个问题。一个简单的例子：键入 pip install cookiecutter，然后在命令行中运行以下命令：$ cookiecutter https://github.com/marcofucci/cookiecutter-simple-django 接下来你需要回答几个简单的问题，比如你的项目名称、 目录 （ repo ） 、作者名字、E-Mail 和其他几个关于配置的小问题。这些能够帮你补充项目相关的细节。我们使用最最原始的 “foo” 作为我们的目录名称。所以 cokkiecutter 在子目录 “foo” 下建立了一个简单的 Django 项目。如果你在 “foo” 项目中闲逛，你会看见你刚刚选择的其它设置已通过模板，连同所需的子目录一同嵌入到文件当中。这个“模板”在我们刚刚在执行 cookiecutter 命令时输入的唯一一个参数 Github 仓库 URL 中定义。这个样例工程使用了一个 Github 远程仓库作为模板；不过你也可以使用本地的模板，这在建立非重用项目时非常有用。我们认为 cookiecutter 是一个极棒的 Django 包，但是，事实上其实它在面对纯 Python 甚至非 Python 相关需求时也极为有用。你能够将所有文件以一种可重复的方式精确地摆放在任何位置上，使得 cookiecutter 成为了一个简化（DRY）工作流程的极佳工具。最棒的静态资源服务器：Whitenoise多年来，托管网站的静态资源——图片、Javascript、CSS——都是一件很痛苦的事情。Django 内建的 django.views.static.serve 视图，就像 Django 文章所述的那样，“在生产环境中不可靠，所以只应为开发环境的提供辅助功能。”但使用一个“真正的” Web 服务器，如 NGINX 或者借助 CDN 来托管媒体资源，配置起来会比较困难。Whitenoice 很简洁地解决了这个问题。它可以像在开发环境那样轻易地在生产环境中设置静态服务器，并且针对生产环境进行了加固和优化。它的设置方法极为简单：确保你在使用 Django 的 contrib.staticfiles 应用，并确认你在配置文件中正确设置了 STATI…