Wagtail demo 安装指南

学习Wagtail最快的办法可能就是下载最新的Demo先进行体验了。

Demo地址:https://github.com/wagtail/bakerydemo

https://github.com/wagtail/bakerydemo.git
cd bakerydemo
pip install -r requirements.txt

Windows下安装可能会出现安装uwsgi提示 module ‘os’ has no attribute ‘uname’。解决办法是修改requirements/production.txt重新运行 pip install -r requirements.txt即可

接下来,我们将设置我们的本地环境变量。我们使用django-dotenv来解决这个问题。它读取位于项目顶层目录中的文件名.env中的环境变量。我们需要启动的唯一变量是DJANGO_SETTINGS_MODULE:

cp bakerydemo/settings/local.py.example bakerydemo/settings/local.py
echo "DJANGO_SETTINGS_MODULE=bakerydemo.settings.local" > .env

修改bakerydemo.settings.local.py中的数据库配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'bakerydemo',
        'USER': 'postgres',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

要设置数据库并加载初始数据,请运行以下命令:

./manage.py migrate
./manage.py load_initial_data
./manage.py runserver

使用 admin / changeme 登录到管理后台。

https中Mixed Content解决办法

问题描述

HTTPS页面里动态的引入HTTP资源,比如引入一个js文件,会被直接block掉的.在HTTPS页面里通过AJAX的方式请求HTTP资源,也会被直接block掉的。

解决办法

可以在相应的页面的里加上这句代码,意思是自动将http的不安全请求升级为https

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

nginx出现blocked for more than 120 seconds 以及 hung_task_timeout_secs错误解决办法

问题原因

默认情况下, Linux 会最多使用 40% 的可用内存作为文件系统缓存。当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的 IO 请求都是同步的。

将缓存写入磁盘时,有一个默认120 秒的超时时间。 出现上面的问题的原因是 IO 子系统的处理速度不够快,不能在 120 秒将缓存中的数据全部写入磁盘。

IO 系统响应缓慢,导致越来越多的请求堆积,最终系统内存全部被占用,导致系统失去响应。

解决办法

根据应用程序情况,对 vm.dirty_ratio,vm.dirty_background_ratio 两个参数进行调优设置。 例如,推荐如下设置:

# sysctl -w vm.dirty_ratio=10
# sysctl -w vm.dirty_background_ratio=5
# sysctl -p

如果系统永久生效,修改 /etc/sysctl.conf 文件。加入如下两行:

#vi /etc/sysctl.conf 
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

重启系统生效。

Wagtail介绍 — 基于Django的Python CMS

关于Wagtail

Wagtail是一个用Python编写的开源CMS,并构建在Django框架上。它是由开发者为开发者开发的,它为编辑提供了一个快速吸引人的界面,让编辑可以直观地创建和结构化内容。优雅、强大和敏捷——我们对Wagtail能提供的东西感到非常自豪。

为什么使用Wagtail

有很多优秀的开源内容管理系统。我们在大型网站上非常成功地使用Drupal,包括知名的非政府组织、筹款慈善机构、智库、大学和公共部门组织。还有一些优秀的Django CMS,包括Mezzanine, Fein和Django CMS,它们的开发人员社区很好,案例研究也令人印象深刻。

但是,在建立了14年的内容管理网站之后,我们对编辑的经验和CMS的工作方式和结构有了强烈的意见,我们需要通过对现有项目的贡献来管理一个比我们能够实现的更快的发展速度。

Django友好

Django自0.96年以来一直是Andrew Godwin的热情支持者和支持者,我们很自豪地将Django和Django等Django和Django等人都在我们的校友中。

在过去的5年里,Django一直是我们最喜欢的应用程序开发的平台,因为它继续为健壮的、快速的开发和编码乐趣所带来的甜蜜点。

Wagtail 提供

  • 使用标准的Django模板完全控制设计
  • 通过标准的Django模型配置内容类型
  • 与现有的Django应用程序的直接集成。

图像/文档管理

不要打断你的流程来添加媒体——直观设计

权限

简单且可配置,即使是复杂的需求

工作流

包括多站点和多语言支持

使用Wagtail

安装 Wagtail

pip install wagtail

建立站点

wagtail start mysite

设置数据

cd mysite
python manage.py migrate

创建管理账号

python manage.py createsuperuser
python manage.py runserver

现在,你可以登录 http://127.0.0.1:8000/admin/. 开始构建你的站点,或者查看我们的Wagtail10分钟指南

PHP用Imagck实现图片文字水平以及垂直集中

    $draw = new \ImagickDraw();
    $imagick = new \Imagick();
    $imagick->newImage($width, $height, new \ImagickPixel('none'));
    $draw->setFillColor($color);
    $draw->setFont($font_file);
    $draw->setFontSize($size);
    $draw->setTextEncoding('UTF-8');
    $stringArr = $this->mbStringToArray($text);
    $textHeight = 0;
    $textWidth = 0;
    $charCount = count($stringArr);
    $texts = [];
    foreach ($stringArr as $char) {
        $metrics = $imagick->queryFontMetrics($draw, $char, true);
        $charHeight = $metrics['textHeight'];
        $charWidth = $metrics['textWidth'];
        $textHeight += $charHeight;
        $textWidth += $charWidth;
        $texts[] = ['char' => $char, 'height' => $charHeight, 'width' => $charWidth];
    }

    if ($direction == 2) {
        if ($charCount > 1) {
            $textHeight += ($charCount - 1) * $space;
        }
        $draw->setTextAlignment(\Imagick::ALIGN_CENTER);
        $x = $size / 2;
        if ($textHeight > $height) {
            $offset = 0;
        } else {
            $offset = ($height - $textHeight) / 2;
        }
        $y = $offset;
        foreach ($texts as $c) {
            $y += $c['height'];
            $draw->annotation($x, $y, $c['char']);
            $y += $space;
        }
    } else {
        if ($charCount > 1) {
            $textWidth += ($charCount - 1) * $space;
        }
        $metrics = $imagick->queryFontMetrics($draw, $text, false);
        $y = $metrics['ascender'];
        $draw->setTextAlignment(\Imagick::ALIGN_LEFT);
        if ($align == \Imagick::ALIGN_CENTER) {
            if ($textWidth > $width) {
                $x = 0;
            } else {
                $x = ($width - $textWidth) / 2;
            }
        } elseif ($align == \Imagick::ALIGN_RIGHT) {
            $x = $width - $textWidth;
        } else {
            $x = 0;
        }
        foreach ($texts as $c) {
            $draw->annotation($x, $y, $c['char']);
            $x += $c['width'] + $space;
        }
    }
    $imagick->setImageFormat("png");
    $imagick->drawImage($draw);

    header("Content-Type: image/png");
    echo $imagick->getImageBlob();

Vagrant box国内镜像及本地安装教程

Vagrant是非常好的本地开发环境搭建工具。

通常使用官方下载都会比较慢,而国内box下载地址较少,所以我特别下载了几个传到百度网盘。

(目前官方已支持CDN加速,可能不太需要了)

国内镜像下载

官方直接下载

官方已经采用cdn加速

vagrant box add ubuntu/trusty64
vagrant box add ubuntu/trusty32
vagrant box add generic/ubuntu1804
vagrant box add generic/ubuntu1604

vagrant box add generic/centos7
vagrant box add generic/centos8
vagrant box add generic/centos8

vagrant box add generic/debian8
vagrant box add generic/debian10

下载后的使用方法

添加vagrant box到box list

vagrant box add centos7 CentOS-7.box

初始化一个虚拟机使用刚才添加的vagrant box

vagrant init centos7

启动vagrant box虚拟机

vagrant up

PHP生成一个透明背景的PNG图像(GD+Imagick)

使用GD

    header('Content-Type:image/png');
    $width = 300;
    $height = 300;
    $color = 'ff0000';
    $font_file = 'size.ttf';

    $im = imagecreatetruecolor($width, $height);
    $bg = imagecolorallocatealpha($im, 0, 0, 0, 127);
    imagefill($im, 0, 0, $bg);
    imagefttext($im, 33, 0, 150, 150, $color, $font_file, 'test');
    imagesavealpha($im, true);
    imagepng($im);
    imagedestroy($im);

使用imagick

    $draw = new \ImagickDraw();
    $imagick = new \Imagick();
    $imagick->newImage($width, $height, new \ImagickPixel('none'));
    $draw->setFillColor($color);
    $draw->setFont($font_file);
    $draw->setFontSize($size);
    $draw->setTextEncoding('UTF-8');
    $draw->annotation($x, $y, $text);
    header("Content-Type: image/png");
    echo $imagick->getImageBlob();