<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>treibsand.com &#187; Django</title>
	<atom:link href="http://www.treibsand.com/tag/django/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.treibsand.com</link>
	<description></description>
	<lastBuildDate>Tue, 27 Dec 2011 12:46:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Ärger mit Generic Views von Django</title>
		<link>http://www.treibsand.com/2009/03/09/arger-mit-generic-views-von-django/</link>
		<comments>http://www.treibsand.com/2009/03/09/arger-mit-generic-views-von-django/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 10:16:12 +0000</pubDate>
		<dc:creator>Toast</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Generic Views]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.treibsand.com/?p=285</guid>
		<description><![CDATA[Django ist ja eines der besten Frameworks für Python um schnell Webanwendungen zu realisieren. Allerdings ist es leider noch nicht so ausgereift wie z.B. Ruby on Rails. Die Generic Views von Django sind zwar sehr hilfreich, allerdings nicht ganz konsequent umgesetzt. So gibt es bei den Views create\_object, update\_object und delete\_object die Möglichkeit login\_required zu [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.djangoproject.com">Django</a> ist ja eines der besten Frameworks für Python um schnell Webanwendungen zu realisieren. Allerdings ist es leider noch nicht so ausgereift wie z.B. Ruby on Rails. Die Generic Views von Django sind zwar sehr hilfreich, allerdings nicht ganz konsequent umgesetzt.</p>
<p><span id="more-285"></span><br />
So gibt es bei den Views <b>create\_object</b>, <b>update\_object</b> und <b>delete\_object</b> die Möglichkeit <b>login\_required</b> zu übergeben, aber bei anderen Views wie z.B. <b>direct\_to\_template</b> nicht. Das ist ziemlich ärgerlich, da es hier genauso Sinn machen würde.</p>
<p>Allerdings gibt es einen kleinen Workaround&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">auth</span>.<span style="color: black;">decorators</span> <span style="color: #ff7700;font-weight:bold;">import</span> login_required 
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">views</span>.<span style="color: black;">generic</span>.<span style="color: black;">simple</span> <span style="color: #ff7700;font-weight:bold;">import</span> direct_to_template
&nbsp;
urlpatterns = patterns<span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>,
	<span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^meineurl/$'</span>,login_required<span style="color: black;">&#40;</span>direct_to_template<span style="color: black;">&#41;</span>,
		<span style="color: black;">&#123;</span><span style="color: #483d8b;">'template'</span>:<span style="color: #483d8b;">'welcome.html'</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>,
...</pre></div></div>

<p>Dadurch erhält man das gleiche Ergebnis, wie wenn man <b>login\_required</b> als Argument dem View übergibt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.treibsand.com/2009/03/09/arger-mit-generic-views-von-django/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mit Django Datenbank Tabellen ändern</title>
		<link>http://www.treibsand.com/2008/04/17/mit-django-datenbank-tabellen-andern/</link>
		<comments>http://www.treibsand.com/2008/04/17/mit-django-datenbank-tabellen-andern/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 15:40:30 +0000</pubDate>
		<dc:creator>Toast</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://test.treibsand.com/?p=139</guid>
		<description><![CDATA[&#8230;geht leider nicht. Ist ein Datenbank Model einmal definiert, lässt es sich nicht ohne Umwege erweitern. Ruby on Rails ist da schon ein Stück weiter. Das Problem lässt sich aber mit einem kleinen Trick lösen. Mit Django hat man die Möglichkeit die komplette Datenbank serialisiert zu dumpen und anschliesend wieder zu laden. Die Vorgehensweise ist [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230;geht leider nicht. Ist ein Datenbank Model einmal definiert, lässt es sich nicht ohne Umwege erweitern. Ruby on Rails ist da schon ein Stück weiter.</p>
<p><span id="more-139"></span><br />
Das Problem lässt sich aber mit einem kleinen Trick lösen. Mit Django hat man die Möglichkeit die komplette Datenbank serialisiert zu dumpen und anschliesend wieder zu laden. Die Vorgehensweise ist einfach, einen Dump vom Model bzw. der ganzen Datenbank machen, Model um die gewünschten Felder erweitern, DB Tabellen löschen, Tabellen mit syncdb neu anlegen und den Dump wieder einspielen.</p>
<p>Die komplette Datenbank kann mit</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">python manage.py dumpdata <span style="color: #000000; font-weight: bold;">&gt;</span> mydump.json</pre></div></div>

<p>gedumpt werden. Einzelne Models mit</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">python manage.py dumpdata MyModel <span style="color: #000000; font-weight: bold;">&gt;</span> mydump.json</pre></div></div>

<p>Das importieren des Dumps geht wie folgt:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">python manage.py loaddata mydump.json</pre></div></div>

<p>Will man aber z.B. eine Anwendung mit initialen Daten versorgen, dann kann das mit Fixtures gemacht werden. Hierfür ist ein Eintrag in der Settings Datei notwendig.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">FIXTURE_DIRS = <span style="color: black;">&#40;</span>
        <span style="color: #483d8b;">'/absoluter/pfad/zum/fixtures/verzeichnis'</span>,
<span style="color: black;">&#41;</span></pre></div></div>

<p>Liegt nun in diesem Verzeichnis eine Datei mit der Endung json, dann wird diese automatisch beim syncdb geladen und importiert. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.treibsand.com/2008/04/17/mit-django-datenbank-tabellen-andern/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sitemaps mit Django erstellen</title>
		<link>http://www.treibsand.com/2008/04/12/django_sitemaps/</link>
		<comments>http://www.treibsand.com/2008/04/12/django_sitemaps/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 15:45:25 +0000</pubDate>
		<dc:creator>Toast</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://test.treibsand.com/?p=143</guid>
		<description><![CDATA[Eine Sitemap ist nichts weiter als eine XML Datei auf dem Webserver, welche Suchmaschinen sagt wie sich Seiten geändert haben, und wie wichtig einzelne Seiten sind. Ausserdem kann man so Seiten Suchmaschinen geben, die evtl. nicht in den Index aufgenommen werden. Zum Glück nimmt Django einem die Arbeit ab, so dass Sitemaps automatisch erzeugt werden [...]]]></description>
			<content:encoded><![CDATA[<p>Eine Sitemap ist nichts weiter als eine XML Datei auf dem Webserver, welche Suchmaschinen sagt wie sich Seiten geändert haben, und wie wichtig einzelne Seiten sind. Ausserdem kann man so Seiten Suchmaschinen geben, die evtl. nicht in den Index aufgenommen werden.</p>
<p><span id="more-143"></span><br />
Zum Glück nimmt Django einem die Arbeit ab, so dass Sitemaps automatisch erzeugt werden können. Die Installation ist ziemlich simpel:</p>
<ul>
<li>Das Modul &#8216;django.contrib.sitemaps&#8217; zu den INSTALLED_APPS hinzufügen</li>
<li>Sicherstellen, dass &#8216;django.template.loaders.app_directories.load_template_source&#8217; in den Template Loaders eingetragen ist</li>
<li>Sicherstellen, dass das sites framework aktiviert ist</li>
</ul>
<p>Danach sind nur noch wenige Einträge in der Datei urls.py zu machen&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">conf</span>.<span style="color: black;">urls</span>.<span style="color: black;">defaults</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">sitemaps</span> <span style="color: #ff7700;font-weight:bold;">import</span> FlatPageSitemap, GenericSitemap
<span style="color: #ff7700;font-weight:bold;">from</span> mysite.<span style="color: black;">blog</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Entry
&nbsp;
info_dict = <span style="color: black;">&#123;</span>
    <span style="color: #483d8b;">'queryset'</span>: Entry.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>,
    <span style="color: #483d8b;">'date_field'</span>: <span style="color: #483d8b;">'pub_date'</span>,
<span style="color: black;">&#125;</span>
&nbsp;
sitemaps = <span style="color: black;">&#123;</span>
    <span style="color: #483d8b;">'flatpages'</span>: FlatPageSitemap,
    <span style="color: #483d8b;">'blog'</span>: GenericSitemap<span style="color: black;">&#40;</span>info_dict, priority=<span style="color: #ff4500;">0.6</span><span style="color: black;">&#41;</span>,
<span style="color: black;">&#125;</span>
&nbsp;
urlpatterns = patterns<span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>,
    <span style="color: #808080; font-style: italic;"># ...</span>
    <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^sitemap.xml$'</span>, <span style="color: #483d8b;">'django.contrib.sitemaps.views.sitemap'</span>, <span style="color: black;">&#123;</span><span style="color: #483d8b;">'sitemaps'</span>: sitemaps<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#41;</span></pre></div></div>

<p>Mehr ist nicht zu machen <img src='http://www.treibsand.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  </p>
<p>Es ist sogar möglich, bei Aenderungen am Model Google zu pingen, so dass die Sitemaps neu eingelesen werden&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">sitemaps</span> <span style="color: #ff7700;font-weight:bold;">import</span> ping_google
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Entry<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># ...</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> save<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>Entry, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            ping_google<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span>:
            <span style="color: #808080; font-style: italic;"># Bare 'except' because we could get a variety</span>
            <span style="color: #808080; font-style: italic;"># of HTTP-related exceptions.</span>
            <span style="color: #ff7700;font-weight:bold;">pass</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.treibsand.com/2008/04/12/django_sitemaps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mit Django JSON ausliefern</title>
		<link>http://www.treibsand.com/2008/02/14/django_json/</link>
		<comments>http://www.treibsand.com/2008/02/14/django_json/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 14:50:27 +0000</pubDate>
		<dc:creator>Toast</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://test.treibsand.com/?p=85</guid>
		<description><![CDATA[Dank den neuen JavaScript Frameworks wie z.B. Prototype und MochiKit ist es mittlerweile ziemlich einfach dynamische Webinhalte mit AJAX zu machen. Doch die Daten müssen erstmal in die passende Form gebracht werden, um verarbeitet werden zu können. Eine Möglichkeit ist JSON (JavaScript Object Notation). Dank Djano kann das auch sehr einfach werden. Um zum Beispiel [...]]]></description>
			<content:encoded><![CDATA[<p>Dank den neuen JavaScript Frameworks wie z.B. Prototype und MochiKit ist es mittlerweile ziemlich einfach dynamische Webinhalte mit AJAX zu machen. </p>
<p><span id="more-85"></span><br />
Doch die Daten müssen erstmal in die passende Form gebracht werden, um verarbeitet werden zu können. Eine Möglichkeit ist JSON (JavaScript Object Notation).</p>
<p>Dank Djano kann das auch sehr einfach werden. Um zum Beispiel alle Einträge aus den Feldern &#8220;name&#8221; und &#8220;size&#8221; einer Tabelle mit JSON bereitzustellen reicht folgender Code aus:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> someproject.<span style="color: black;">someapp</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> SomeModel
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">http</span> <span style="color: #ff7700;font-weight:bold;">import</span> HttpResponse
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">core</span> <span style="color: #ff7700;font-weight:bold;">import</span> serializers
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> json<span style="color: black;">&#40;</span>request,<span style="color: black;">&#41;</span>:
  data = serializers.<span style="color: black;">serialize</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'json'</span>, SomeModel.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, fields=<span style="color: black;">&#40;</span><span style="color: #483d8b;">'name'</span>,<span style="color: #483d8b;">'size'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">return</span> HttpResponse<span style="color: black;">&#40;</span>data, mimetype=<span style="color: #483d8b;">&quot;text/plain&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Und schon kann man per URL JSON Daten abfragen. Happy coding! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.treibsand.com/2008/02/14/django_json/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Shortcut Decorator</title>
		<link>http://www.treibsand.com/2006/08/25/shortcut-decorator/</link>
		<comments>http://www.treibsand.com/2006/08/25/shortcut-decorator/#comments</comments>
		<pubDate>Fri, 25 Aug 2006 19:15:27 +0000</pubDate>
		<dc:creator>Toast</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://test.treibsand.com/2006/08/25/shortcut-decorator/</guid>
		<description><![CDATA[Ist es nicht manchmal nervig bei Django in views render_to_response aufzurufen, und gegf. sogar noch den Context? Vor kurzem brauchte ich den Template Processor django.core.context_processors.auth, um auf die Session Variable &#8220;user&#8221; zuzugreifen In generic views ist dies ja bereits automatisch der fall, dass die Variable im Template verfuegbar ist. Bei normalen views muss man allerdings [...]]]></description>
			<content:encoded><![CDATA[<p>Ist es nicht manchmal nervig bei Django in views render_to_response aufzurufen, und gegf. sogar noch den Context? Vor kurzem brauchte ich den Template Processor django.core.context_processors.auth, um auf die Session Variable &#8220;user&#8221; zuzugreifen</p>
<p><span id="more-32"></span><br />
In generic views ist dies ja bereits automatisch der fall, dass die Variable im Template verfuegbar ist. Bei normalen views muss man allerdings jeweils den richtigen Context angeben, wie z.B. mit</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> myview<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
  ...
  <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;template.html&quot;</span>,
    context_instance=RequestContext<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Das kann mit der Zeit ziemlich nervig werden. Mit folgendem Decorator kann man sich das Leben erheblich leichert machen:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">template</span>.<span style="color: black;">context</span> <span style="color: #ff7700;font-weight:bold;">import</span> RequestContext
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">http</span> <span style="color: #ff7700;font-weight:bold;">import</span> HttpResponse
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">shortcuts</span> <span style="color: #ff7700;font-weight:bold;">import</span> render_to_response
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> page<span style="color: black;">&#40;</span>template=<span style="color: #008000;">None</span>, <span style="color: #66cc66;">**</span>decorator_args<span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">def</span> _wrapper<span style="color: black;">&#40;</span>fn<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> _innerWrapper<span style="color: black;">&#40;</span>request, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kw<span style="color: black;">&#41;</span>:
      context_dict = decorator_args.<span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
      g = fn<span style="color: black;">&#40;</span>request, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kw<span style="color: black;">&#41;</span>
      <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">hasattr</span><span style="color: black;">&#40;</span>g, <span style="color: #483d8b;">'next'</span><span style="color: black;">&#41;</span>: 
        g = <span style="color: black;">&#40;</span>g,<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> g:
          <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>i, HttpResponse<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> i
          <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">type</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span> == <span style="color: #008000;">type</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
            context_dict<span style="color: black;">&#91;</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span> = i<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
          <span style="color: #ff7700;font-weight:bold;">else</span>:
            context_dict.<span style="color: black;">update</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
        template_name = context_dict.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;template&quot;</span>,  template<span style="color: black;">&#41;</span>
        context_instance = RequestContext<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span>template_name, context_dict, context_instance<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> _innerWrapper
  <span style="color: #ff7700;font-weight:bold;">return</span> _wrapper</pre></div></div>

<p>Dadurch kann man bei einem view per Decorator direkt das Template angeben, ohne render_to_response aufzrufen:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">@page<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;template.html&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> myview<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
  somedata = Data.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'data'</span>: somedata<span style="color: black;">&#125;</span></pre></div></div>

<p>Aber das ist noch nicht alles&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">@page<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;template.html&quot;</span>, title=<span style="color: #483d8b;">&quot;Titel der Seite&quot;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># extra Argument fuer den Context</span>
<span style="color: #ff7700;font-weight:bold;">def</span> myview<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
  somedata = Data.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">locals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># lokale Variable werden an den Context uebergeben, in  diesem Fall somedata</span></pre></div></div>

<p>Das Template muss auch nicht umbedingt im Decorator angegeben werden&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">@page<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> myview<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
  somedata = Data.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  template = <span style="color: #483d8b;">&quot;template2.html&quot;</span>
  <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">locals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># lokale Variable werden an den Context uebergeben, in  diesem Fall somedata</span></pre></div></div>

<p>Cool oder? <img src='http://www.treibsand.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.treibsand.com/2006/08/25/shortcut-decorator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django über CGI ausliefern</title>
		<link>http://www.treibsand.com/2006/08/03/django-uber-cgi-ausliefern/</link>
		<comments>http://www.treibsand.com/2006/08/03/django-uber-cgi-ausliefern/#comments</comments>
		<pubDate>Thu, 03 Aug 2006 15:22:17 +0000</pubDate>
		<dc:creator>Toast</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://test.treibsand.com/2006/08/03/django-uber-cgi-ausliefern/</guid>
		<description><![CDATA[Eigentlich ist ja die bevorzugte Methode, um Django Anwendungen auszuliefern, mod_python. Allerdings kann man teilweise nicht immer mod_python verwenden, z.B. wenn der Provider dies nicht unterstützt. Genau das gleiche gilt z.B. auch für FastCGI. Da Django selber WSGI kompatibel ist, ist es auch möglich Django über CGI auszuliefern. Hierfür braucht man allerdings natürlich ein CGI [...]]]></description>
			<content:encoded><![CDATA[<p>Eigentlich ist ja die bevorzugte Methode, um Django Anwendungen auszuliefern, mod_python. Allerdings kann man teilweise nicht immer mod_python verwenden, z.B. wenn der Provider dies nicht unterstützt. Genau das gleiche gilt z.B. auch für FastCGI. Da Django selber WSGI kompatibel ist, ist es auch möglich Django über CGI auszuliefern.</p>
<p><span id="more-12"></span><br />
Hierfür braucht man allerdings natürlich ein CGI Script, was die Server Komponente von FastCGI bzw. mod_python ersetzt. Ausserdem muss der Apache ein wenig angepasst werden, was auch in einer .htaccess Datei gemacht werden kann.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span> <span style="color: #ff7700;font-weight:bold;">import</span> WSGIHandler
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">core</span>.<span style="color: black;">servers</span>.<span style="color: black;">basehttp</span> <span style="color: #ff7700;font-weight:bold;">import</span> ServerHandler
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> CGIHandler <span style="color: black;">&#40;</span>ServerHandler<span style="color: black;">&#41;</span> :
	origin_server = <span style="color: #008000;">False</span>
	default_settings_module = <span style="color: #483d8b;">&quot;settings&quot;</span>
	status = <span style="color: #483d8b;">&quot;500&quot;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, environ, <span style="color: #66cc66;">*</span>path<span style="color: black;">&#41;</span>:
		<span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">extend</span> <span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>
		key = <span style="color: #483d8b;">&quot;DJANGO_SETTINGS_MODULE&quot;</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> key <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> environ :
			environ <span style="color: black;">&#91;</span>key<span style="color: black;">&#93;</span>    = <span style="color: #008000;">self</span>.<span style="color: black;">default_settings_module</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">request_handler</span> = <span style="color: #008000;">self</span>
		<span style="color: #008000;">super</span> <span style="color: black;">&#40;</span>CGIHandler, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span> <span style="color: black;">&#40;</span>
			<span style="color: #dc143c;">sys</span>.<span style="color: black;">stdin</span>, <span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span>, <span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>, environ,
			multithread  = <span style="color: #008000;">False</span>,
			multiprocess = <span style="color: #008000;">False</span>
		<span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> run <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, cls<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">super</span> <span style="color: black;">&#40;</span>CGIHandler, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">run</span> <span style="color: black;">&#40;</span>cls <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> log_request <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, status, <span style="color: #dc143c;">bytes</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
CGIHandler<span style="color: black;">&#40;</span>
	<span style="color: #dc143c;">os</span>.<span style="color: black;">environ</span>,
	<span style="color: #483d8b;">&quot;/pfad/zum/projekt&quot;</span>
<span style="color: black;">&#41;</span>.<span style="color: black;">run</span> <span style="color: black;">&#40;</span>WSGIHandler<span style="color: black;">&#41;</span></pre></div></div>

<p>Das CGI Script kann z.B. so aussehen  Das Script heisst bei mir django.cgi und liegt direkt im Projekt Ordner. Falls die Environment Variable DJANGO_SETTINGS_MODULE gesetzt ist, dann wird diese auch verwendet, ansonsten wird die Datei settings.py im Projekt Ordner verwendet.</p>
<p>Die Konfiguration von Apache ist jetzt nicht mehr schwer:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">AliasMatch ^<span style="color: #000000; font-weight: bold;">/</span>MYAPP<span style="color: #7a0874; font-weight: bold;">&#40;</span>.<span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">/</span>pfad<span style="color: #000000; font-weight: bold;">/</span>zum<span style="color: #000000; font-weight: bold;">/</span>projekt<span style="color: #000000; font-weight: bold;">/</span>django.cgi<span style="color: #000000; font-weight: bold;">/</span>MYAPP<span style="color: #007800;">$1</span>
&nbsp;
  AddHandler  cgi-script .cgi
  Options ExecCGI</pre></div></div>

<p>Diese Anweisungen bewirken, dass alle Anfragen für http://domain/MYAPP von der Datei django.cgi abgewickelt werden. Es wurde erst vor kurzem ein Ticket aufgemacht, mit welchem ein CGI Handler zu Django hinzugefügt wird. Allerdings kann das wohl noch eine Weile dauern, bis dies wirklich eingebaut ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.treibsand.com/2006/08/03/django-uber-cgi-ausliefern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

