Tài liệu The definitive guide to django

  • Số trang: 538 |
  • Loại file: PDF |
  • Lượt xem: 223 |
  • Lượt tải: 0
minhminh

Đã đăng 411 tài liệu

Mô tả:

 CYAN  MA  YELLO    PAN The EXPERT’s VOIce ® in Web Development Updated for Django 1.1 The Definitive Guide to Web Development Done Right Django is a framework that saves you time and makes Web development a joy Second Edition     Adrian Holovaty and Jacob Kaplan-Moss Benevolent Dictators for Life, Django The Definitive Guide to Django Web Development Done Right, Second Edition Adrian Holovaty and Jacob Kaplan-Moss The Definitive Guide to Django: Web Development Done Right, Second Edition Copyright © 2009 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: 978-1-4302-1936-1 ISBN (electronic): 978-1-4302-1937-8 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. Java™ and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc., in the US and other countries. Apress, Inc., is not affiliated with Sun Microsystems, Inc., and this book was written without endorsement from Sun Microsystems, Inc. Lead Editor: Duncan Parkes Technical Reviewer: Sean Legassick Editorial Board: Clay Andres, Steve Anglin, Mark Beckner, Ewan Buckingham, Tony Campbell, Gary Cornell, Jonathan Gennick, Michelle Lowman, Matthew Moodie, Jeffrey Pepper, Frank Pohlmann, Ben Renow-Clarke, Dominic Shakeshaft, Matt Wade, Tom Welsh Project Managers: Grace Wong and James Markham Copy Editors: Nancy Sixsmith and Candace English Associate Production Director: Kari Brooks-Copony Production Editor: Katie Stence Compositor: Patrick Cunningham Proofreader: April Eddy Indexer: BIM Indexing & Proofreading Services Artist: April Milne 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 orders-ny@springer-sbm.com, 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 info@apress.com, or visit http://www. apress.com. Apress and friends of ED books may be purchased in bulk for academic, corporate, or promotional use. eBook versions and licenses are also available for most titles. For more information, reference our Special Bulk Sales–eBook Licensing web page at http://www.apress.com/info/bulksales. The information in this book is distributed on an “as is” basis, without warranty. Although every precaution 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. This book is dedicated to the Django community. Contents at a Glance About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxv PART 1 Getting Started Chapter 1 Introduction to Django. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Chapter 2 Getting Started. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Chapter 3 Views and URLconfs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Chapter 4 Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Chapter 5 Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Chapter 6 The Django Admin Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Chapter 7 Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 PART 2 iv ■■■ ■■■ Advanced Usage Chapter 8 Advanced Views and URLconfs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Chapter 9 Advanced Templates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Chapter 10 Advanced Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Chapter 11 Generic Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Chapter 12 Deploying Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 PART 3 ■■■ Other Django Features Chapter 13 Generating Non-HTML Content. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Chapter 14 Sessions, Users, and Registration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Chapter 15 Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 Chapter 16 django.contrib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 Chapter 17 Middleware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 Chapter 18 Integrating with Legacy Databases and Applications. . . . . . . . . . . . 317 Chapter 19 Internationalization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 Chapter 20 Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 PART 4 ■■■ Appendixes Appendix A Model Definition Reference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 Appendix B Database API Reference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 Appendix C Generic View Reference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 Appendix D Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413 Appendix E Built-in Template Tags and Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 Appendix F The django-admin Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 Appendix G Request and Response Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 v Contents About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxv PART 1 Chapter 1 Chapter 2 ■■■ Getting Started Introduction to Django. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 What Is a Web Framework?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The MVC Design Pattern. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Django's History. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . How to Read This Book. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Required Programming Knowledge . . . . . . . . . . . . . . . . . . . . . . . . . . . . Required Python Knowledge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Required Django Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Getting Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5 7 8 8 8 9 9 9 Getting Started. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Installing Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Python Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Installing Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Installing an Official Release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Installing the Trunk Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Testing the Django Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 12 12 12 13 14 vii viii ■CO NTENT S Chapter 3 Chapter 4 Setting Up a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Django with PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Django with SQLite 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Django with MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Django with Oracle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Django Without a Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Starting a Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Running the Development Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . What's Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 16 16 17 17 17 17 18 19 Views and URLconfs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Your First Django-Powered Page: Hello World. . . . . . . . . . . . . . . . . . . . . . . Your First View. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Your First URLconf. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Quick Note About 404 Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Quick Note About the Site Root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . How Django Processes a Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Your Second View: Dynamic Content. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . URLconfs and Loose Coupling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Your Third View: Dynamic URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Django’s Pretty Error Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What's Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 21 22 26 27 28 28 31 31 35 37 Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Template-System Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using the Template System. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creating Template Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rendering a Template. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Multiple Contexts, Same Template. . . . . . . . . . . . . . . . . . . . . . . . . . . . Context Variable Lookup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Playing with Context Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Basic Template Tags and Filters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Philosophies and Limitations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Templates in Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 41 42 43 45 46 49 50 50 56 57 58 ■C O N T E N T S Chapter 5 Template Loading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . render_to_response() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The locals() Trick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Subdirectories in get_template(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The include Template Tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Template Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What's Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 63 63 64 65 66 70 Models. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 The “Dumb” Way to Do Database Queries in Views . . . . . . . . . . . . . . . . . . 71 The MTV (or MVC) Development Pattern. . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Configuring the Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Your First App. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Defining Models in Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Your First Model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Installing the Model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Basic Data Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Adding Model String Representations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Inserting and Updating Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Selecting Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Filtering Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Retrieving Single Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Ordering Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Chaining Lookups. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 Slicing Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Updating Multiple Objects in One Statement. . . . . . . . . . . . . . . . . . . . 92 Deleting Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 What's Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Chapter 6 The Django Admin Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 The django.contrib Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Activating the Admin Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Using the Admin Site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Adding Your Models to the Admin Site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 How the Admin Site Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Making Fields Optional. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Making Date and Numeric Fields Optional . . . . . . . . . . . . . . . . . . . . 104 Customizing Field Labels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 ix x ■CO NTENT S Chapter 7 PART 2 Chapter 8 Custom ModelAdmin Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Customizing Change Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Customizing Edit Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Users, Groups, and Permissions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . When and Why to Use the Admin Interface—And When Not To. . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 106 112 116 117 118 Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Getting Data from the Request Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Information About the URL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Other Information About the Request. . . . . . . . . . . . . . . . . . . . . . . . . Information About Submitted Data . . . . . . . . . . . . . . . . . . . . . . . . . . . A Simple Form-Handling Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Improving Our Simple Form-Handling Example. . . . . . . . . . . . . . . . . . . . . Simple Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Making a Contact Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Your First Form Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tying Form Objects into Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Changing How Fields Are Rendered. . . . . . . . . . . . . . . . . . . . . . . . . . Setting a Maximum Length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Setting Initial Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adding Custom Validation Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Specifying Labels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Customizing Form Design. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 119 120 121 122 125 127 129 133 136 137 137 138 138 139 139 141 ■■■ Advanced Usage Advanced Views and URLconfs . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 URLconf Tricks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Streamlining Function Imports. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Multiple View Prefixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Special-Casing URLs in Debug Mode. . . . . . . . . . . . . . . . . . . . . . . . . Using Named Groups. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Understanding the Matching/Grouping Algorithm . . . . . . . . . . . . . . Passing Extra Options to View Functions. . . . . . . . . . . . . . . . . . . . . . Using Default View Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 145 147 148 148 150 150 155 ■C O N T E N T S Chapter 9 Special-Casing Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capturing Text in URLs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Determining What the URLconf Searches Against. . . . . . . . . . . . . . Higher-Level Abstractions of View Functions . . . . . . . . . . . . . . . . . . Wrapping View Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Including Other URLconfs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . How Captured Parameters Work with include() . . . . . . . . . . . . . . . . How Extra URLconf Options Work with include() . . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 157 158 158 161 162 163 164 165 Advanced Templates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Template Language Review. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . RequestContext and Context Processors. . . . . . . . . . . . . . . . . . . . . . . . . . . django.core.context_processors.auth . . . . . . . . . . . . . . . . . . . . . . . . django.core.context_processors.debug. . . . . . . . . . . . . . . . . . . . . . . django.core.context_processors.i18n . . . . . . . . . . . . . . . . . . . . . . . . django.core.context_processors.request. . . . . . . . . . . . . . . . . . . . . . Guidelines for Writing Your Own Context Processors . . . . . . . . . . . Automatic HTML Escaping. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . How to Turn It Off. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Automatic Escaping of String Literals in Filter Arguments. . . . . . . Inside Template Loading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extending the Template System. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creating a Template Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Writing Custom Template Filters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Writing Custom Template Tags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Writing the Compilation Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . Writing the Template Node. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Registering the Tag. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Setting a Variable in the Context. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Parsing Until Another Template Tag. . . . . . . . . . . . . . . . . . . . . . . . . . Parsing Until Another Template Tag and Saving Contents. . . . . . . Shortcut for Simple Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inclusion Tags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Writing Custom Template Loaders. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring the Template System in Standalone Mode . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 168 171 171 172 172 172 173 174 175 176 176 177 177 178 180 180 182 182 183 184 185 185 186 188 189 190 xi xii ■CO NTENT S Chapter 10 Advanced Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Related Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Accessing Foreign Key Values. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Accessing Many-to-Many Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Making Changes to a Database Schema. . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Adding Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Removing Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Removing Many-to-Many Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Removing Models. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Adding Extra Manager Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Modifying Initial Manager QuerySets . . . . . . . . . . . . . . . . . . . . . . . . . 198 Model Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Executing Raw SQL Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Chapter 11 Chapter 12 Generic Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Using Generic Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Generic Views of Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extending Generic Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Making “Friendly” Template Contexts. . . . . . . . . . . . . . . . . . . . . . . . Adding Extra Context. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Viewing Subsets of Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Complex Filtering with Wrapper Functions . . . . . . . . . . . . . . . . . . . . Performing Extra Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 205 207 207 208 209 210 211 212 Deploying Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Preparing Your Codebase for Production. . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Turning Off Debug Mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Turning Off Template Debug Mode. . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Implementing a 404 Template. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Implementing a 500 Template. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Setting Up Error Alerts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 Setting Up Broken Link Alerts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 Using Different Settings for Production. . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 DJANGO_SETTINGS_MODULE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 ■C O N T E N T S Using Django with Apache and mod_python . . . . . . . . . . . . . . . . . . . . . . . 218 Basic Configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Running Multiple Django Installations on the Same Apache Instance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Running a Development Server with mod_python. . . . . . . . . . . . . . 220 Serving Django and Media Files from the Same Apache Instance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 Error Handling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Handling a Segmentation Fault. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 An Alternative: mod_wsgi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Using Django with FastCGI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 FastCGI Overview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Running Your FastCGI Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Using Django with Apache and FastCGI. . . . . . . . . . . . . . . . . . . . . . . 224 FastCGI and lighttpd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 Running Django on a Shared-Hosting Provider with Apache. . . . . 227 Scaling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 Running on a Single Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 Separating Out the Database Server . . . . . . . . . . . . . . . . . . . . . . . . . 229 Running a Separate Media Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 Implementing Load Balancing and Redundancy . . . . . . . . . . . . . . . 230 Going Big. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 Performance Tuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 There’s No Such Thing As Too Much RAM . . . . . . . . . . . . . . . . . . . . 233 Turn Off Keep-Alive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Use Memcached. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Use Memcached Often . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Join the Conversation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 PART 3 ■■■ Chapter 13 Other Django Features Generating Non-HTML Content. . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 The Basics: Views and MIME Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Producing CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 Generating PDFs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Installing ReportLab. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Writing Your View. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Complex PDFs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 xiii xiv ■CO NTENT S Chapter 14 Other Possibilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Syndication-Feed Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Initialization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Simple Feed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A More Complex Feed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Specifying the Type of Feed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enclosures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Language. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . URLs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Publishing Atom and RSS Feeds in Tandem. . . . . . . . . . . . . . . . . . . The Sitemap Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Initialization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sitemap Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Shortcuts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creating a Sitemap Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pinging Google. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What's Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 242 243 244 245 247 247 248 248 248 249 249 250 250 251 252 253 254 Sessions, Users, and Registration . . . . . . . . . . . . . . . . . . . . . . . . 255 Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Getting and Setting Cookies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Mixed Blessing of Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Django’s Session Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enabling Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Sessions in Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Setting Test Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Sessions Outside of Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . When Sessions Are Saved . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Browser-Length Sessions vs. Persistent Sessions. . . . . . . . . . . . . . Other Session Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Users and Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enabling Authentication Support. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Users. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Logging In and Out. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Limiting Access to Logged-in Users. . . . . . . . . . . . . . . . . . . . . . . . . . Limiting Access to Users Who Pass a Test . . . . . . . . . . . . . . . . . . . . Managing Users, Permissions, and Groups. . . . . . . . . . . . . . . . . . . . Using Authentication Data in Templates . . . . . . . . . . . . . . . . . . . . . . 255 256 257 258 258 259 261 261 262 262 263 264 264 265 267 269 269 271 273 ■C O N T E N T S Chapter 15 Permissions, Groups, and Messages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Permissions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Groups. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 274 275 275 276 Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 Setting Up the Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 Memcached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 Database Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Filesystem Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Local-Memory Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 Dummy Caching (for Development) . . . . . . . . . . . . . . . . . . . . . . . . . . 280 Using a Custom Cache Back-End. . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 CACHE_BACKEND Arguments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 The Per-Site Cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 The Per-View Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 Specifying Per-View Cache in the URLconf. . . . . . . . . . . . . . . . . . . . 283 Template Fragment Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 The Low-Level Cache API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 Upstream Caches. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Using Vary Headers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Controlling Cache: Using Other Headers. . . . . . . . . . . . . . . . . . . . . . . . . . . 288 Other Optimizations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 Order of MIDDLEWARE_CLASSES. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 Chapter 16 django.contrib. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 The Django Standard Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 Sites. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 Scenario 1: Reusing Data on Multiple Sites . . . . . . . . . . . . . . . . . . . 293 Scenario 2: Storing Your Site Name/Domain in One Place. . . . . . . 293 How to Use the Sites Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 The Sites Framework’s Capabilities. . . . . . . . . . . . . . . . . . . . . . . . . . 294 CurrentSiteManager. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 How Django Uses the Sites Framework. . . . . . . . . . . . . . . . . . . . . . . 298 Flatpages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 Using Flatpages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 Adding, Changing, and Deleting Flatpages. . . . . . . . . . . . . . . . . . . . 301 Using Flatpage Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 xv xvi ■CO NTENT S Chapter 17 Redirects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using the Redirects Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adding, Changing, and Deleting Redirects . . . . . . . . . . . . . . . . . . . . CSRF Protection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Simple CSRF Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A More Complex CSRF Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preventing CSRF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Humanizing Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . apnumber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . intcomma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . intword. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ordinal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Markup Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 302 303 304 304 304 304 306 306 306 306 307 307 307 Middleware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 What’s Middleware?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Middleware Installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Middleware Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Initializer: __init__(self) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Request Preprocessor: process_request(self, request). . . . . . . . . . View Preprocessor: process_view(self, request, view, args, kwargs). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Response Postprocessor: process_response(self, request, response) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exception Postprocessor: process_exception(self, request, exception). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Built-in Middleware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Authentication Support Middleware. . . . . . . . . . . . . . . . . . . . . . . . . . “Common” Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Compression Middleware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conditional GET Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reverse Proxy Support (X-Forwarded-For Middleware) . . . . . . . . . Session Support Middleware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sitewide Cache Middleware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Transaction Middleware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 310 311 311 311 311 312 312 313 313 313 314 314 314 315 315 315 315 ■C O N T E N T S Chapter 18 Chapter 19 Chapter 20 Integrating with Legacy Databases and Applications. . . 317 Integrating with a Legacy Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using inspectdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cleaning Up Generated Models. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Integrating with an Authentication System. . . . . . . . . . . . . . . . . . . . . . . . . Specifying Authentication Back-Ends. . . . . . . . . . . . . . . . . . . . . . . . . Writing an Authentication Back-End. . . . . . . . . . . . . . . . . . . . . . . . . . Integrating with Legacy Web Applications . . . . . . . . . . . . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 317 318 319 319 319 321 322 Internationalization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 How to Specify Translation Strings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . In Python Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . In Template Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Working with Lazy Translation Objects . . . . . . . . . . . . . . . . . . . . . . . How to Create Language Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Message Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Compiling Message Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . How Django Discovers Language Preference. . . . . . . . . . . . . . . . . . . . . . . Using Translations in Your Own Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . The set_language Redirect View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Translations and JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The javascript_catalog View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using the JavaScript Translation Catalog . . . . . . . . . . . . . . . . . . . . . Creating JavaScript Translation Catalogs . . . . . . . . . . . . . . . . . . . . . Notes for Users Familiar with gettext. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . gettext on Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 324 327 329 330 330 332 333 335 336 337 337 337 339 339 339 340 Security. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 The Theme of Web Security. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SQL Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cross-Site Scripting (XSS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cross-Site Request Forgery. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Session Forging/Hijacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 342 343 343 344 345 345 346 xvii xviii ■CO NTENT S E-mail Header Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Directory Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exposed Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Final Word on Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PART 4 ■■■ Appendix A 347 347 347 348 349 349 349 349 Appendixes Model Definition Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AutoField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BooleanField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CharField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CommaSeparatedIntegerField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DateField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DateTimeField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DecimalField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EmailField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FileField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FilePathField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FloatField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ImageField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IntegerField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IPAddressField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NullBooleanField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PositiveIntegerField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PositiveSmallIntegerField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SlugField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SmallIntegerField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TextField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TimeField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . URLField. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XMLField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 354 354 354 354 355 355 355 355 355 357 357 357 358 358 358 358 358 358 358 358 358 359 359
- Xem thêm -