0% found this document useful (0 votes)
29 views

The Definitive Guide to Django Web Development Done Right 1st Edition Adrian Holovaty - The ebook version is available in PDF and DOCX for easy access

The document promotes the ebook 'The Definitive Guide to Django Web Development Done Right' by Adrian Holovaty, providing a link for download and highlighting its focus on simplifying web development with Django. It also lists additional recommended ebooks on various topics, including project management and JavaScript. The book aims to teach readers how to effectively use Django to create high-quality web applications efficiently.

Uploaded by

kashafcazrod
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
29 views

The Definitive Guide to Django Web Development Done Right 1st Edition Adrian Holovaty - The ebook version is available in PDF and DOCX for easy access

The document promotes the ebook 'The Definitive Guide to Django Web Development Done Right' by Adrian Holovaty, providing a link for download and highlighting its focus on simplifying web development with Django. It also lists additional recommended ebooks on various topics, including project management and JavaScript. The book aims to teach readers how to effectively use Django to create high-quality web applications efficiently.

Uploaded by

kashafcazrod
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 57

Visit ebookfinal.

com to download the full version and


explore more ebooks or textbooks

The Definitive Guide to Django Web Development


Done Right 1st Edition Adrian Holovaty

_____ Click the link below to download _____


https://ebookfinal.com/download/the-definitive-guide-to-
django-web-development-done-right-1st-edition-adrian-
holovaty/

Explore and download more ebooks or textbook at ebookfinal.com


Here are some recommended products that we believe you will be
interested in. You can click the link to download.

The Definitive Guide to Project Management The Fast Track


to Getting the Job Done on Time and on Budget 2nd Edition
Sebastian Nokes
https://ebookfinal.com/download/the-definitive-guide-to-project-
management-the-fast-track-to-getting-the-job-done-on-time-and-on-
budget-2nd-edition-sebastian-nokes/

JavaScript the Definitive Guide Activate Your Web Pages


6th ed Edition Flanagan

https://ebookfinal.com/download/javascript-the-definitive-guide-
activate-your-web-pages-6th-ed-edition-flanagan/

CSS the definitive Guide Visual Presentation for the Web


4th Edition Eric A. Meyer

https://ebookfinal.com/download/css-the-definitive-guide-visual-
presentation-for-the-web-4th-edition-eric-a-meyer/

The Definitive Guide to HTML5 1st Edition Adam Freeman

https://ebookfinal.com/download/the-definitive-guide-to-html5-1st-
edition-adam-freeman/
The Definitive Guide to JasperReports 1st Edition Teodor
Danciu

https://ebookfinal.com/download/the-definitive-guide-to-
jasperreports-1st-edition-teodor-danciu/

Leveraging Drupal Getting Your Site Done Right Wrox


Programmer to Programmer 1st Edition Victor Kane

https://ebookfinal.com/download/leveraging-drupal-getting-your-site-
done-right-wrox-programmer-to-programmer-1st-edition-victor-kane/

The Definitive Guide to Xen Hypervisor 1st Edition David


Chisnall

https://ebookfinal.com/download/the-definitive-guide-to-xen-
hypervisor-1st-edition-david-chisnall/

The Definitive Guide to Drupal 7 1st Edition Benjamin


Melancon

https://ebookfinal.com/download/the-definitive-guide-to-drupal-7-1st-
edition-benjamin-melancon/

Professional Python Frameworks Web 2 0 Programming with


Django and Turbogears Programmer to Programmer 1st Edition
Moore
https://ebookfinal.com/download/professional-python-frameworks-
web-2-0-programming-with-django-and-turbogears-programmer-to-
programmer-1st-edition-moore/
The Definitive Guide to Django Web Development Done
Right 1st Edition Adrian Holovaty Digital Instant
Download
Author(s): Adrian Holovaty, Jacob Kaplan-Moss
ISBN(s): 9781590597255, 1590597257
Edition: 1
File Details: PDF, 4.13 MB
Year: 2007
Language: english
 CYAN  YELLOW
 MAGENTA BLACK
 PANTONE 123 C

Books for professionals by professionals ® The EXPERT’s VOIce ® in Web Development


Companion
eBook Available

The Definitive Guide to Django:

The Definitive Guide to


Web Development Done Right
The Definitive Guide to
Dear Reader,

This book is about Django, a Web development framework that saves you time
and makes Web development a joy. Using Django, you can build and maintain
high-quality Web applications with minimal fuss.
At its best, Web development is an exciting, creative act; at its worst, it can
be a repetitive, frustrating nuisance. Django lets you focus on the fun stuff—the
crux of your Web application—while easing the pain of the repetitive bits. In
doing so, it provides high-level abstractions of common Web development patterns,
shortcuts for frequent programming tasks, and clear conventions for how to
solve problems. At the same time, Django tries to stay out of your way, letting
you work outside the scope of the framework as needed.
The goal of this book is to make you a Django expert. The focus is twofold.
First, we explain, in depth, what Django does and how to build Web applications
with it. Second, we discuss higher-level concepts where appropriate, answering
the question “How can I apply these tools effectively in my own projects?” By
reading this book, you’ll learn the skills needed to develop powerful Web sites

Django
quickly, with code that is clean and easy to maintain.

Adrian Holovaty and Jacob Kaplan-Moss


Web Development Done Right
THE APRESS ROADMAP

The Definitive Guide


Beginning Python
to Django Django is a framework that saves you time
Companion eBook and makes Web development a joy
Foundations of Python
Dive Into Python
Network Programming

See last page for details


on $10 eBook version

Kaplan-Moss Adrian Holovaty


Holovaty,
SOURCE CODE ONLINE ISBN-13: 978-1-59059-725-5
www.apress.com ISBN-10: 1-59059-725-7

and Jacob Kaplan-Moss


54499

US $44.99

Shelve in Benevolent Dictators for Life, Django


Python

User level:
9 781590 597255
Beginner–Intermediate

this print for content only—size & color not accurate spine = 0.909" 480 page count
7257ch00FM.qxd 11/9/07 12:37 PM Page i

The Definitive Guide


to Django
Web Development Done Right

Adrian Holovaty and Jacob Kaplan-Moss


7257ch00FM.qxd 11/9/07 12:37 PM Page ii

The Definitive Guide to Django: Web Development Done Right


Copyright © 2008 by Adrian Holovaty and Jacob Kaplan-Moss
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN-13 (pbk): 978-1-59059-725-5
ISBN-10 (pbk): 1-59059-725-7
ISBN-13 (electronic): 978-1-4302-0331-5
ISBN-10 (electronic): 1-4302-0331-5
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Lead Editor: Jason Gilmore
Technical Reviewer: Jeremy Dunck
Editorial Board: Steve Anglin, Ewan Buckingham, Tony Campbell, Gary Cornell, Jonathan Gennick,
Jason Gilmore, Kevin Goff, Jonathan Hassell, Matthew Moodie, Joseph Ottinger, Jeffrey Pepper,
Ben Renow-Clarke, Dominic Shakeshaft, Matt Wade, Tom Welsh
Project Manager | Production Director: Grace Wong
Copy Editor: Nicole Flores
Associate Production Director: Kari Brooks-Copony
Production Editor: Ellie Fountain
Compositor and Artist: Kinetic Publishing Services, LLC
Proofreaders: Lori Bring and Christy Wagner
Indexer: Brenda Miller
Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail [email protected], or
visit http://www.springeronline.com.
For information on translations, please contact Apress directly at 2855 Telegraph Avenue, Suite 600, Berkeley,
CA 94705. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected], or visit http://www.apress.com.
The information in this book is distributed on an “as is” basis, without warranty. Although every precau-
tion has been taken in the preparation of this work, neither the author(s) nor Apress shall have any
liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly
or indirectly by the information contained in this work.
The source code for this book is available to readers at http://www.apress.com and at
http://www.djangobook.com.
7257ch00FM.qxd 11/9/07 12:37 PM Page iii
7257ch00FM.qxd 11/9/07 12:37 PM Page iv

Contents at a Glance

About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii


About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxviii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi

PART 1 ■■■ Getting Started


■CHAPTER 1 Introduction to Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
■CHAPTER 2 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
■CHAPTER 3 The Basics of Dynamic Web Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
■CHAPTER 4 The Django Template System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
■CHAPTER 5 Interacting with a Database: Models . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
■CHAPTER 6 The Django Administration Site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
■CHAPTER 7 Form Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
■CHAPTER 8 Advanced Views and URLconfs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

PART 2 ■■■ Django’s Subframeworks


■CHAPTER 9 Generic Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
■CHAPTER 10 Extending the Template Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
■CHAPTER 11 Generating Non-HTML Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
■CHAPTER 12 Sessions, Users, and Registration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
■CHAPTER 13 Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
■CHAPTER 14 Other Contributed Subframeworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
■CHAPTER 15 Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
■CHAPTER 16 Integrating with Legacy Databases and Applications . . . . . . . . . . . 235
■CHAPTER 17 Extending Django’s Admin Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
■CHAPTER 18 Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
■CHAPTER 19 Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
■CHAPTER 20 Deploying Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
iv
7257ch00FM.qxd 11/9/07 12:37 PM Page v

PART 3 ■■■ Appendixes


■APPENDIX A Case Studies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
■APPENDIX B Model Definition Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
■APPENDIX C Database API Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
■APPENDIX D Generic View Reference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
■APPENDIX E Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
■APPENDIX F Built-in Template Tags and Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
■APPENDIX G The django-admin Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
■APPENDIX H Request and Response Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425

■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433

v
7257ch00FM.qxd 11/9/07 12:37 PM Page vi
7257ch00FM.qxd 11/9/07 12:37 PM Page vii

Contents

About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii


About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxviii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi

PART 1 ■■■ Getting Started


■CHAPTER 1 Introduction to Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
What Is a Web Framework? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
The MVC Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Django’s History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
How to Read This Book. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Required Programming Knowledge . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Required Python Knowledge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
New Django Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Getting Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

■CHAPTER 2 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11


Installing Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Installing Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Installing an Official Release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Installing Django from Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Setting Up a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Using Django with PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Using Django with SQLite 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Using Django with MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Using Django Without a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Starting a Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
The Development Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

vii
7257ch00FM.qxd 11/9/07 12:37 PM Page viii

viii ■CONTENTS

■CHAPTER 3 The Basics of Dynamic Web Pages . . . . . . . . . . . . . . . . . . . . . . . . 17


Your First View: Dynamic Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Mapping URLs to Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
How Django Processes a Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
How Django Processes a Request: Complete Details . . . . . . . . . . . . 22
URLconfs and Loose Coupling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
404 Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Your Second View: Dynamic URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
A Word About Pretty URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Wildcard URLpatterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Django’s Pretty Error Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

■CHAPTER 4 The Django Template System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

Template System Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31


Using the Template System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Creating Template Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Rendering a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Multiple Contexts, Same Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Context Variable Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Playing with Context Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Basic Template Tags and Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Philosophies and Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Using Templates in Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Template Loading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
render_to_response() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
The locals() Trick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Subdirectories in get_template() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
The include Template Tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Template Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

■CHAPTER 5 Interacting with a Database: Models . . . . . . . . . . . . . . . . . . . . . . 59


The “Dumb” Way to Do Database Queries in Views . . . . . . . . . . . . . . . . . . 59
The MTV Development Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Configuring the Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Your First App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
7257ch00FM.qxd 11/9/07 12:37 PM Page ix

■CONTENTS ix

Defining Models in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65


Your First Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Installing the Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Basic Data Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Adding Model String Representations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Inserting and Updating Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Selecting Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Filtering Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Retrieving Single Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Ordering Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Chaining Lookups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Slicing Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Deleting Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Making Changes to a Database Schema. . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Adding Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Removing Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Removing Many-to-Many Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Removing Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

■CHAPTER 6 The Django Administration Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83


Activating the Admin Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Using the Admin Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Users, Groups, and Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Customizing the Admin Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Customizing the Admin Interface’s Look and Feel . . . . . . . . . . . . . . . . . . . . 93
Customizing the Admin Index Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
When and Why to Use the Admin Interface . . . . . . . . . . . . . . . . . . . . . . . . . . 94
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

■CHAPTER 7 Form Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95


Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
The “Perfect Form” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Creating a Feedback Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Processing the Submission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Custom Validation Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
A Custom Look and Feel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Creating Forms from Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7257ch00FM.qxd 11/9/07 12:37 PM Page x

x ■CONTENTS

■CHAPTER 8 Advanced Views and URLconfs . . . . . . . . . . . . . . . . . . . . . . . . . . . 107


URLconf Tricks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Streamlining Function Imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Using Multiple View Prefixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Special-Casing URLs in Debug Mode . . . . . . . . . . . . . . . . . . . . . . . . . 109
Using Named Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Understanding the Matching/Grouping Algorithm . . . . . . . . . . . . . . 112
Passing Extra Options to View Functions . . . . . . . . . . . . . . . . . . . . . . 112
Using Default View Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Special-Casing Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Capturing Text in URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Determining What the URLconf Searches Against . . . . . . . . . . . . . . 119
Including Other URLconfs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
How Captured Parameters Work with include() . . . . . . . . . . . . . . . . 121
How Extra URLconf Options Work with include() . . . . . . . . . . . . . . . 121
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

PART 2 ■■■ Django’s Subframeworks


■CHAPTER 9 Generic Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Using Generic Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Generic Views of Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Extending Generic Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Making “Friendly” Template Contexts . . . . . . . . . . . . . . . . . . . . . . . . 128
Adding Extra Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Viewing Subsets of Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Complex Filtering with Wrapper Functions . . . . . . . . . . . . . . . . . . . . 131
Performing Extra Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

■CHAPTER 10 Extending the Template Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . 135


Template Language Review. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
RequestContext and Context Processors. . . . . . . . . . . . . . . . . . . . . . . . . . . 136
django.core.context_processors.auth . . . . . . . . . . . . . . . . . . . . . . . . 140
django.core.context_processors.debug . . . . . . . . . . . . . . . . . . . . . . . 140
django.core.context_processors.i18n . . . . . . . . . . . . . . . . . . . . . . . . 140
django.core.context_processors.request. . . . . . . . . . . . . . . . . . . . . . 141
Guidelines for Writing Your Own Context Processors . . . . . . . . . . . . 141
7257ch00FM.qxd 11/9/07 12:37 PM Page xi

■CONTENTS xi

Inside Template Loading. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141


Extending the Template System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Creating a Template Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Writing Custom Template Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Writing Custom Template Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Shortcut for Simple Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Inclusion Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Writing Custom Template Loaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Using the Built-in Template Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Configuring the Template System in Standalone Mode . . . . . . . . . . . . . . 154
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

■CHAPTER 11 Generating Non-HTML Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157


The Basics: Views and MIME Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Producing CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Generating PDFs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Installing ReportLab. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Writing Your View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Complex PDFs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Other Possibilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
The Syndication Feed Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
A Simple Feed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
A More Complex Feed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Specifying the Type of Feed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Enclosures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Publishing Atom and RSS Feeds in Tandem . . . . . . . . . . . . . . . . . . . 168
The Sitemap Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Sitemap Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Shortcuts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Creating a Sitemap Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Pinging Google . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
7257ch00FM.qxd 11/9/07 12:37 PM Page xii

xii ■CONTENTS

■CHAPTER 12 Sessions, Users, and Registration . . . . . . . . . . . . . . . . . . . . . . . . 175


Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Getting and Setting Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
The Mixed Blessing of Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Django’s Session Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Enabling Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Using Sessions in Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Setting Test Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Using Sessions Outside of Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
When Sessions Are Saved . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Browser-Length Sessions vs. Persistent Sessions . . . . . . . . . . . . . . 182
Other Session Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Users and Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Enabling Authentication Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Using Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Logging In and Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Limiting Access to Logged-in Users . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Limiting Access to Users Who Pass a Test. . . . . . . . . . . . . . . . . . . . . 189
Managing Users, Permissions, and Groups . . . . . . . . . . . . . . . . . . . . 190
Using Authentication Data in Templates . . . . . . . . . . . . . . . . . . . . . . 193
The Other Bits: Permissions, Groups, Messages, and Profiles . . . . . . . . . 193
Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

■CHAPTER 13 Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197


Setting Up the Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Memcached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Database Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Filesystem Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Local-Memory Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Simple Caching (for Development) . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Dummy Caching (for Development) . . . . . . . . . . . . . . . . . . . . . . . . . . 200
CACHE_BACKEND Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
The Per-Site Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
The Per-View Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Specifying Per-View Cache in the URLconf . . . . . . . . . . . . . . . . . . . . 203
7257ch00FM.qxd 11/9/07 12:37 PM Page xiii

■CONTENTS xiii

The Low-Level Cache API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203


Upstream Caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Using Vary Headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Other Cache Headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Other Optimizations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Order of MIDDLEWARE_CLASSES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

■CHAPTER 14 Other Contributed Subframeworks . . . . . . . . . . . . . . . . . . . . . . . 209


The Django Standard Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Sites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Scenario 1: Reusing Data on Multiple Sites . . . . . . . . . . . . . . . . . . . 210
Scenario 2: Storing Your Site Name/Domain in One Place . . . . . . . 211
How to Use the Sites Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
The Sites Framework’s Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . 212
CurrentSiteManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
How Django Uses the Sites Framework . . . . . . . . . . . . . . . . . . . . . . . 216
Flatpages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Using Flatpages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Adding, Changing, and Deleting Flatpages . . . . . . . . . . . . . . . . . . . . 218
Using Flatpage Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Redirects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Using the Redirects Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Adding, Changing, and Deleting Redirects . . . . . . . . . . . . . . . . . . . . 220
CSRF Protection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
A Simple CSRF Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
A More Complex CSRF Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Preventing CSRF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Form Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
django.contrib.formtools.preview . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Using FormPreview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Humanizing Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
apnumber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
intcomma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
intword. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
ordinal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Markup Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
7257ch00FM.qxd 11/9/07 12:37 PM Page xiv

xiv ■CONTENTS

■CHAPTER 15 Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227


What’s Middleware? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Middleware Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Middleware Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Initializer: __init__(self) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Request Preprocessor: process_request(self, request) . . . . . . . . . . 229
View Preprocessor:
process_view(self, request, view, args, kwargs) . . . . . . . . . . . . . 229
Response Postprocessor:
process_response(self, request, response) . . . . . . . . . . . . . . . . . 230
Exception Postprocessor:
process_exception(self, request, exception) . . . . . . . . . . . . . . . . 230
Built-in Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Authentication Support Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . 231
“Common” Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Compression Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Conditional GET Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Reverse Proxy Support (X-Forwarded-For Middleware) . . . . . . . . . 232
Session Support Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Sitewide Cache Middleware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Transaction Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
“X-View” Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

■CHAPTER 16 Integrating with Legacy Databases


and Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Integrating with a Legacy Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Using inspectdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Cleaning Up Generated Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Integrating with an Authentication System . . . . . . . . . . . . . . . . . . . . . . . . . 237
Specifying Authentication Back-Ends. . . . . . . . . . . . . . . . . . . . . . . . . 237
Writing an Authentication Back-End . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Integrating with Legacy Web Applications. . . . . . . . . . . . . . . . . . . . . . . . . . 239
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
7257ch00FM.qxd 11/9/07 12:37 PM Page xv

■CONTENTS xv

■CHAPTER 17 Extending Django’s Admin Interface . . . . . . . . . . . . . . . . . . . . . 241


The Zen of Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
“Trusted users . . .” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
“. . . editing . . .” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
“. . . structured content” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Full Stop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Customizing Admin Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Custom Model Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Custom JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Creating Custom Admin Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Overriding Built-in Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249

■CHAPTER 18 Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251


Specifying Translation Strings in Python Code . . . . . . . . . . . . . . . . . . . . . . 252
Standard Translation Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Marking Strings As No-op . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Lazy Translation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Pluralization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Specifying Translation Strings in Template Code . . . . . . . . . . . . . . . . . . . . 254
Creating Language Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Creating Message Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Compiling Message Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
How Django Discovers Language Preference. . . . . . . . . . . . . . . . . . . . . . . 258
The set_language Redirect View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Using Translations in Your Own Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Translations and JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
The javascript_catalog View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Using the JavaScript Translation Catalog . . . . . . . . . . . . . . . . . . . . . 263
Creating JavaScript Translation Catalogs . . . . . . . . . . . . . . . . . . . . . 263
Notes for Users Familiar with gettext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264

■CHAPTER 19 Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265


The Theme of Web Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
SQL Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
7257ch00FM.qxd 11/9/07 12:37 PM Page xvi

xvi ■CONTENTS

Cross-Site Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267


The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Cross-Site Request Forgery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Session Forging/Hijacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Email Header Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Directory Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Exposed Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
A Final Word on Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

■CHAPTER 20 Deploying Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275


Shared Nothing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
A Note on Personal Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Using Django with Apache and mod_python . . . . . . . . . . . . . . . . . . . . . . . 278
Basic Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Running Multiple Django Installations on the Same
Apache Instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Running a Development Server with mod_python. . . . . . . . . . . . . . 280
Serving Django and Media Files from the Same
Apache Instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Error Handling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Handling a Segmentation Fault . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Using Django with FastCGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
FastCGI Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Running Your FastCGI Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Using Django with Apache and FastCGI . . . . . . . . . . . . . . . . . . . . . . . 284
FastCGI and lighttpd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Running Django on a Shared-Hosting Provider with Apache . . . . . 287
Scaling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Running on a Single Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Separating Out the Database Server . . . . . . . . . . . . . . . . . . . . . . . . . 289
Running a Separate Media Server . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Implementing Load Balancing and Redundancy . . . . . . . . . . . . . . . 290
Going Big . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
7257ch00FM.qxd 11/9/07 12:37 PM Page xvii

■CONTENTS xvii

Performance Tuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293


There’s No Such Thing As Too Much RAM . . . . . . . . . . . . . . . . . . . . . 293
Turn Off Keep-Alive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Use Memcached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Use Memcached Often . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Join the Conversation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

PART 3 ■■■ Appendixes


■APPENDIX A Case Studies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297

Cast of Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297


Why Django? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Porting Existing Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
How Did It Go? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Team Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303

■APPENDIX B Model Definition Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305

Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Field Name Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
AutoField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
BooleanField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
CharField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
CommaSeparatedIntegerField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
DateField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
DateTimeField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
EmailField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
FileField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
FilePathField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
FloatField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
ImageField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
IntegerField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
IPAddressField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
NullBooleanField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
PhoneNumberField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
PositiveIntegerField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
7257ch00FM.qxd 11/9/07 12:37 PM Page xviii

xviii ■CONTENTS

PositiveSmallIntegerField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
SlugField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
SmallIntegerField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
TextField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
TimeField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
URLField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
USStateField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
XMLField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Universal Field Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
blank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
choices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
db_column . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
db_index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
editable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
help_text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
primary_key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
radio_admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
unique_for_date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
unique_for_month . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
unique_for_year. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
verbose_name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Many-to-One Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Many-to-Many Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Model Metadata Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
db_table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
db_tablespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
get_latest_by . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
order_with_respect_to . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
ordering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
unique_together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
verbose_name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
verbose_name_plural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Manager Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Custom Managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Discovering Diverse Content Through
Random Scribd Documents
The Project Gutenberg eBook of Mainio
kertomus suutarimestari Siimeon Lestin
syntymästä ja sankarillisesta elämästä
This ebook is for the use of anyone anywhere in the United States
and most other parts of the world at no cost and with almost no
restrictions whatsoever. You may copy it, give it away or re-use it
under the terms of the Project Gutenberg License included with this
ebook or online at www.gutenberg.org. If you are not located in the
United States, you will have to check the laws of the country where
you are located before using this eBook.

Title: Mainio kertomus suutarimestari Siimeon Lestin syntymästä ja


sankarillisesta elämästä

Author: Viljo Kojo

Release date: February 4, 2024 [eBook #72874]

Language: Finnish

Original publication: Helsinki: Otava, 1926

Credits: Tuula Temonen

*** START OF THE PROJECT GUTENBERG EBOOK MAINIO


KERTOMUS SUUTARIMESTARI SIIMEON LESTIN SYNTYMÄSTÄ JA
SANKARILLISESTA ELÄMÄSTÄ ***
MAINIO KERTOMUS SUUTARIMESTARI SIIMEON LESTIN SYNTYMÄSTÄ JA

SANKARILLISESTA ELÄMÄSTÄ
Hänen omakätisen runomuotoisen memoaarinsa mukaan

Kirj.

VILJO KOJO

Helsingissä, Kustannusosakeyhtiö Otava, 1926.


ENSIMMÄINEN LUKU

Suutari Siimeon Lesti on mestari suuri kooltaan ei, vaan tarkoitan:


suutari jumalan armosta juuri — suutari, jolla ei missään maailman
nurkassa vertaa, suutari, joka voi kaikki muut suutarit tiedossa,
taidossa mollata kymmenen kertaa.

Suutarimestari tämä on syntynyt saamaan ihmeitä aikaan, ihmeitä,


joittenka takia häntä vois noidaksi luulla, jos uskoisi johonkin
taikaan, luulla: tuo mies se on varmaan sielunsa pirulle myönyt;
mutta ken sellaista uskoo, jopa on kirveensä kerrassa kivehen lyönyt.

*****

Silloin kun Siimeon syntyi — savusaunassa tietenkin niinkuin sinä


tai minä — kesäpäivät silloin loisteli lämpöisinä, ei merkkiä taivaalla
mitään öin eikä päivin sinä kesänä nähty, katsoitpa länteen tai itään.

Merkkiä muuta ei ollut kuin rinnassa piltin pienen yks lestin kuva,
kuva päivä päivältä yhä vain tummentuva. Suku töllisti merkkiä sitä,
mut selvää ei tullut. Kuoleman merkkinä vain piti lestiä muutamat
hullut.
Niinpä ei äiti tulkinnut merkkiä juuri: pojasta tästä on tuleva
suutari suuri — niin hän uskoi, mutta ei virkkanut mitään, ennenkuin
Siimeon kasvoi ja varttui ja kaikkien ihmeeksi saappaan tekohon heti
kuin mestari tarttui.

Lapsena Siimeon yöt sekä päivät rääkyi, suu auki korvia myöten
kuin eksynyt pässi hän määkyi. Hyvä ei auttanut, pahasta parku vain
nousi, sama, jos sylissä kantoi tai häntä suuressa sinisessä lullassa
sousi.

Kotimökkiin se ääni ei millään mahtua voinut: koko kylässä ei sitä


seinää, jonka hirsistä ei olis kiljunta kaikuna soinut. Naapurit
suuttuivat, sättivät kakaraa jos vaikka miksi, aavistamatta, että he
poikaa kerran kumartaa saavat ja sanoa mestariksi.

Vuosia kaksi: tulipa huudosta loppu, mut pian ilmeni toinen jo


harmi ja hoppu. Tuskinpa huokaista ehtivät naapurit tuosta, kun
alkoi jo Siimeon kylässä kaikkien kiusana juosta.

Ikkunaruudut hän pirstaksi kivillä viskoi, mansikkamaista hän


pensaat marjoineen, juurineen kiskoi. Kissan jos kiinni vain sai, heti
hännän hän katkoi, kanat kaikki paljaspyllyiksi äkkiä raastoi ja ratkoi.

Ukkojen tervatut kengät hän hapanmaitotiinuihin peitti. Simon


löytämän sammakon emännät kiukkuiset monasti rokassa keitti. Jos
oli lampaitten villoissa takkiaistulloja myötä, niin heti arvattiin: se on
tietenkin Lestin Siimeonin siivoa työtä.

Äiti ei vitsahan tarttunut. Jopahan toki! Vitsan kipua itse hän


liiankin usein lapsena koki. Naapuri jokainen vihalla kohteli poikaa ja
pilkalla pisti, silläpä entistä hullumpi tenavasta tuosta vain saatiin
kiusa ja risti.
Jos joku uskalsi Siimeonin äidille kieliä kantaa, äksysti eukko
jok'ainoan sanan kuin myrkkynä osasi takaisin antaa:

»Jokainen teistä», hän sanoi, »pilkalla köyhän pentua katsoi ja


tyrkki, siksipä varoa saatte ja pelätä vielä, kun kasvaa sen nyrkki».

Joskuspa kylässä piiskattiin tätä mokomaa lasta, mutta voi


kuitenkin: silloinpa hänestä vastus saatiinkin vasta. Silloin hän yltyi,
silloin hän, nähkääpäs, suuttui, ja silloinpa kylä kuin kiehuvaks
helvetiks muuttui.

Silloin jo kissat ja kanat ne hirttonuorassa riippui, isännän parhaat


saappaat korkean viirin huipussa viippui, lantut ja nauriit tuo riivattu
pelloilla listi, siat tuli hulluiksi, pyörivät, kiljuivat, Siimeonin
tulkkaama neula kun saparossa istui ja pisti.

Verkot ja rysät hän repi ja veneet hän vesille kiskoi, mitä vain
rannoilta löysi, kaikki hän aaltojen vietäväks viskoi. Sisälle uunit
savun kaikki lykkäsi, tietty ei miksi, ennenkuin huomattiin, että
Siimeon katoille kiipi ja piippuihin säkkiä, sammalta lykkäsi
tukkehiksi.

Vaivalla kuivatut heinät hän ladoista sateeseen heitti, haravat,


hangot ja työkalut yleensä kaikki hän särki tai iäksi peitti. Terävät
kirveet ilokseen hakkaili kiviin, juomansa kananmunat asetteli aitan
rapuille kauniisti riviin.

Niinpä hän kylässä tuhot sai aikahan moiset, vieläpä kanssaan


kujeisiin näihin hän villitsi myös pojat toiset. Hirmuista sortoa
harjoittivat nämä pikkuiset pirut, neuvoille, käskyille, kurille, uhkalle
antaen pitkät lirut.
Kunnes se sattui se kutsumus oikea Siimeoniin kohti, kutsumus,
jota jo äiti syntymämerkistä pohti: Sattuipa suutari, koiranleuka ja
vekkuli taloon, vetäen piankin Siimeonin lahjat oikeaan valoon.
TOINEN LUKU

Sanoi se suutari: »Kuuleppas, Siimeon, tässä on suutarinmarkka.


Sen sinä saat, jos osannet olla nyt oikein viisas ja tarkka. Jos osaat
narrata tunniksi tieheen ukon ja akan, piikin saat ja saat vielä lisäksi
oppia konstit käytössä naskalin, virven ja lakan.»

Siimeon verensä viemänä aina on ilolla katsonut suutarin työtä,


katsonut arvonannolla, hengessä ollen myötä. Räätälit saksiaan,
neulojaan, rantojaan, syyrinkeitänsä varoa saivat, suutarille ei
koskaan Siimeonin takia koituneet mitkään harmit, ei vaivat.

Ei, sillä ammattivaisto jo Siimeonin verissä sykki. Hartaana,


siivona, tarkkaavaisena suutarin vieressä aina hän kykki. Ihmekö siis,
jos ihan auliisti auttoi hän suutarin tästä, talon veikeän tyttären takia
tulleesta pälkähästä.

Silmääpä iski vain Siimeon suutarille, liittoon pääsivät


kunniakkaaseen Ruuskasen Kalle ja Laasosen Ville. Siinäpä meni vain
yksi sen siunaama hetki: ukolle nauriskaskeen, akalle hernepeltoon
tuli jo kiukkuisa retki.

Kalle ja Ville ne juoksutti ukko parkaa: heti kun kiinni on


saamassa, silloin nuo saamarit karkaa. Herneessä Siimeon itse
käpäliään käytti, antausi, karkasi, itki ja nauroi ja pitkiä neniä
kimmassa kiehuvan eukon kiusaksi näytti.

Siimeon toisessa talossa palkkansa kantoi, ja suutari, aivan kuin


luvannut oli, saappaan teossa ilmaista oppia antoi. Suutarin temput
kaikki ne Siimeoniin kuin piki virpehen tarttui, salaisimmatkin
ammattitiedot tuon naskalin päähän kuin väkisin karttui.

Nytpä jo kohta naapurit kummia kuuli: mestarisuutariks vintiö tuo,


jota jokainen mihinkään kelpaamattomaks luuli. Saappaan se
kädestään, kuulkaahan, sellaisen päästää, että sen nähtyään
jokainen moitteensa säästää.

Saappaan sellaisen teki Siimeon, tuo pojan nappi, että sen


kunniakseen olis pitänyt vaikkapa pappi: keltainen tikki saumoissa oli
kuin pistämä koneen, pohjat kun naulata nappasi, eipä vain kahdesti
naulahan iskenyt moneen.

Siinäpäs saapas! Puolin ja toisin kelpasi sitä jo katsoa, koittaa.


»Siimeon», sanottiin, »mestarin itsensä kohta jo taidossa voittaa».
Se oli totta. Tiedossa Siimeonin oli jo maalaissuutarin jokainen niksi.
Mut se ei riittänyt pojalle, sillä suureksi tulla Siimeon tahtoi
suutarimestariksi.

Pian siis Siimeon pillit pussikin pisti ja lähti suureen kaupunkiin


uskoen, että hän sielläkin loistaa kuin mikä pyrstötähti, nousee kuin
vehnäinen taikina maineen tiellä, yhdessä virven viuhkeessa löytää
onnen ja rikkauden siellä.
KOLMAS LUKU

Mut jopa erehtyi Siimeon ottamaan pirulta pestin: kuukauden kaksi


purkaa ja paikata sai tahi naulata höstejä reunoihin lestin, virpiä
tehdä ja viilata taittuneet naskalit teräviksi jälleen. Niinpä siis
Siimeonin ylpeä nousu se alkoi murheen merkeissä tälleen.

Ei hyvä sillä: mestari moitti ja piinasi päivällä, yöllä, haukkui ja


voiteli pemppua pitkin ja poikin tikkausvyöllä. Voi sitä kurjuutta!
Karkuun ois Siimeon halunnut juosta, mut oli mestari
oppilasjoukkoaan kuritushuoneella uhannut tuosta.

Entäpäs mestarin matami! Voi sitä akkaa! Se se vasta poikia


kurissa pitää ja patukalla hakkaa. Paha peri, jos ken ei mestarin
käskyjä kuullut, pahempi vielä, jos ei jo ajoissa matamia talossa
isännäks luullut.

Simo toki, silloin kun lyötiin, huusi ja potki, hyppi ja verstassa joka
paikan mullin mallin sotki. Paljon se auttanut ei, toki hiukan verran:
meteliä peläten anteeksi pienemmät temput jo annettiin muutaman
kerran.

Mestari poikien työllä vain ryöväsi rahaa kuin roskaa, voita ja


läskiä söi, mutta pojat ei eteensä saaneet muuta kuin kuivuneet
leivät ja jotakin moskaa. Toiveet sälliksi tulosta, mestarin kirjoista
jäivät, haihtuivat sikäli sinnemmäs mikäli kuluivat päivät.

Vuosia kolme, neljäkin katosi niinkuin suohon. Lauhtui jo


Siimeonin sisu, tylsästi tyytyi hän orjana olemiseen tuohon.
Kunnekka vihdoinkin, onneksi, mestari sairastui sekä kuoli, ja ihme ja
kumma: tulipa hänelle ennen kuolemaa Siimeonin mestarinkirjoista
huoli.

Huoli se juolahti mestarin mielehen komentamalla —


kuolemanhetkeensä asti hän olihan matamin tohvelin alla. Matami,
hänpä se mestarin sydämen jalosti silleen, että mestari jälkeensä
mestarin arvoa suositti Lestille, »parhaalle kisällilleen».

Kun oli paperi valmis, niin heti matami kysyä muisti, vieläkö
ollenkaan avittamatta ja alusta loppuun mestarin viimeinen isämeitä
luisti. Hän sanoi sen aivan kuin sanonut miehelle oisi, että tämä
vihdoinkin siitä jo pikemmin lähteä voisi.

Mestarin kuolema siis oli Lestille onnen potku, vaikkapa jälkeen


sen heti sattui hankala, huolekas, sitkeä sotku. Mutta se osaltaan
sekin vain lujitti mestarin asemaa, avitti miestä, joka ei ole orjaksi
luotu, vaan syntynyt toisten niskassa pitämään pikistä iestä.
NELJÄS LUKU

Siimeon Lestistä oli nyt varttunut mies mitä uhkein. Eipä siis ihme,
matami että sai viettelemään tätä poikaa muodoin muhkein. Viittein
selvin hän itsensä tarjolle työnsi, temppuili tavoin ja toisin, kunnes jo
Siimeon eksyi ja hänelle itsensä myönsi.

Nyt olis kelpaavan luullut — jo kai toki, köyhän pojan — pienellä


pappilamatkalla hypätä komeasti ylitse köyhyyden ojan. Mutta ei
Siimeon: yhä hän mietti ja empi, vaikka jo matami häntä kuin
omaansa konsanaan syötti ja hoiti ja lempi.

Niinäpä aikoina vapaata lempeä saarnasi muutamat hullut, mut ei


se onneksi kuitenkaan lopulta kaikkien tavaksi tullut, vain oman
aikansa oli se ihmisten suissa ja päissä ja toimitti pastorin virkaa
myöskin Simon ja mahtavan matamin häissä.

Valmista verstaa nyt niinkuin ainakin mestari Siimeon piti. Rahaa


oli kyllä ja ruokaa ja hellyyttä — kuitenkin ikävä nuoren mestarin
sielussa yhä vain iti. Mörkkinä aina hän istui, pikisen nyrkkinsä
varassa poski; istui, vaikkakin tiesi, että se matamin sydämeen
syvälle koski.
Matami hymyllä koetti lääkitä armaansa surun ja vaivan —
matamin suu oli suloinen vaikka jo hampaaton aivan — lääkitsi,
sanoi: »Mikähän suru on armaani mieltä noin pimittämässä? Rahaa
on piirongin loorassa, pöyrässä ruokaa, jos tahrot pussata kultaas,
niin se on tässä.»

Huokasi Siimeon, kämmentä viittasi hälle, suuttui ja selkään antoi


hän pojalle irvistävälle. Mitäpäs, tyytyä täytyi, vaikka oli mielessä
muuta: Siimeon haaveili, nähkäätte, pussattavaksensa nuorta ja
punaista suuta.

Työväen rientoja seurata — huvikseen — alkoi nyt Siimeon parka,


vaikkapa poikien tähden olikin aluksi tuntonsa arka. Sillä, niin mietti
hän, minäpä juuri, tuon aattehen mukaan, heikkojen verta ja hikeä
imen jos kukaan.

Niin, hän huomasi kylläkin olevansa porvari paha — mut minkäpäs


mahtoi: mukavaa mukavuus oli ja rakasta raha. Niinhän se äitikin
sanoi: »Kun olet köyhä, niin kehu vain ett' olet rikas; kun tulet
rikkaaksi sitten, niin — taas sanojes mukaan — köyhyys on ainainen
vikas.»

Niinpä ei mennytkään kauan kun hänen tuntonsa paatui,


mukaiseks toisten suutarien hän muuttui ja maatui, sorrosta puhui ja
pauhasi — sellainen olihan aate — kotiin kun pääsi, niin parhaana
kukkona poikia sorteli kaulassa punainen ammattivaate.

Sattuipa Siimeon sitten, jossakin työväen juhlassa, sievään neitihin


kohti, jonka oli suipussa punainen suu ja posket verevät tiukassa
nuoruuden lihassa hohti. Sydänjuuria myöten se liikutti Siimeonin,
sellainen näky. Siinäpä hänelle viekoitteleva, tuores ja makea täky.
Tuttavuus tehtiin, ja seuran tekoa, sellaista, melkoiset ajat jo kesti.
Aviollisen elämän viihtyisyysmahdollisuudet se vihdoin tykkänään
esti.
»Se nyt on kumma, se sellainen seuroissa juoksu», matami sanoi ja
pisti: »Jokos on tähteelle alkanut maistua nahkan ja pikilangan
tuoksu?»

Pianpa Siimeonin retkistä lisäysten kanssa jo kielittiin matamille.


Matami ankaran, pauhaavan kiellon nyt pöllytti tukkahan Siimeonille:
Vapaa rakkaus! Olkoon! Mutta vain matamiin nähden. Painakoon
mieleensä
Siimeon, että ei maita ja metsiä maleksi tyttöjen tähden.

Siitäpä jutusta alkoi nyt risti ja harmi: matami joka päivä lakia luki
niin että Siimeonin selkäpiitä karmi. Kylläpä menossa siinä jo
haihtuivat työväen aatteet, vaihtuivat taas pikipöksyihin mestarin
»fiinimmät» vaatteet.

Haikein mielin hän rummulla istuu jälleen, kastelee nahkaa ja


lappaelee, ja niinkuin entinen mestari nöyrä jo on emännälleen.
Poikihin, poloisiin, kaiken hän vihansa viskoo, niitä hän
tikkausremmillä lyöpi ja tukasta, korvista kiskoo.

Kunnes jo eräänä keväisnä päivänä laukesi luontonsa tappi,


kiehahti sisu ja ratkesi katkera sappi: matamin eteen hän
saappaantekeleen vimmalla, voimalla paukkaa, ovelle säntää ja
hammasta purren ja kiroten kadulle laukkaa.

Ei auta matamin enää nyt jälestä juosta. Iäksi päiväksi haihtui kuin
haihtuikin Siimeon piinasta tuosta. Pois koko kaupungista ja —
takaisin luontoon nyt Siimeon reisaa, päivän, toisen synkkänä
kulkee, kolmannen aamuna maantiellä iloista virttä jo veisaa.
Mikäpäs hätänä valmiissa maailmassa! Niin kauan kulkee kuin
piisaa taskussa kassa. Se kun on lopussa, pysähtyy, taloihin kääntyy,
toiselle päällensä istuu ja surutta, huoletta aivan taas suutariks
sääntyy.

Aurinko ihanasti paistaa, kukkaset suloisesti tuoksuu ja kesälinnut


laulaa. Hyvä on vapaana kulkea, poiketa taloissa syömään ja
kermalla kastella kaulaa. Maailma kaunis on niinkuin taivahan
yrttitarha, elämä hymyilee, orjuuden viimeinen muisto on haihtunut
kauas kuin unen ilkeä harha.

Niin tuli rahoista loppu ja joutui se hetki, jolloinka päättyi nuoren


suutarimestarin vapaa ja iloinen retki. Taloihin ylpeihin poikkeili poika
ja taitonsa kenkiä, saappaita neuloen näytti, aikansa muutenkin
avoimin silmin ja sydämin hyväkseen käytti.

Hoi sitä kultaista aikaa! Olla kuin lintunen taivaan! Huolta ei muuta
kuin mitä pikemmin päivät iltahan sai vaan, iltahan, jolloin ne
odottivat aittojen ovet, sykkivät Simolle kauneiden, rikkaiden tytärten
pulleat povet.

Sellaista elämää! Kuin mitä Kaanaan häitä ne olivat ajat! Ainaista


iloa, jolta on poistettu rajat. Sellaista elämää saanut ois jatkua iäti,
aameneen asti ja sivukin siitä. Päiviä moisia mies mikä tahansa
konsanaan ei koe niitä.

Sellaista elämää Siimeon ilokseen eli ja mainetta niitti. Kunniaa,


rahaa ja lihavaa ruokaa ja lempeä tähteeksi jäämäänkin riitti. Keisari
varmaankin moisesta onnesta kateeksi olisi tullut, jos olis siitä vain
kuullut, mutta hän lienee vain Simoa köyhäksi, kurjaksi
suutarinsälliksi luullut.
Pystyssä päin kävi Siimeon hypystä hyppyyn. Ei ollut huoli, ei
murhe tikannut reippaan suutarin kulmia ryppyyn. Mihin vain tuli
hän, naurussa suut oli heti, ja kaikkien mielet hän voitti, sillä hän
iloinen oli ja niinkuin Herran enkeli huuliharppua soitti.

Kunnes, kuulkaapas, Siimeonin paulaansa kietoi enkeli vaimoksi


tullut, enkeli sellainen, että sen perässä pitäjän parhaatkin pojat
juoksi kuin hullut. Sellaisen hedelmän pauloihin joutui nyt suutari
sorja, mut mikäs sen sievempää, mikäs hurskaampaa toki onkaan
kuin olla suutari suuri ja ihanan enkelin orja.

Niinpähän kai, jos ei Rienaaja pelihin puutu, jos ei vain ihana


enkeli avioliitossa piruksi muutu. Sellaista ennenkin nähty on,
montakin kertaa, taivaan riemua mokomaa, jonka ei kiusalle helvetin
piinakaan vetäisi vertaa.
VIIDES LUKU

Rikkaiden talojen tytöt, nuoret ja somat, mielellään olisivat olleet


sorjan suutarimestarin, suuharpun soittajan, mainion tanssijan omat.
Mutta nyt sattui jo Siimeonin tielle se Kohtalon asettama ansa, vipu,
johon viisainkin tarttuvi aikanansa.

Näinpä se sattune Simolle tärkeä seikka, joka oli hänelle onni ja


autuus ja myöhemmin kunniaa tuottava kuperkeikka. Parkkosen
talossa palveli kuuluisa Iita, köyhä mut kaunis kuin synti, Iita, josta
oli pitäjän pojilla ainainen kilpa ja riita.

Olihan Simokin litasta aiemmin kuullut, mutta kun tuntenut ei, oli
turhaksi loruksi sellaista ihmettä luullut. Nytpä hän Parkkosen
isännän saappaita neuloo, ja jokainen sauma ja tikki leimuaa
lempenä Iitaan kuin uunissa kuivattu taula, kuin ruuti ja rikki.

Sellaista Simolle ei ollut sattunut koskaan, niin kauan kuin muisti,


että hänen saumansa yrittivät vinoon ja virvistä harjakset luisti. Nyt
nekin sattuivat kummat ja vielä jos jotakin muuta, koska hän
yhtenään vilkuili Iitaa, suloja sen ja sen huikean kauniisti hymyilevää
suuta.
Emännälle myös piti saappaat talveksi laittaa, mut silloinpa vasta,
kun tuli Iitan vuoro, silloin se työ vasta Simosta alkoi maittaa. Kuka
on onnellisempi kuin suutari, koska hän kauniin ja siveän immen
jalkaa mitalla koittaa! Niinkuin ihanat sinfoniat jalon suutarimestarin
sielussa silloin soittaa.

Niinkuin kärpänen makean paakelsin ympäri, niinpä nyt Siimeon


hääri, kun Iita kuin rinssessa Parkkosen penkillä istuen hiukkasen
helmojaan kääri. Kahtapa sellaista hetkeä tuskin vain jaksaisi kestää;
onni niin suuri saattaisi, nähkääs, jo normaalin ajatustoiminnan
estää.

Siimeon mittoja ottaa, katsoo ja kinttuja kauniiksi kiittää. Iita jo


reippaasti sanoo: »Ei niin pitkiä varsia. Alapuolelle polvenkin riittää.»
Siimeon pitemmät varret Iitan saappaihin soisi. »Arvelin», sanoo
hän, »että jos oikein kalastussaappaat ommeltu oisi».

Niistäpä Iitan saappaista saappaat tulivat vasta, saappaat niin


kauniit, että vain näyttäen niitä vois naurattaa itkevää lasta. Ne oli
saappaat oikean kaupungin mestarin työtä, sen näki jokainen, mutta
ei tietänyt moni, jokaisessa naskalin pistossa että oli rakkaus myötä.

Siitä se alkoi nyt rakkaus suuri ja julma, ja suutarimestarin iloisen


elämän tielle nyt astui toinenkin puntti ja pulma. Uhkaili pojat:
»Ennenkuin Iitan sormessa suutarin kihlaset kiiltää, täytyypä
suutarin nahasta hiukan liepeitä viiltää.»

Suutarimestari pelkäsi, sillä hän uskoi kyllä, mitä hänen nahastaan


sanotuks tuli jo yllä. Siksipä vasara taskussa suutari kulki nyt iltamiin,
häihin, voidakseen tarpeen tullen tottunein kopsuin pompata
kihlausjulkaisun poikien päihin.
Tansseissa kerranpa sanoikin sankari muuan jo että: »Simo se ei
pirtua juo, sen nahka se kestäisi vettä.» Riita ja mellakka samalla
pantiin nyt pystyyn, ja Iitakin luuli, että on mennyttä suutari,
sellaiset sanat kun nurkassa vavisten kuuli.

Tällaiset vakavanpuoleiset sattuivat nyt sananparret: »Teetänpä


suutarin omasta nahasta saappaanvarret!» Suutari vasaralla hakkasi
otsiin ja neniin ja leukoihin kamalat kuplat, sanoen: »Lyödäänpäs
ensinnä entisiin tukevat tuplat!»

Vasaraa pakohon sankarit saivat jo juosta. Ei jäänyt jälelle kuin


paha pirrun löyhkä vain joukosta tuosta. Niinpähän julkaisi
kihlauksensa siis suutari vakaa. Ja että se naulaus pitää, sen koko
pitäjän anturat, Siimeonin tekemät, takaa.

Sellaisen rytinän kanssa sai Siimeon Iitansa soman, sai kuin saikin
tuon tytön kauniin ja vallattoman. Niinpä — jos enää mistään
merkistä lienee taikaa — suutarimestarin uskoisi alkavan elää nyt
ihanaa onnensa aikaa.

Häämatka Imatran kuohuja katsomaan tehtiin, ilmoitus liitosta —


niinkuin »herskapit» ainakin — annettiin sanomalehtiin. Haaveiltiin
onnesta, joka kuin kultainen kuutamon silta välkkyvi vaiheilla heidän
niin kauan kuin joutuu jo rauhaisa elämän ilta.
KUUDES LUKU

Lempeä kylläkin tyttönä oli tuo Iita, mutta kun naimisiin pääsi, jo
alkanut kiivas ja katkera on jokapäiväinen riita. Miestään hän soivaa
ja sortaa ja laiskaksi haukkuu, ja oikein kun vimmalle sattuu, niin
antaapa, totta vie, molemmille korville niin että paukkuu.

Ensimmäistä menoa Siimeon nauraen kuunteli, huusi — leikillä


tietenkin —: »Tuki nyt äkkiä, eukko, tuo leveä suusi!» Siitäkös Iita
nyt niinkuin pirulta riivattu suuttui, jalkaa polki ja huusi ja lopulta
kymmenin kynsin suutarin tukkahan puuttui.

Pahasti holhosi Iita niin suutari parkaa, tahallaan oikein, tietäen,


että ei Siimeon pois hänen luotansa karkaa, vaikka on — Simo oli
litalle kerran kehunut tuota — karannut vanhan ja rikkaan matamin
luota.

»Kas kun et karkaa!» ilveili Iita, kun tösähti vähän ja joskus


tuskaili toinen. Suutarin sisulle monasti läikähti kiusaus moinen,
mutta hän tyyntyi taas, koki jälleen sopua laittaa, vaikka tuon enkelin
lempeys toisinaan oli hänen jäsenensä taittaa.

Iita vain yltyi, yhä vain uusia temppuja keksi. Hänenpä tahdostaan
tuli Siimeon sällinkin ottaneheksi. Sellaisen verevän veitikan sai,
jonka rinnalla itse hän näytti keltaisen kalpeelta niinkuin se lampaan
nahka, jota hän saappaan vuorina käytti.

Sälli se oitis oli kuin kotona ikään, siitä ei oudolta tuntunut temppu
niin mikään. Mestarin uudet patiinit lainasi, joi ne, ja mestari tuosta
kun sätti, niin matamin, Iitan avulla moitteet takaisin Siimeonin
silmille mätti.

Pilasi sitten se parhainta patiininahkaa kyynärän verran. Mestari


suuttui ja käski nyt säliinsä lähtemään viimeisen kerran. Lähtikös sälli
jo tuosta? Vieläpäs mitä: Iitahan heti kuin poikaansa puolusti sitä.

Iita ja sälli ne olivat aina vain Simoa vastaan, toinen toistansa


puoltaen niinkuin lastaan. Iita niin kylmäkskin Simolle muuttui kuin
olis ollut jo jäässä, ja tuosta niin mestari lannistui, että eli vain
päivästä päivään kuin puuroa päässä.

Kunnes jo talvehen päästyä alkoivat häntä ne höperönä pitää, ja


kunnes jo mestarin mielessä alkoi ilkeä epäluulo itää. Korvilleen
mestari sai, vaikka ahersi niin että päätä jo huikki, milloin hän kiireen
kaupalla joskus pihan yli luikki.

Kaiken tuon Simo kesti kuin kestää mestari aimo, kaiken kesti niin
kauan kuin uskoton ollut ei vaimo. Haukkukoon, lyököön, viis sille
suutarimestari veisaa, mut hänen enkeliään, hänen piruaan syrjäinen
näpätä ei saa.

Mutta se tuli se päivä, jolloinka Simo ei tietänyt luottaa, milloin


hänelle eukko tuon iankaikkisen häpeän tuottaa. Niinkuin kuumilla
kivillä suutari istuu ja vimmatun voimalla virpeä kiskoo, hermostuu,
jotakin etsii ja kappaleet kaikki kuin hullu hän hujan hajan viskoo.
Vihdoin hän sanoo: »Varokaa! Minä en ole silmätön sokko!
Varokaa jo, sillä kohtapa, kuulkaa, tässä on vimmattu pokko,
vimmattu, villitty sellainen, että tuo renki — tuo sälli — jos erkane ei,
niin vanhaa virvenpätkää kohta ei maksa sen henki!»

Siitäkös eukko vain yltyy, nauraa ja sällille, rentulle, jotakin


kuiskaten haastaa. Mokoma temppu on sydämen mestari Lestin
rinnasta juurineen raastaa. Vihdoinpa mestari mokomaan peliin ja
lopulta työhönkin kyltyi, työt kaikki nurkkaan heitti ja juomahan yltyi.

Reissäsi kaupunkiin Siimeon myrtynein mielin — vihaa ja vimmaa


ja harmia sellaisen miehen on vaikea kertoa kielin. Mutta nyt päätti
hän hummata, juoda niin paljon, että se ylitse läikkyy. Kylläpä, kun
hän kotihin palaa, Iitat ja sällit jo säikkyy.
SEITSEMÄS LUKU

Hotellista toiseen — mitä kun kaupungissa oli vain kaksi —


suutarimestari seilasi rentona niinkuin kulunut saappaan raksi. Pöytiä
kaatoi, toisille tasajaloin hyppi, kunnes jo poliisi hänet kuin varpusen
häkkihin nyppi.

Mut mitä auttoi se putka! Ja mitä se meinasi sakko! Simolla oli nyt
juomiseen, hulinaan, pahantekoon pakko, sellainen pakko, jota ei
arvata saattanut kukaan, pakko, jota ei arvostella voi maallisten
mittojen mukaan.

Kyllä hän kuuli, latkien melkein pirtua silkkaa, että jo ihmiset


ympäri — tuolla — alkoivat veistellä hänestä pilkkaa. Mutta hän
kaikille kovalla äänellä haistatti vain hevonhännät ja nauraen kohotti
sitten, näytteille oikein, molemmat pikiset, lakkaiset suutarin kännät.

Riemun ja unhon laineita soutaen huusi hän: »Huh-hei! Tässä on


mestari, jollaista toisesta helpolla tu' ei! Tulkaapas meille! Tulkaa, te
nuljuksen naskalit meille. Minäpä näytän kerrankin oikean suutarin
kuranssin teille.»

Äkkiä suutarimestari muijaansa muisti. Silloinpa pöydältä kaikki


hän sirpaleiks suisti, laskun kutsui ja lausuili verkkaan sitten:
»Oppikaa tietämään, mikä on mökä, ja mikä on meininki herrojen
johtajitten.»

Maksoi runsaasti kaikki ja sitten hän lähti. Ulkona, taivaalla


jenkkaa jo tanssi jok'ainoa tähti. Tanssivat hänelle tähdet, vaikka tuli
lunta sen minkä taivaasta ehti. Sellaista pikkuista seikkaa ei
huomannut ollenkaan suutari rehti.

Ajurit odottivat lähellä, niitä hän ei nähnyt, ei ainakaan heti. Hän


näki miehen, joka siinä kadulla kävellen kelkkaansa veti. Suutari
miehelle: »Tuleppas kyytiin, pappa, niin rahaa saat vaikka ostaisit
talon! Osaatko mestari Lestin verstalle suoraan lävitse salon?»

Osasi mies, mutta huonoksi tietä hän luuli. Kuitenkin lähti, kun
Siimeonin kehuvan kuuli: »Minä olen tirehtyör, johtaja Siimeon Lesti,
ja tiedä: köyhyys jo erkanee sinusta, jos herra johtajan jaksat vain
kunnialla kotihin viedä.»

Myöhään yöllä niin mentiin. Ukko sai varin. Kerranpa kelkkakin


hankehen pyllähti nurin ja narin. Heräsi potkien, parkuen kelkkahan
nukkunut Siimeon, tirehtyöri, kauan hän hangessa tolkutta rehki ja
sinne tänne pyöri.

Mutta taas selvittiin toki jatkamaan taivalta pahaa. »Niin», sanoi


mestari, »helppoa ei ole kenenkään ansaita rahaa. Se tulee hitaasti,
tulee vain työllä ja tuskalla, kovasti raatain, mutta kun menemään
panee, niin menee se niinkuin Imatran koskesta kaatain.»

Mestari tarjosi äijälle tuikean naukun. Itse hän tämän tästä kallisti
kurkkuunsa ankaran paukun, lauleli niin että yöllinen maailma raikui,
kunnes jo ryypyistä käheäksi särkynyt ääni Iitankin korvahan unen
läpi kaikui.
Mestarin pihamaalla ukko sai runsahan maksun ja takaisin kääntyi,
Siimeon laulaen, hihkuen ovelle vääntyi, kolkutti, jyskytti, ryskytti,
tärähytti ikkunan rikki. »Nyt minä tutkia tahdon», hän huusi,
»sietääkö mestarin silmää se sällin tikki!»

Pahan piti mestari paukkeen, peloitteli sälliä, Iitaa. Mutta hän


vähitellen talttui, kun saanut ei opilla millään syntymään riitaa. Väsyi
ja makuulle mätkähti niinkuin säkki, peitteenä Iitan tyttönä tikkaama
silkkinen täkki.

Pahoja unia näki hän, möyrysi niinkuin härkä, unissaan itkikin niin
että ihan oli päänalus märkä. Aamulla vasta matami tiuski ja teutui
ja Simolle katuvalle hiuksien kautta hän järkeä jakoi. Mutta se
auttanut ei. Simo kuunteli hetken, yks kaks taas hänen mielensä
muuttui ja verensä sakoi.

Sieppasi matamin kiinni ja kouristi, huusi: »Rouhinko


lannoitusaineeksi syntiset luusi!» Palttonsa, hattunsa otti ja kiiruhti
tekemään kaupunkimatkaa, päättäen, vaikka se hornaan veis, taas
hulinata jatkaa.

Sellaista menoa kesti nyt kesähän asti, kesähän, jolloin jo mestari


hulluuden rajoille merkkejä rasti. Enää ei kaupunkiin mennyt, kotona
lakkaamatta nyt alkoi pirtua niellä, matamin sanasta apua ei, sama
käske tai kiellä.

Vaikka on suutari norsuun verraten elävä pieni, niin pirtua jaksoi


hän kuukauskaupalla imeä itseensä kuin pesusieni, imeä, mellastaa,
kiekua niinkuin kukko; ja olikin suutari vaihteeksi eukolleen helkkarin
topsakka ukko.
Pahalle päälle kun sattui, niin kerrassa kaikki hän särki, kieltikös
viinahullua sellaista enää nyt järki. Sälli se tämän tästä kiireesti
karkuhun loikki, Simo kun uhkaili, että hän terävällä, kiperällä
suutarin veitsellä tempaisee sälliltä yksi kaks kaulat ja pilikukut
poikki.

Lopuksi hän ei tietänyt mahdilleen mitään mittaa ja määrää, vaan


oli ollaksensa hän mestari sellainen, joka ihan miten mielehen sattuu
huitoo ja häärää. Kunnes hän tosissaan oikein uskoikin olevansa
maailman napa, jonka ympäri muu kaikki pyörii ja pyllyilee —
sellaista uskoa onhan hullun ja juopuneen tapa.

No nyt, koska mestari aikansa tällaista peliään piti, niin tietäähän


sen, että siitä er' ankara katumus iti, katumus sellainen, jollaista ei
ole koettu montakaan kertaa, katumus, jolle ei Jopin ei Joonaan
katumus kykene vetämään vertaa.
KAHDEKSAS LUKU

Niinpä, kun eräänä syyskesän aamuna heräsi Simo, ei juuri sillä


hetkellä vaivannut viinan himo: kammarissa, verstassa kaikki on niin
hipo-hiljaista aivan, että se suutarin sieluhun pusersi kauhean
kammon ja tuskaisen vaivan.

Kuuntelee — ei edes hienointa hisausta missään. Yksin on Siimeon


omassa helvetissään. Haa! Niinpä onkin: tuossahan istuu Rienaaja
suuri ja musta, tarjoten Simolle saappaasta pirtua, rauhoitusta.

Iso ukko, Rienaaja itse, se nauraa jäyhä vain Simolle ryyppyä


tarjoo. Simo ei huoli, hän kauhusta huutaa ja kädellä silmänsä
varjoo. Mut mitäs apua siitä, ukon hän sittenkin erottaa selvästi
juuri: musta ja karvainen murjaani, naurava Saatana suuri.

Vihdoin hän hetkeksi selkenee, arvaten jotta sellainen, jollaisen


näki hän, se ei ole totta. Nousee hän pystyyn ja verisin silmin nyt
ympäri tarkkaa: ketään ei missään. Onkohan taskussa rahaa? On
niinkuin onkin viidestä tuhannesta tähteenä satasen markkaa.

Taskujaan Siimeon yhä vain vavisten, säikkyen kaivaa — resepti —


sellainen muisto kuin hämärä uni mieltänsä vaivaa. Ilostuu! Siinähän
resepti, jolla siis itsensä parantaa voisi, jos olis joku, joka sen
apteekin tiskille veisi ja ainetta toisi.

Itse hän ei voi lähteä, ei vaikka tulisi loppu. Onpa nyt Simolla
edessä vaikea hoppu. Yksinään pirujen kanssa ja pelko on sielussa
suuri, pelko ja katumus katkera, polttava niinkuin ahjosta otettu
punainen rauta on juuri.

Sälli on lähtenyt, akka on juossut jo karkuun, pitkin kyliä


varmaankin piileillen ratkennut surkeaan itkuun ja parkuun. Niinkuin
hyypiö aution kaupungin raunioläjällä koikkii, niinpä hän yksin nyt
pirstaksi lyötyjen kamppeiden keskellä hulluuden näkyjä torjuen
nurkasta nurkkahan loikkii.

Niin piti käymän. Tuska ja vaiva ja häpeä ahdisti suutari parkaa,


möröt ja kärpäset, pirut ja pikkuiset ukot ne hirvitti sielua arkaa. Ei
mihin kasvonsa kätkeä: aina on vastassa kurjuus. Silloinpa suutarin
valtasi huimaava hurjuus.

Asemalle, silmänsä raivonharmaina, värjyvin sieluin hän hyökkää,


piletin Imatralle ostaa ja itsensä vauhdissa olevaan vaunuhun
työkkää. Vauhdissa olevaan vaunuun! Ihmiset aivan jo säikähti
tuosta, mut mitäs suutari, hän olis mielestään vaunujen allekin
joutanut juosta.

Vaunujen alle hän oliskin juossut, mut on yks tehtävä hällä, se kun
on tehty, sen koommin ei virkaa olekaan elolla tällä. Niin, yksi on
tehtävä suutari Siimeonilla, ennenkuin astuu hän askeleen, joka on
oleva sielun ja ruumihin pilla.

Yksi on tehtävä, jota ei jättää saata, sillä Iitaansa rakastamasta ei


suutari koskaan voi laata. Iita siis saakohon tietää nyt, mikä miehen
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookfinal.com

You might also like