如何将DJANGO轻量级化

看看这本书,应该有收获。

不用DJANGO-ADMIN STARTPROJECT XXX

一个文件,一样可以写出可以运行的原生DJANGO哟。

import hashlib
import sys
import os

from io import BytesIO
from PIL import Image, ImageDraw

from django.conf import settings

DEBUG= os.environ.get('DEBUG', 'on') == 'on'
SECRET_KEY = os.environ.get('SECRET_KEY', os.urandom(32))
BASE_DIR = os.path.dirname(__file__)
settings.configure(
    DEBUG=DEBUG,
    SECRET_KEY=SECRET_KEY,
    ROOT_URLCONF=__name__,
    MIDDLEWARE_CLASSES=(
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'django.middleware.cache.CacheMiddleware',
        
        ),
    INSTALLED_APPS=(
        'django.contrib.staticfiles',
        ),
    TEMPLATE_DIRS=(
        os.path.join(BASE_DIR, 'templates'),
        ),
    STATICFILES_DIRS=(
        os.path.join(BASE_DIR, 'static'),
        ),
    STATIC_URL='/static/',
    # STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    )

from django import forms
from django.conf.urls import url
from django.core.cache import cache
from django.core.urlresolvers import reverse
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseBadRequest
from django.views.decorators.http import etag
from django.core.wsgi import 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})
    context = {
        'example': request.build_absolute_uri(example)
        }
    return render(request, 'home.html', context)

urlpatterns = (
    url(r'^$', index, name='home'),
    url(r'image/(?P<width>[0-9]+)x(?P<height>[0-9]+)/$',placeholder,
        name='placeholder'),
    )

application = get_wsgi_application()

if __name__ == '__main__':
    from django.core.management import execute_from_command_line
    
    execute_from_command_line(sys.argv)
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值