轻量级Django 第二章代码

原代码是基于Django1.8,这里改用Django2.1,值得注意的一点是,书中很多地方是用元组包含数据,而Django默认模板中是使用字典,因为用元组导致过TemplateDoesNotExist报错,就统一改成跟默认模板一样用字典。

placeholder.py文件内容

import os
import sys
import hashlib

from django.conf import settings
from django.core.wsgi import get_wsgi_application

from django.http import HttpResponse, HttpResponseBadRequest
from django import forms
from io import BytesIO
from PIL import Image, ImageDraw
from django.views.decorators.http import etag
from django.urls import reverse
from django.shortcuts import render

from django.urls import path

from django.core.cache import cache


DEBUG = os.environ.get('DEBUG', 'on') == 'on'
SECRET_KEY = os.environ.get('SECRET_KEY', '!32!0g1$-o7r4te5jc2&b@7w8c6*xf75&)=k!%3o9(g6jm4&g-')
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', 'localhost').split(',')
BASE_DIR = os.path.dirname(os.path.abspath(__file__))


settings.configure(
    DEBUG=DEBUG,
    SECRET_KEY=SECRET_KEY,
    ALLOWED_HOSTS=ALLOWED_HOSTS,
    ROOT_URLCONF=__name__,
    MIDDLEWARE=[
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ],
    INSTALLED_APPS=[
        'django.contrib.staticfiles',
    ],
    TEMPLATES=[
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            # 要用[]而不是(),不然会出现TemplateDoesNotExist报错
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
        },
    ],
    STATICFILES_DIRS=[
        os.path.join(BASE_DIR, 'static'),
    ],
    STATIC_URL='/static/',
)


application = get_wsgi_application()


class ImageForm(forms.Form):
    height = forms.IntegerField(min_value=1, max_value=2000)
    width = forms.IntegerField(min_value=1, max_value=2000)

    def generate(self, image_format='PNG'):
        height = self.cleaned_data['height']
        width = self.cleaned_data['width']
        key = '{}.{}.{}'.format(width, height, image_format)
        content = cache.get(key)
        if content is None:
            image = Image.new('RGB', (width, height))
            draw = ImageDraw.Draw(image)
            text = '{} X {}'.format(width, height)
            textwidth, textheight = draw.textsize(text)
            if textwidth < width and textheight < height:
                texttop = (height - textheight) // 2
                textleft = (width - textwidth) // 2
                draw.text((textleft, texttop), text, fill=(255, 255, 255))
            content = BytesIO()
            image.save(content, image_format)
            content.seek(0)
            cache.set(key, content, 60*60)
        return content


def generate_etag(request, width, height):
    content = 'Placeholder: {0} x {1}'.format(width, height)
    return hashlib.sha1(content.encode('utf-8')).hexdigest()


@etag(generate_etag)
def placeholder(request, width, height):
    form = ImageForm({'height': height, 'width': width})
    if form.is_valid():
        image = form.generate()
        return HttpResponse(image, content_type='image/png')
    else:
        return HttpResponseBadRequest('Invalid Image Request')


def index(request):
    example = reverse('placeholder', kwargs={'width': 50, 'height': 50})
    print(example)
    context = {
        'example': request.build_absolute_uri(example),
    }
    return render(request, 'home.html', context)


urlpatterns = [
    path('', index, name='homepage'),
    path('image/<int:width>x<int:height>/', placeholder, name='placeholder'),
]


if __name__ == '__main__':
    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

home.html文件内容

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django Placeholder Images</title>
    <link rel="stylesheet" href="{% static 'site.css' %}" type="text/css">
</head>
<body>
<h1>Django Placeholder Images</h1>
<p>This server can be used for serving placeholder images for any web page.</p>
<p>To request a placeholder image of a given width and height simply include an image with the source pointing to
<b>/image/&lt;width&gt;x&lt;height&gt;/</b>on this server such as:</p>
<pre>&lt;img src="{{ example }}" &gt;</pre>
<h2>Examples</h2>
<ul>
    <li><img src="{% url 'placeholder' width=50 height=50 %}"></li>
    <li><img src="{% url 'placeholder' width=100 height=50 %}"></li>
    <li><img src="{% url 'placeholder' width=50 height=100 %}"></li>
</ul>
</body>
</html>

site.css文件内容

body{
    text-align: center;
}
ul{
    list-style: none;
}
li{
    display: inline-block;
}

 

Django 创建以来,各种各样的开源社区已经构建了很多Web 框架,比如JavaScript 社区创建的Angular.js 、Ember.js 和Backbone.js 之类面向前端的Web 框架,它们是现代Web 开发中的先驱。Django 从哪里入手来适应这些框架呢?我们如何将客户端MVC 框架整合成为当前的Django 基础架构? 本书讲述如何利用Django 强大的“自支持”功能体系。本书的目标是引导读者跨越认为Django 太繁重而无法进行快速应用开发的误区。从创建世界上最小的Django 应用到构建RESTful API ,本书将引导读者学习如何利用这种流行的Python Web 框架。 写这本书的目的 我们编写本书主要是出于对Django 的热爱。我们的社区是令人惊奇的,它有很多资源可以用来学习Django 和开发应用。尽管我们也喜欢包括官方的Django 文档在内的一些资源,但这仅仅是对Django 强大功能的过于关注,而非它的解耦设计。Django 是一个令人满意的框架,它带有很多用于构建Web 应用的通用程序。在本书中,我们要突出说明如何将这些组件进行分离和间接替换,并从中选出最适合创建应用的一些组件来。同样地,我们想要将Django 项目和应用的典型框架进行分解。我们的目标是使读者不再提出“我怎样用Django 完成我的X 工作”这样的问题,而是提出“Django 能帮我完成X 工作吗?如果不能,社区有可用的工具吗”这样的问题。 另外,我们想要回答的问题是利用大量客户端实时交互,以及与本地可移动应用匹配的组件构建更多应用时,将Django 放在网络的什么地方适用。作为框架,用户对Django 一无所知,这使得一些喜欢Django 的用户无法得到构建这种应用的指导。我们希望本书能够帮助解决这些问题,想看到Django 及其社区日益壮大,并在多年后大家也成为它的一员。 第1章,世界上最小的Django 项目。创建轻便简单的网络应用是本书的核心思想。在这一章,要创建一个可运行的单行文件“Hello World ”的Django 应用。 第2章,无状态的Web 应用。讲述占位符图像服务的创建方法。第2 章将引导读者通过创建无状态网络应用来生成占位符图像的URL 。 第3章,创建静态站点生成器。快速构建原型是一门有用的创建和辅助网络应用的技术。我们要通过创建静态网站生成器协助维护团队项目的方式来检验该技术的效果。 第4章,构建REST API 。REST API 是创建丰富的、具有内容相关性的网络应用的重要部分。在这一章我们利用Django 静态框架开始构建一个大比例的Scrum 板应用。 第5章,使用Backbone.js 的客户端Django 。本章继续讲述在第4 章中用新构建的RESTful API 创建的Backbone.js 应用。介绍创建新Backbone 应用的每个组件以及如何用Django 同步该客户端框架。 第6章,单页面Web 应用。单页面网络应用是一种能够创建丰富客户端网络应用的途径。在本章,我们将回到简单的Backbone 应用中,不断使这个单页面应用更加健壮。 第7章,实时Django 。这一章讲述创建响应实时交互的网络应用,为用户提供及时满意的服务。为了继续完成先前两章的项目,我们要将一个实时组件添加到使用网络插件和Tornado 的Scrum 板上,这是一个用Python 编写的异步网络库。 第8章,Django 和Tornado 通信。将强大的Django 与Tornado 的健壮特性相结合是创建可变、实时的Django 应用的重要标志。在本章中,我们将通过集成Django 的通信能力扩展Tornado 服务器的功能,来建立一种既安全又可交互的联系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值