<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: james-bennett</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/james-bennett.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-12-09T01:13:39+00:00</updated><author><name>Simon Willison</name></author><entry><title>Deprecations via warnings don’t work for Python libraries</title><link href="https://simonwillison.net/2025/Dec/9/deprecations-via-warnings/#atom-tag" rel="alternate"/><published>2025-12-09T01:13:39+00:00</published><updated>2025-12-09T01:13:39+00:00</updated><id>https://simonwillison.net/2025/Dec/9/deprecations-via-warnings/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://sethmlarson.dev/deprecations-via-warnings-dont-work-for-python-libraries"&gt;Deprecations via warnings don’t work for Python libraries&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Seth Larson reports that &lt;a href="https://github.com/urllib3/urllib3/blob/main/CHANGES.rst#260-2025-12-05"&gt;urllib3 2.6.0&lt;/a&gt; released on the 5th of December and finally removed the &lt;code&gt;HTTPResponse.getheaders()&lt;/code&gt; and &lt;code&gt;HTTPResponse.getheader(name, default)&lt;/code&gt; methods, which have been marked as deprecated via warnings since &lt;a href="https://github.com/urllib3/urllib3/releases/tag/2.0.0"&gt;v2.0.0 in April 2023&lt;/a&gt;. They had to &lt;em&gt;add them back again&lt;/em&gt; in a hastily released &lt;a href="https://github.com/urllib3/urllib3/blob/main/CHANGES.rst#261-2025-12-08"&gt;2.6.1&lt;/a&gt; a few days later when it turned out major downstream dependents such as &lt;a href="https://github.com/kubernetes-client/python/issues/2280"&gt;kubernetes-client&lt;/a&gt; and &lt;a href="https://github.com/fastly/fastly-py/pull/112"&gt;fastly-py&lt;/a&gt; still hadn't upgraded.&lt;/p&gt;
&lt;p&gt;Seth says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My conclusion from this incident is that &lt;a href="https://docs.python.org/3/library/exceptions.html#DeprecationWarning"&gt;&lt;code&gt;DeprecationWarning&lt;/code&gt;&lt;/a&gt; in its current state does not work for deprecating APIs, at least for Python libraries. That is unfortunate, as &lt;code&gt;DeprecationWarning&lt;/code&gt; and the &lt;a href="https://docs.python.org/3/library/warnings.html"&gt;&lt;code&gt;warnings&lt;/code&gt; module&lt;/a&gt; are easy-to-use, language-"blessed", and explicit without impacting users that don't need to take action due to deprecations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On Lobste.rs James Bennett &lt;a href="https://lobste.rs/s/pvaalr/deprecations_via_warnings_don_t_work_for#c_smnajm"&gt;advocates for watching for warnings more deliberately&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Something I always encourage people to do, and try to get implemented anywhere I work, is running Python test suites with &lt;code&gt;-Wonce::DeprecationWarning&lt;/code&gt;. This doesn't spam you with noise if a deprecated API is called a lot, but still makes sure you see the warning so you know there's something you need to fix.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I didn't know about the &lt;code&gt;-Wonce&lt;/code&gt; option - &lt;a href="https://docs.python.org/3/using/cmdline.html#cmdoption-W"&gt;the documentation&lt;/a&gt; describes that as "Warn once per Python process".

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://lobste.rs/s/pvaalr/deprecations_via_warnings_don_t_work_for"&gt;lobste.rs&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/seth-michael-larson"&gt;seth-michael-larson&lt;/a&gt;&lt;/p&gt;



</summary><category term="james-bennett"/><category term="open-source"/><category term="python"/><category term="seth-michael-larson"/></entry><entry><title>Quoting James Bennett</title><link href="https://simonwillison.net/2023/Apr/7/james-bennett/#atom-tag" rel="alternate"/><published>2023-04-07T02:19:12+00:00</published><updated>2023-04-07T02:19:12+00:00</updated><id>https://simonwillison.net/2023/Apr/7/james-bennett/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://lobste.rs/s/2beggz/different_uses_python_type_hints#c_bbbae5"&gt;&lt;p&gt;Several libraries let you declare objects with type-hinted members and automatically derive validation rules and serialization/deserialization from the type hints – Pydantic is the most popular, but alternatives like msgspec are out there too. There’s also a whole new generation of web frameworks like FastAPI and Starlite which use type hints at runtime to do not just input validation and serialization/deserialization but also things like dependency injection.&lt;/p&gt;
&lt;p&gt;Personally, I’ve seen more significant gains in productivity from those runtime usages of Python’s type hints than from any static ahead-of-time type checking, which mostly is only useful to me as documentation.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://lobste.rs/s/2beggz/different_uses_python_type_hints#c_bbbae5"&gt;James Bennett&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pydantic"&gt;pydantic&lt;/a&gt;&lt;/p&gt;



</summary><category term="james-bennett"/><category term="python"/><category term="pydantic"/></entry><entry><title>Boring Python: code quality</title><link href="https://simonwillison.net/2022/Dec/20/boring-python-code-quality/#atom-tag" rel="alternate"/><published>2022-12-20T19:55:01+00:00</published><updated>2022-12-20T19:55:01+00:00</updated><id>https://simonwillison.net/2022/Dec/20/boring-python-code-quality/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.b-list.org/weblog/2022/dec/19/boring-python-code-quality/"&gt;Boring Python: code quality&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
James Bennett provides an opinionated guide to setting up Python tools for linting, code formatting and and other code quality concerns. Of particular interest to me is his section on packaging checks, which introduces a whole bunch of new-to-me tools that can help avoid accidentally shipping broken packages to PyPI.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/packaging"&gt;packaging&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="james-bennett"/><category term="packaging"/><category term="python"/></entry><entry><title>James Bennett on why Django should not support JWT in core</title><link href="https://simonwillison.net/2020/Aug/1/jwt/#atom-tag" rel="alternate"/><published>2020-08-01T00:28:34+00:00</published><updated>2020-08-01T00:28:34+00:00</updated><id>https://simonwillison.net/2020/Aug/1/jwt/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://groups.google.com/g/django-developers/c/6oS9R2GwO4k/m/Rep92xfsAwAJ?pli=1"&gt;James Bennett on why Django should not support JWT in core&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The topic of adding JWT support to Django core comes up occasionally—here’s James Bennett’s detailed argument for not doing that. The short version is that the JWT specification isn’t just difficult to implement securely: it’s fundamentally flawed, which results in things like five implementations in three different languages all manifesting the same vulnerability. Third party modules exist that add JWT support to Django, but baking it into core would act as a form of endorsement and Django’s philosophy has always been to encourage people towards best practices.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/m_holtermann/status/1288973302170628096"&gt;@m_holtermann&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jwt"&gt;jwt&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="james-bennett"/><category term="security"/><category term="jwt"/></entry><entry><title>History of Django's popularity</title><link href="https://simonwillison.net/2009/Oct/4/history/#atom-tag" rel="alternate"/><published>2009-10-04T10:29:15+00:00</published><updated>2009-10-04T10:29:15+00:00</updated><id>https://simonwillison.net/2009/Oct/4/history/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://stackoverflow.com/questions/1515324/history-of-djangos-popularity/1515370?#1515370"&gt;History of Django&amp;#x27;s popularity&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“What sequence of events made Django the most popular Python web framework?”—insightful answers from Alex Martelli and James Bennett.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/alex-martelli"&gt;alex-martelli&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/history"&gt;history&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="alex-martelli"/><category term="django"/><category term="history"/><category term="james-bennett"/><category term="python"/></entry><entry><title>Quoting James Bennett</title><link href="https://simonwillison.net/2009/Jul/8/james/#atom-tag" rel="alternate"/><published>2009-07-08T19:36:59+00:00</published><updated>2009-07-08T19:36:59+00:00</updated><id>https://simonwillison.net/2009/Jul/8/james/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://www.b-list.org/weblog/2009/jul/08/xhtml/"&gt;&lt;p&gt;Insofar as it encouraged workaday web professionals to recognize that there are such things as best practices independent of particular browser implementations, I think XHTML can be termed successful. Insofar as it got people thinking about the possibility of a better Web ahead of us, I think XHTML can be termed successful. Insofar as it changed the popular conception of professional web design and thrust standards into the forefront, I think XHTML can be termed successful.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://www.b-list.org/weblog/2009/jul/08/xhtml/"&gt;James Bennett&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-standards"&gt;web-standards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xhtml"&gt;xhtml&lt;/a&gt;&lt;/p&gt;



</summary><category term="james-bennett"/><category term="web-standards"/><category term="xhtml"/></entry><entry><title>A Few Corrections To "On Packaging"</title><link href="https://simonwillison.net/2008/Dec/14/ian/#atom-tag" rel="alternate"/><published>2008-12-14T23:07:24+00:00</published><updated>2008-12-14T23:07:24+00:00</updated><id>https://simonwillison.net/2008/Dec/14/ian/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.ianbicking.org/2008/12/14/a-few-corrections-to-on-packaging/"&gt;A Few Corrections To &amp;quot;On Packaging&amp;quot;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
From Ian Bicking.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ian-bicking"&gt;ian-bicking&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/packaging"&gt;packaging&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="ian-bicking"/><category term="james-bennett"/><category term="packaging"/><category term="python"/></entry><entry><title>On packaging</title><link href="https://simonwillison.net/2008/Dec/14/packaging/#atom-tag" rel="alternate"/><published>2008-12-14T16:57:42+00:00</published><updated>2008-12-14T16:57:42+00:00</updated><id>https://simonwillison.net/2008/Dec/14/packaging/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.b-list.org/weblog/2008/dec/14/packaging/"&gt;On packaging&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
James Bennett discusses the problems with setuptools (and ruby gems), and recommends Ian Bicking’s pip as a setuptools replacement.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/gems"&gt;gems&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ian-bicking"&gt;ian-bicking&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pip"&gt;pip&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/setuptools"&gt;setuptools&lt;/a&gt;&lt;/p&gt;



</summary><category term="gems"/><category term="ian-bicking"/><category term="james-bennett"/><category term="pip"/><category term="python"/><category term="ruby"/><category term="setuptools"/></entry><entry><title>James Bennett: Why HTML</title><link href="https://simonwillison.net/2008/Jun/18/html/#atom-tag" rel="alternate"/><published>2008-06-18T12:27:09+00:00</published><updated>2008-06-18T12:27:09+00:00</updated><id>https://simonwillison.net/2008/Jun/18/html/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.b-list.org/weblog/2008/jun/18/html/"&gt;James Bennett: Why HTML&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Finally, somewhere to point people when they ask why I avoid XHTML that’s a bit more up to date than Hixie’s rant from 2002.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/hixie"&gt;hixie&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/html"&gt;html&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ian-hickson"&gt;ian-hickson&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-standards"&gt;web-standards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xhtml"&gt;xhtml&lt;/a&gt;&lt;/p&gt;



</summary><category term="hixie"/><category term="html"/><category term="ian-hickson"/><category term="james-bennett"/><category term="web-standards"/><category term="xhtml"/></entry><entry><title>Quoting James Bennett</title><link href="https://simonwillison.net/2008/Jun/16/wikipedia/#atom-tag" rel="alternate"/><published>2008-06-16T08:16:40+00:00</published><updated>2008-06-16T08:16:40+00:00</updated><id>https://simonwillison.net/2008/Jun/16/wikipedia/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://www.tbray.org/ongoing/When/200x/2008/06/15/Deletionist-Morons"&gt;&lt;p&gt;There are two [Wikipedias]: One is the public-facing reliable-enough-on-average encyclopedia that people read every day, which makes for nice fluff pieces in the media about "these new Web thingamajigs that the kids are building, aren't they neat?". The other is the insular behind-the-scenes bureaucracy, which reads like an improvised performance of the collected writings of Clay Shirky.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://www.tbray.org/ongoing/When/200x/2008/06/15/Deletionist-Morons"&gt;James Bennett&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/clay-shirky"&gt;clay-shirky&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/snark"&gt;snark&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/wikipedia"&gt;wikipedia&lt;/a&gt;&lt;/p&gt;



</summary><category term="clay-shirky"/><category term="james-bennett"/><category term="snark"/><category term="wikipedia"/></entry><entry><title>Minimal</title><link href="https://simonwillison.net/2008/Jun/15/minimal/#atom-tag" rel="alternate"/><published>2008-06-15T11:40:08+00:00</published><updated>2008-06-15T11:40:08+00:00</updated><id>https://simonwillison.net/2008/Jun/15/minimal/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.b-list.org/weblog/2008/jun/15/minimal/"&gt;Minimal&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
James Bennett follows Ryan Tomayko’s example and experiments with the minimalist school of blog design.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/design"&gt;design&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/minimalism"&gt;minimalism&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ryan-tomayko"&gt;ryan-tomayko&lt;/a&gt;&lt;/p&gt;



</summary><category term="design"/><category term="james-bennett"/><category term="minimalism"/><category term="ryan-tomayko"/></entry><entry><title>James B. on Pownce</title><link href="https://simonwillison.net/2008/May/2/pownce/#atom-tag" rel="alternate"/><published>2008-05-02T21:15:09+00:00</published><updated>2008-05-02T21:15:09+00:00</updated><id>https://simonwillison.net/2008/May/2/pownce/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://pownce.com/ubernostrum/"&gt;James B. on Pownce&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
James Bennett has started using Pownce for sort of medium-format blog entries, longer than a tweet but shorter than a blog essay and delivered with a healthy dose of snark.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.b-list.org/weblog/2008/apr/29/pownce/"&gt;James Bennett&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/blogging"&gt;blogging&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pownce"&gt;pownce&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/snark"&gt;snark&lt;/a&gt;&lt;/p&gt;



</summary><category term="blogging"/><category term="james-bennett"/><category term="pownce"/><category term="snark"/></entry><entry><title>Legacy.</title><link href="https://simonwillison.net/2008/Jan/23/blist/#atom-tag" rel="alternate"/><published>2008-01-23T14:14:15+00:00</published><updated>2008-01-23T14:14:15+00:00</updated><id>https://simonwillison.net/2008/Jan/23/blist/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.b-list.org/weblog/2008/jan/23/legacy/"&gt;Legacy.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
James Bennett has what I think is the most interesting analysis of the X-UA-Compatible header to date.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ie8"&gt;ie8&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/internet-explorer"&gt;internet-explorer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-standards"&gt;web-standards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xuacompatible"&gt;xuacompatible&lt;/a&gt;&lt;/p&gt;



</summary><category term="browsers"/><category term="ie8"/><category term="internet-explorer"/><category term="james-bennett"/><category term="web-standards"/><category term="xuacompatible"/></entry><entry><title>The future of web standards</title><link href="https://simonwillison.net/2007/Dec/17/blist/#atom-tag" rel="alternate"/><published>2007-12-17T13:16:43+00:00</published><updated>2007-12-17T13:16:43+00:00</updated><id>https://simonwillison.net/2007/Dec/17/blist/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.b-list.org/weblog/2007/dec/17/standards/"&gt;The future of web standards&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Nice analysis from James Bennett, who suggests that successful open source projects (Linux, Python, Perl etc) could be used as the model for a more effective standards process, and points out that Ian Hickson is something of a BDFL for the WHAT-WG.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bdfl"&gt;bdfl&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ian-hickson"&gt;ian-hickson&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/perl"&gt;perl&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/standards"&gt;standards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/w3c"&gt;w3c&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-standards"&gt;web-standards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/whatwg"&gt;whatwg&lt;/a&gt;&lt;/p&gt;



</summary><category term="bdfl"/><category term="ian-hickson"/><category term="james-bennett"/><category term="linux"/><category term="open-source"/><category term="perl"/><category term="python"/><category term="standards"/><category term="w3c"/><category term="web-standards"/><category term="whatwg"/></entry><entry><title>Updates to template_utils</title><link href="https://simonwillison.net/2007/Dec/10/blist/#atom-tag" rel="alternate"/><published>2007-12-10T15:25:51+00:00</published><updated>2007-12-10T15:25:51+00:00</updated><id>https://simonwillison.net/2007/Dec/10/blist/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.b-list.org/weblog/2007/dec/09/updates/"&gt;Updates to template_utils&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
James Bennett’s Django template_utils library now provides tags for consuming external RSS and Atom feeds. Combine with template fragment caching for an instant mashup written just using templates.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/atom"&gt;atom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/feeds"&gt;feeds&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rss"&gt;rss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/templateutils"&gt;templateutils&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/universalfeedparser"&gt;universalfeedparser&lt;/a&gt;&lt;/p&gt;



</summary><category term="atom"/><category term="django"/><category term="feeds"/><category term="james-bennett"/><category term="python"/><category term="rss"/><category term="templateutils"/><category term="universalfeedparser"/></entry><entry><title>Newforms, part 1</title><link href="https://simonwillison.net/2007/Nov/23/blist/#atom-tag" rel="alternate"/><published>2007-11-23T23:54:28+00:00</published><updated>2007-11-23T23:54:28+00:00</updated><id>https://simonwillison.net/2007/Nov/23/blist/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.b-list.org/weblog/2007/nov/22/newforms/"&gt;Newforms, part 1&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
James Bennett provides a detailed description of Django’s newforms (not so new now though, they’ve been around for over a year), complete with attractive diagrams.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/newforms"&gt;newforms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="james-bennett"/><category term="newforms"/><category term="python"/></entry><entry><title>Django documentation bookmarklets</title><link href="https://simonwillison.net/2007/Nov/8/blist/#atom-tag" rel="alternate"/><published>2007-11-08T10:59:29+00:00</published><updated>2007-11-08T10:59:29+00:00</updated><id>https://simonwillison.net/2007/Nov/8/blist/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.b-list.org/weblog/2007/nov/07/bookmarklets/"&gt;Django documentation bookmarklets&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
James Bennett continues his month-long series of daily Django tutorials with documentation for one of Django’s best kept secrets: application introspection HTTP headers and bookmarklets that make use of them.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bookmarklets"&gt;bookmarklets&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/introspection"&gt;introspection&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="bookmarklets"/><category term="django"/><category term="introspection"/><category term="james-bennett"/><category term="python"/></entry><entry><title>JavaScript Minifier that doesn't break code</title><link href="https://simonwillison.net/2007/Jun/4/peters/#atom-tag" rel="alternate"/><published>2007-06-04T17:44:46+00:00</published><updated>2007-06-04T17:44:46+00:00</updated><id>https://simonwillison.net/2007/Jun/4/peters/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://peter.michaux.ca/article/2242"&gt;JavaScript Minifier that doesn&amp;#x27;t break code&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Perl re-implementation of Douglas Crockford’s classic JSMin that doesn’t clobber IE’s conditional comments, by Peter Michaux.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.b-list.org/links/2007/05/27/javascript-minifier-doesnt-break-code-perl"&gt;James Bennett&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/conditionalcomments"&gt;conditionalcomments&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/douglas-crockford"&gt;douglas-crockford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/internet-explorer"&gt;internet-explorer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jsmin"&gt;jsmin&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/perl"&gt;perl&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pete-michaux"&gt;pete-michaux&lt;/a&gt;&lt;/p&gt;



</summary><category term="conditionalcomments"/><category term="douglas-crockford"/><category term="internet-explorer"/><category term="james-bennett"/><category term="javascript"/><category term="jsmin"/><category term="perl"/><category term="pete-michaux"/></entry><entry><title>Django snippets</title><link href="https://simonwillison.net/2007/Feb/26/snippets/#atom-tag" rel="alternate"/><published>2007-02-26T10:08:34+00:00</published><updated>2007-02-26T10:08:34+00:00</updated><id>https://simonwillison.net/2007/Feb/26/snippets/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.djangosnippets.org/"&gt;Django snippets&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
James Bennett’s new site for Django snippets. The source code to the whole site is available.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django-snippets"&gt;django-snippets&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="django-snippets"/><category term="james-bennett"/><category term="python"/></entry><entry><title>mimeparse.py</title><link href="https://simonwillison.net/2007/Jan/8/mimeparse/#atom-tag" rel="alternate"/><published>2007-01-08T18:43:04+00:00</published><updated>2007-01-08T18:43:04+00:00</updated><id>https://simonwillison.net/2007/Jan/8/mimeparse/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://bitworking.org/projects/mimeparse/"&gt;mimeparse.py&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Parsing mime-types is harder than you might think.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.b-list.org/links/2007/01/08/mimeparsepy"&gt;James Bennett&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/james-bennett"&gt;james-bennett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mimetypes"&gt;mimetypes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="james-bennett"/><category term="mimetypes"/><category term="python"/></entry></feed>