﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-sealyu-随笔分类-Python</title><link>http://www.blogjava.net/sealyu/category/34557.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 07 Nov 2008 18:40:07 GMT</lastBuildDate><pubDate>Fri, 07 Nov 2008 18:40:07 GMT</pubDate><ttl>60</ttl><item><title>How to use Django with Apache and mod_python</title><link>http://www.blogjava.net/sealyu/archive/2008/11/07/239347.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Fri, 07 Nov 2008 15:44:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/07/239347.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/239347.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/07/239347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/239347.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/239347.html</trackback:ping><description><![CDATA[<p><a external="" href="http://httpd.apache.org/">Apache</a> with <a external="" href="http://www.modpython.org/">mod_python</a> currently is the preferred setup for using Django
on a production server.</p>
<p>mod_python is similar to (and inspired by) <a external="" href="http://perl.apache.org/">mod_perl</a> : It embeds Python within
Apache and loads Python code into memory when the server starts. Code stays in
memory throughout the life of an Apache process, which leads to significant
performance gains over other server arrangements.</p>
<p>Django requires Apache 2.x and mod_python 3.x, and you should use Apache&#8217;s
<a external="" href="http://httpd.apache.org/docs/2.2/mod/prefork.html">prefork MPM</a>, as opposed to the <a external="" href="http://httpd.apache.org/docs/2.2/mod/worker.html">worker MPM</a>.</p>
<p>You may also be interested in <a external="" href="http://docs.djangoproject.com/en/dev/howto/deployment/fastcgi/#howto-deployment-fastcgi"><em>How to use Django with FastCGI, SCGI or AJP</em></a> (which also covers SCGI and AJP).</p>
<div id="s-basic-configuration">
<h2 id="basic-configuration">Basic configuration<a href="http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs#basic-configuration" title="Permalink to this headline">&#182;</a></h2>
<p>To configure Django with mod_python, first make sure you have Apache installed,
with the mod_python module activated.</p>
<p>Then edit your <tt literal="">httpd.conf</tt> file and add the following:</p>
<div>
<pre>&lt;Location "/mysite/"&gt;<br />
SetHandler python-program<br />
PythonHandler django.core.handlers.modpython<br />
SetEnv DJANGO_SETTINGS_MODULE mysite.settings<br />
PythonOption django.root /mysite<br />
PythonDebug On<br />
&lt;/Location&gt;<br />
</pre>
</div>
<p>...and replace <tt literal="">mysite.settings</tt> with the Python import path to your Django
project's settings file.</p>
<p>This tells Apache: "Use mod_python for any URL at or under '/mysite/', using the
Django mod_python handler." It passes the value of <a external="" href="http://docs.djangoproject.com/en/dev/topics/settings/#django-settings-module"><em>DJANGO_SETTINGS_MODULE</em></a> so mod_python knows which settings to use.</p>
<div>
New in Django 1.0: The <tt literal="">PythonOption django.root ...</tt> is new in this version.</div>
<p>Because mod_python does not know we are
serving this site from underneath the <tt literal="">/mysite/</tt> prefix, this value needs to
be passed through to the mod_python handler in Django, via the <tt literal="">PythonOption
django.root ...</tt> line. The value set on that line (the last item) should
match the string given in the <tt literal="">&lt;Location ...&gt;</tt> directive. The effect of this
is that Django will automatically strip the <tt literal="">/mysite</tt> string from the front
of any URLs before matching them against your <tt literal="">URLConf</tt> patterns. If you
later move your site to live under <tt literal="">/mysite2</tt>, you will not have to change
anything except the <tt literal="">django.root</tt> option in the config file.</p>
<p>When using <tt literal="">django.root</tt> you should make sure that what's left, after the
prefix has been removed, begins with a slash. Your URLConf patterns that are
expecting an initial slash will then work correctly. In the above example,
since we want to send things like <tt literal="">/mysite/admin/</tt> to <tt literal="">/admin/</tt>, we need
to remove the string <tt literal="">/mysite</tt> from the beginning, so that is the
<tt literal="">django.root</tt> value. It would be an error to use <tt literal="">/mysite/</tt> (with a
trailing slash) in this case.</p>
<p>Note that we're using the <tt literal="">&lt;Location&gt;</tt> directive, not the <tt literal="">&lt;Directory&gt;</tt>
directive. The latter is used for pointing at places on your filesystem,
whereas <tt literal="">&lt;Location&gt;</tt> points at places in the URL structure of a Web site.
<tt literal="">&lt;Directory&gt;</tt> would be meaningless here.</p>
<p>Also, if your Django project is not on the default <tt literal="">PYTHONPATH</tt> for your
computer, you'll have to tell mod_python where your project can be found:</p>
<pre>&lt;Location "/mysite/"&gt;<br />
SetHandler python-program<br />
PythonHandler django.core.handlers.modpython<br />
SetEnv DJANGO_SETTINGS_MODULE mysite.settings<br />
PythonOption django.root /mysite<br />
PythonDebug On<br />
<strong>PythonPath "['/path/to/project'] + sys.path"</strong><br />
&lt;/Location&gt;<br />
</pre>
<p>The value you use for <tt literal="">PythonPath</tt> should include the parent directories of
all the modules you are going to import in your application. It should also
include the parent directory of the <a external="" href="http://docs.djangoproject.com/en/dev/topics/settings/#django-settings-module"><em>DJANGO_SETTINGS_MODULE</em></a> location. This is exactly the same situation as
setting the Python path for interactive usage. Whenever you try to import
something, Python will run through all the directories in <tt literal="">sys.path</tt> in turn,
from first to last, and try to import from each directory until one succeeds.</p>
<p>An example might make this clearer. Suppose you have some applications under
<tt literal="">/usr/local/django-apps/</tt> (for example, <tt literal="">/usr/local/django-apps/weblog/</tt> and
so forth), your settings file is at <tt literal="">/var/www/mysite/settings.py</tt> and you have
specified <a external="" href="http://docs.djangoproject.com/en/dev/topics/settings/#django-settings-module"><em>DJANGO_SETTINGS_MODULE</em></a> as in the above
example. In this case, you would need to write your <tt literal="">PythonPath</tt> directive
as:</p>
<div>
<pre>PythonPath "['/usr/local/django-apps/', '/var/www'] + sys.path"<br />
</pre>
</div>
<p>With this path, <tt literal="">import weblog</tt> and <tt literal="">import mysite.settings</tt> will both
work. If you had <tt literal="">import blogroll</tt> in your code somewhere and <tt literal="">blogroll</tt>
lived under the <tt literal="">weblog/</tt> directory, you would <em>also</em> need to add
<tt literal="">/usr/local/django-apps/weblog/</tt> to your <tt literal="">PythonPath</tt>. Remember: the
<strong>parent directories</strong> of anything you import directly must be on the Python
path.</p>
<div note="">
<p admonition-title="">Note</p>
<p>If you're using Windows, we still recommended that you use forward
slashes in the pathnames, even though Windows normally uses the backslash
character as its native separator. Apache knows how to convert from the
forward slash format to the native format, so this approach is portable and
easier to read. (It avoids tricky problems with having to double-escape
backslashes.)</p>
<p>This is valid even on a Windows system:</p>
<div>
<pre>PythonPath "['c:/path/to/project'] + sys.path"<br />
</pre>
</div>
</div>
<p>You can also add directives such as <tt literal="">PythonAutoReload Off</tt> for performance.
See the <a external="" href="http://modpython.org/live/current/doc-html/directives.html">mod_python documentation</a> for a full list of options.</p>
<p>Note that you should set <tt literal="">PythonDebug Off</tt> on a production server. If you
leave <tt literal="">PythonDebug On</tt>, your users would see ugly (and revealing) Python
tracebacks if something goes wrong within mod_python.</p>
<p>Restart Apache, and any request to <tt literal="">/mysite/</tt> or below will be served by
Django. Note that Django's URLconfs won't trim the "/mysite/" -- they get passed
the full URL.</p>
<p>When deploying Django sites on mod_python, you'll need to restart Apache each
time you make changes to your Python code.</p>
</div>
<div id="s-multiple-django-installations-on-the-same-apache">
<h2 id="multiple-django-installations-on-the-same-apache">Multiple Django installations on the same Apache<a href="http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs#multiple-django-installations-on-the-same-apache" title="Permalink to this headline">&#182;</a></h2>
<p>It's entirely possible to run multiple Django installations on the same Apache
instance. Just use <tt literal="">VirtualHost</tt> for that, like so:</p>
<div>
<pre>NameVirtualHost *<br />
<br />
&lt;VirtualHost *&gt;<br />
ServerName www.example.com<br />
# ...<br />
SetEnv DJANGO_SETTINGS_MODULE mysite.settings<br />
&lt;/VirtualHost&gt;<br />
<br />
&lt;VirtualHost *&gt;<br />
ServerName www2.example.com<br />
# ...<br />
SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings<br />
&lt;/VirtualHost&gt;<br />
</pre>
</div>
<p>If you need to put two Django installations within the same <tt literal="">VirtualHost</tt>
(or in different <tt literal="">VirtualHost</tt> blocks that share the same server name),
you'll need to take a special precaution to ensure mod_python's cache doesn't
mess things up. Use the <tt literal="">PythonInterpreter</tt> directive to give different
<tt literal="">&lt;Location&gt;</tt> directives separate interpreters:</p>
<div>
<pre>&lt;VirtualHost *&gt;<br />
ServerName www.example.com<br />
# ...<br />
&lt;Location "/something"&gt;<br />
SetEnv DJANGO_SETTINGS_MODULE mysite.settings<br />
PythonInterpreter mysite<br />
&lt;/Location&gt;<br />
<br />
&lt;Location "/otherthing"&gt;<br />
SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings<br />
PythonInterpreter othersite<br />
&lt;/Location&gt;<br />
&lt;/VirtualHost&gt;<br />
</pre>
</div>
<p>The values of <tt literal="">PythonInterpreter</tt> don't really matter, as long as they're
different between the two <tt literal="">Location</tt> blocks.</p>
</div>
<div id="s-running-a-development-server-with-mod-python">
<h2 id="running-a-development-server-with-mod-python">Running a development server with mod_python<a href="http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs#running-a-development-server-with-mod-python" title="Permalink to this headline">&#182;</a></h2>
<p>If you use mod_python for your development server, you can avoid the hassle of
having to restart the server each time you make code changes. Just set
<tt literal="">MaxRequestsPerChild 1</tt> in your <tt literal="">httpd.conf</tt> file to force Apache to reload
everything for each request. But don't do that on a production server, or we'll
revoke your Django privileges.</p>
<p>If you're the type of programmer who debugs using scattered <tt literal="">print</tt>
statements, note that <tt literal="">print</tt> statements have no effect in mod_python; they
don't appear in the Apache log, as one might expect. If you have the need to
print debugging information in a mod_python setup, either do this:</p>
<div>
<pre>assert False, the_value_i_want_to_see<br />
</pre>
</div>
<p>Or add the debugging information to the template of your page.</p>
</div>
<div id="s-id1">
<h2 id="id1">Serving media files<a href="http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs#id1" title="Permalink to this headline">&#182;</a></h2>
<p>Django doesn't serve media files itself; it leaves that job to whichever Web
server you choose.</p>
<p>We recommend using a separate Web server -- i.e., one that's not also running
Django -- for serving media. Here are some good choices:</p>
<ul>
    <li><a external="" href="http://www.lighttpd.net/">lighttpd</a></li>
    <li><a external="" href="http://en.wikipedia.org/wiki/TUX_web_server">TUX</a></li>
    <li>A stripped-down version of <a external="" href="http://httpd.apache.org/">Apache</a></li>
</ul>
<p>If, however, you have no option but to serve media files on the same Apache
<tt literal="">VirtualHost</tt> as Django, here's how you can turn off mod_python for a
particular part of the site:</p>
<div>
<pre>&lt;Location "/media"&gt;<br />
SetHandler None<br />
&lt;/Location&gt;<br />
</pre>
</div>
<p>Just change <tt literal="">Location</tt> to the root URL of your media files. You can also use
<tt literal="">&lt;LocationMatch&gt;</tt> to match a regular expression.</p>
<p>This example sets up Django at the site root but explicitly disables Django for
the <tt literal="">media</tt> subdirectory and any URL that ends with <tt literal="">.jpg</tt>, <tt literal="">.gif</tt> or
<tt literal="">.png</tt>:</p>
<div>
<pre>&lt;Location "/"&gt;<br />
SetHandler python-program<br />
PythonHandler django.core.handlers.modpython<br />
SetEnv DJANGO_SETTINGS_MODULE mysite.settings<br />
&lt;/Location&gt;<br />
<br />
&lt;Location "/media"&gt;<br />
SetHandler None<br />
&lt;/Location&gt;<br />
<br />
&lt;LocationMatch "".(jpg|gif|png)$"&gt;<br />
SetHandler None<br />
&lt;/LocationMatch&gt;<br />
</pre>
</div>
</div>
<div id="s-id3">
<h2 id="id3">Serving the admin files<a href="http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs#id3" title="Permalink to this headline">&#182;</a></h2>
<p>Note that the Django development server automagically serves admin media files,
but this is not the case when you use any other server arrangement. You're
responsible for setting up Apache, or whichever media server you're using, to
serve the admin files.</p>
<p>The admin files live in (<tt literal="">django/contrib/admin/media</tt>) of the Django
distribution.</p>
<p>Here are two recommended approaches:</p>
<ol simple="">
    <li>Create a symbolic link to the admin media files from within your
    document root. This way, all of your Django-related files -- code <strong>and</strong>
    templates -- stay in one place, and you'll still be able to <tt literal="">svn
    update</tt> your code to get the latest admin templates, if they change.</li>
    <li>Or, copy the admin media files so that they live within your Apache
    document root.</li>
</ol>
</div>
<div id="s-using-eggs-with-mod-python">
<h2 id="using-eggs-with-mod-python">Using "eggs" with mod_python<a href="http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs#using-eggs-with-mod-python" title="Permalink to this headline">&#182;</a></h2>
<p>If you installed Django from a Python <a external="" href="http://peak.telecommunity.com/DevCenter/PythonEggs">egg</a> or are using eggs in your Django
project, some extra configuration is required. Create an extra file in your
project (or somewhere else) that contains something like the following:</p>
<div>
<pre>import os<br />
os.environ['PYTHON_EGG_CACHE'] = '/some/directory'<br />
</pre>
</div>
<p>Here, <tt literal="">/some/directory</tt> is a directory that the Apache webserver process can
write to. It will be used as the location for any unpacking of code the eggs
need to do.</p>
<p>Then you have to tell mod_python to import this file before doing anything
else. This is done using the <a external="" href="http://www.modpython.org/live/current/doc-html/dir-other-pimp.html">PythonImport</a> directive to mod_python. You need
to ensure that you have specified the <tt literal="">PythonInterpreter</tt> directive to
mod_python as described <a internal="" href="http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs#multiple-django-installations-on-the-same-apache">above</a> (you need to do this even if you aren't
serving multiple installations in this case). Then add the <tt literal="">PythonImport</tt>
line in the main server configuration (i.e., outside the <tt literal="">Location</tt> or
<tt literal="">VirtualHost</tt> sections). For example:</p>
<div>
<pre>PythonInterpreter my_django<br />
PythonImport /path/to/my/project/file.py my_django<br />
</pre>
</div>
<p>Note that you can use an absolute path here (or a normal dotted import path),
as described in the <a external="" href="http://www.modpython.org/live/current/doc-html/dir-other-pimp.html">mod_python manual</a>. We use an absolute path in the
above example because if any Python path modifications are required to access
your project, they will not have been done at the time the <tt literal="">PythonImport</tt>
line is processed.</p>
</div>
<div id="s-error-handling">
<h2 id="error-handling">Error handling<a href="http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs#error-handling" title="Permalink to this headline">&#182;</a></h2>
<p>When you use Apache/mod_python, errors will be caught by Django -- in other
words, they won't propagate to the Apache level and won't appear in the Apache
<tt literal="">error_log</tt>.</p>
<p>The exception for this is if something is really wonky in your Django setup. In
that case, you'll see an "Internal Server Error" page in your browser and the
full Python traceback in your Apache <tt literal="">error_log</tt> file. The <tt literal="">error_log</tt>
traceback is spread over multiple lines. (Yes, this is ugly and rather hard to
read, but it's how mod_python does things.)</p>
</div>
<div id="s-if-you-get-a-segmentation-fault">
<h2 id="if-you-get-a-segmentation-fault">If you get a segmentation fault<a href="http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs#if-you-get-a-segmentation-fault" title="Permalink to this headline">&#182;</a></h2>
<p>If Apache causes a segmentation fault, there are two probable causes, neither
of which has to do with Django itself.</p>
<ol simple="">
    <li>It may be because your Python code is importing the "pyexpat" module,
    which may conflict with the version embedded in Apache. For full
    information, see <a external="" href="http://www.dscpl.com.au/articles/modpython-006.html">Expat Causing Apache Crash</a>.</li>
    <li>It may be because you're running mod_python and mod_php in the same
    Apache instance, with MySQL as your database backend. In some cases,
    this causes a known mod_python issue due to version conflicts in PHP and
    the Python MySQL backend. There's full information in the
    <a external="" href="http://modpython.org/FAQ/faqw.py?req=show&amp;file=faq02.013.htp">mod_python FAQ entry</a>.</li>
</ol>
<p>If you continue to have problems setting up mod_python, a good thing to do is
get a barebones mod_python site working, without the Django framework. This is
an easy way to isolate mod_python-specific problems. <a external="" href="http://www.dscpl.com.au/articles/modpython-001.html">Getting mod_python Working</a>
details this procedure.</p>
<p>The next step should be to edit your test code and add an import of any
Django-specific code you're using -- your views, your models, your URLconf,
your RSS configuration, etc. Put these imports in your test handler function
and access your test URL in a browser. If this causes a crash, you've confirmed
it's the importing of Django code that causes the problem. Gradually reduce the
set of imports until it stops crashing, so as to find the specific module that
causes the problem. Drop down further into modules and look into their imports,
as necessary.</p>
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/239347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-07 23:44 <a href="http://www.blogjava.net/sealyu/archive/2008/11/07/239347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在RedHat AS4 上安装Mysql_python模块时遇到的问题</title><link>http://www.blogjava.net/sealyu/archive/2008/11/07/239288.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Fri, 07 Nov 2008 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/07/239288.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/239288.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/07/239288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/239288.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/239288.html</trackback:ping><description><![CDATA[作者：sealyu 2008-11-7<br />
<br />
在RedHat AS4 上配置Apache+MySQL+Django 环境时，首先安装好了Apache和Python以及Django和Mysql，<br />
其中Mysql是编译安装的5.0版本。<br />
下载了MySQL-python-1.2.2.tar.gz之后，解压缩，cd进去，<br />
执行： python setup.py build时报错：<br />
<pre>File "/tmp/easy_install-nHSsgl/MySQL-python-1.2.2/setup_posix.py", line 26, in mysql_config<br />
EnvironmentError: mysql_config not found<br />
<br />
后来发现是由于Mysql编译安装后没有 mysql_config这个值，解决方法：<br />
打开 setup_posix.py, 将其中line：26手动改成系统中对应的Mysql选项（这里我的是/usr/local/mysql）：<br />
mysql_config = /usr/local/mysql/bin/mysql_config<br />
<br />
重新执行 ：python setup.py build，没有了刚才的错误，但是出现了另外一个错误：<br />
error： /usr/bin/ld: cannot find -lmysqlclient<br />
<br />
网上搜索了一下这个错误，发现有几种不同的情况，主要有以下几个原因：<br />
1.没有安装mysqlclient。解决方法：找到对应的版本进行安装。<br />
2.安装的mysqlclient的版本不匹配。对应链接： http://www.hao32.com/webserver/258.html<br />
3.已经安装了对应的mysqlclient但是找不到对应的链接。这是在一个国外的网站上看到的，具体网址已经找不到了，后来那位仁兄将对应的<br />
mysql_home/lib/mysql文件夹下面libmysqlclient对应的文件全部拷贝到/usr/local/lib下面才解决了问题。<br />
<br />
按照对应方案，问题解决。<br />
重新执行： <br />
python setup.py build<br />
python setup.py install<br />
安装完成。<br />
<br />
<br />
</pre>
<img src ="http://www.blogjava.net/sealyu/aggbug/239288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-07 17:03 <a href="http://www.blogjava.net/sealyu/archive/2008/11/07/239288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在linux上配置Django＋LIghthttpd ＋ fastcgi</title><link>http://www.blogjava.net/sealyu/archive/2008/11/06/239127.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 06 Nov 2008 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/06/239127.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/239127.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/06/239127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/239127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/239127.html</trackback:ping><description><![CDATA[<p>In today&#8217;s world, web development is all about turnaround.
Businesses want to maximize production outcome while minimizing
development and production time. Small, lean development teams are
increasingly becoming the normal large development departments. Enter
Django: a popular <a href="http://www.python.org%29/">Python</a> web
framework that invokes the RWAD (rapid web application development) and
DRY (don&#8217;t repeat yourself) principles with clean, pragmatic design.</p>
<p>This article is not about teaching you how to
program in Python, nor how to use the Django framework. It&#8217;s about
showing how to promote your Django applications onto an existing Apache
or Lighttpd environment. </p>
<p>We will conclude with a simple way that you can improve the
performance of your Django application by using caching to speed up
access time. This article also assumes that you are running Fedora as
your web application server, but all the packages mentioned in this
article are also available under the <a href="http://fedoraproject.org/wiki/EPEL">Extra Packages for Enterprise Linux repository </a>, which means these instructions should also be valid under Red Hat Enterprise Linux or CentOS servers.</p>
<h3>What you need</h3>
<p>You must have Django installed:</p>
<pre># yum install Django</pre>
<p>If you want to serve Django apps under Apache:</p>
<pre># yum install httpd<br />
# yum install mod_python</pre>
<p>If you want to serve Django apps under Lighttpd:</p>
<pre># yum install lighttpd<br />
# yum install lighttpd-fastcgi<br />
# yum install python-flup</pre>
<p>Installing memcached to &#8217;speed up&#8217; Django apps:</p>
<pre># yum install memcached<br />
# yum install python-memcached</pre>
<h3>Starting a new Django project</h3>
<p>1. Create a development workspace.</p>
<pre>$ mkdir -p $LOCATION_TO_YOUR_DEV_AREA<br />
$ cd $LOCATION_TO_YOUR_DEV_AREA</pre>
<p>2. Start a new base Django project. This creates the boiler plate project structure.</p>
<pre>$ django-admin.py startproject my_app</pre>
<p>3. Start the Django development web server on port 8080 (or whatever other port you&#8217;d like). </p>
<p>Note: The development web server is just for testing and verification. Do not use it as a production application server!</p>
<pre>$ python manage.py runserver 8080</pre>
<p>4. Run your Django project under Apache with mod_python by enabling mod_python on httpd.conf (/etc/httpd/conf/httpd.conf).</p>
<p>After installing mod_python, a file called python.conf should
already be placed in /etc/httpd/conf.d/, which enables mod_python on
your system.</p>
<p>5. Create virtual hosts by creating a new file at /etc/httpd/conf.d/myapp.conf.</p>
<pre><virtualhost * :80=""> <br />
<br />
DocumentRoot /var/www/html/<br />
ServerName your_domain_name<br />
ErrorLog logs/my_app-error.log<br />
CustomLog logs/my_app-access_log common <br />
<br />
<location my_app=""><br />
SetHandler python-program<br />
PythonHandler django.core.handlers.modpython<br />
SetEnv DJANGO_SETTINGS_MODULE my_app.settings<br />
PythonDebug On<br />
PythonPath &#8220;[&#8217;/var/www/django/&#8217;] + sys.path&#8221;<br />
</location>  <br />
<br />
</virtualhost> </pre>
<h3>Running your Django project under Lighthttpd with fastcgi</h3>
<p>The first thing you must do is start up your FastCGI server.</p>
<pre>./manage.py runfcgi method=prefork socket=/var/www/myapp.sock pidfile=django_myapp.pid</pre>
<p>Then modify your lighttpd.conf file to use the FastCGI server.</p>
<pre>server.document-root = "/var/www/django/"<br />
fastcgi.server = (<br />
"/my_app.fcgi" =&gt; (<br />
"main" =&gt; (<br />
# Use host / port instead of socket for TCP fastcgi<br />
# "host" =&gt; "127.0.0.1",<br />
# "port" =&gt; 3033,<br />
"socket" =&gt; "/var/www/my_app.sock",<br />
"check-local" =&gt; "disable",<br />
)<br />
),<br />
)<br />
alias.url = (<br />
"/media/" =&gt; "/var/www/django/media/",<br />
)<br />
<br />
url.rewrite-once = (<br />
"^(/media.*)$" =&gt; "$1",<br />
"^/favicon.ico$" =&gt; "/media/favicon.ico",<br />
"^(/.*)$" =&gt; "/my_app.fcgi$1",<br />
)</pre>
<p>Setting up caching in Django</p>
<p>Django has many different caching backends, including database,
memory, filesystem, and the ever popular memcached. According to <a href="http://www.danga.com/memcached/">http://www.danga.com/memcached/</a>,
memcached is &#8220;a high-performance, distributed memory object caching
system, generic in nature, but intended for use in speeding up dynamic
web applications by alleviating database load.&#8221; It&#8217;s used by high
traffic sites such as <a href="http://www.slashdot.org/">Slashdot</a> and <a href="http://www.wikipedia.com/">Wikipedia</a>. This makes it a prime candidate for caching in your cool new web app.</p>
<p>First, verify that memcached is running using the memcached&#8217;s init script.</p>
<pre>$ /etc/init.d/memcached status<br />
memcached (pid 6771) is running... </pre>
<p>If it&#8217;s not running, you can manually start it.</p>
<pre>$ /sbin/service memcached start</pre>
<p>If you want to make sure it will automatically start every time after a reboot:</p>
<pre>$ /sbin/chkconfig --level 35 memcached on </pre>
<p>Now that you have verified that memcached is running, you will want
to tell your Django application to use memcached as it&#8217;s caching
backend. You can do this by adding a CACHE_BACKEND entry to your
settings.py file.</p>
<pre>CACHE_BACKEND = 'memcached://127.0.0.1:11211/'</pre>
<p>The format is &#8220;backend://host:port/&#8221; or &#8220;backend:///path&#8221; depending
on the backend chosen. Since we are using memcached, we have the option
to run multiple daemons on different servers and share the cache across
multiple machines. If you want to do this all you must do is add in the
servers:port combinations in the CACHE_BACKEND and separate them by
semicolons. In this example we share the cache across three different
memcached servers:</p>
<pre>CACHE_BACKEND = 'memcached://127.0.0.1:11211;192.168.0.10:11211;192.168.0.11/'</pre>
<p>For more information on the different types of caching that can be performed in the Django framework, please refer to their <a href="http://www.djangoproject.com/documentation/cache/">official documentation</a>. </p>
<img src ="http://www.blogjava.net/sealyu/aggbug/239127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-06 22:36 <a href="http://www.blogjava.net/sealyu/archive/2008/11/06/239127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django在使用mod_python+apache中配置VirtualHost</title><link>http://www.blogjava.net/sealyu/archive/2008/11/06/239122.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 06 Nov 2008 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/06/239122.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/239122.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/06/239122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/239122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/239122.html</trackback:ping><description><![CDATA[<p>With <a href="http://www.djangoproject.com/weblog/2006/jul/29/095/">Django 0.95 being introduced being introduced a few days ago,</a>
I figured a quick post on what we experienced installing Django might
help someone out. None of this covers new ground, but perhaps another
telling of the story will provide someone an extra hook to grab onto.<br />
<br />
This tutorial is going to cover installing Django with the following:</p>
<ul>
    <li>Apache 2</li>
    <li>MySQL</li>
    <li>mod_python</li>
    <li>Python (2.4)</li>
</ul>
<p>For the record, I'm running all of this off of OpenSuSE 10.1 - so obligatory <acronym title="Your Mileage May Vary">YMMV</acronym>. Please comment with suggestions or problems if so, though.</p>
<p>First off, make sure you've got Apache up and running. <tt>ps aux | grep httpd</tt> can tell ya for the most part. If you don't know how to do this much, though, I'm afraid you're reading the wrong tutorial. </p>
<h3>Step 1: Install mod_python</h3>
<p>This will vary pretty widely amongst distributions, but our goal was
to have a package manager do it. One of the below will probably work
for you:</p>
<ul>
    <li>SuSE: In YaST, search for mod_python in Software Management</li>
    <li>Ubuntu/Debian/apt-based: <tt>apt-get install libapache2-mod-python2.4</tt>
    </li>
    <li>Redhat/FC4: <tt>yum install mod_python</tt>
    </li>
</ul>
<h3>Step 2: Install Django</h3>
<p>So with mod_python installed, now we can get to Django. We have been
tracking along with Subversion up until now, but since we're getting
ready to put a large (for us) site into production, we are planning on
sticking with numbered releases, but it remains to be seen if we'll
change our minds on that one in order to take advantage of the
enhancements that continue to stream in. If you want to live closer to
the edge, you can get the <a href="http://www.djangoproject.com/documentation/install/#installing-the-development-version">development trunk through subversion.</a></p>
<div># Most recent version at this point in time is 0.95<br />
wget http://www.djangoproject.com/download/0.95/tarball/<br />
tar -xzvf Django-0.95.tar.gz<br />
cd Django-0.95<br />
python setup.py install</div>
<p>Note that the last command will automatically download and install 'setuptools' if you don't already have it installed.</p>
<h3>Step 3: Create a Project</h3>
<p>So assuming everything went well, (It did, didn't it?), we're ready
to start our first django project. Start your first project by going
into the directory you want to hold your django projects (preferably <em>outside</em> of your web document root), and typing:</p>
<div>django-admin.py startproject myProject</div>
<p>As the <a href="http://www.djangoproject.com/documentation/tutorial1/">djangoproject.com tutorial</a> says&#8230; </p>
<blockquote>
<p>
django-admin.py should be on your system path if you installed Django
via python setup.py. If it's not on your path, you can find it in <tt><em>site-packages</em>/django/bin</tt>,
where site-packages is a directory within your Python installation.
Consider symlinking to django-admin.py from some place on your path,
such as <tt>/usr/local/bin</tt>.
</p>
</blockquote>
<p>This will start you off with the basic settings and files needed for
your django project. But we're not done quite yet! We have to tell
apache what to do to handle mod_python requests.</p>
<h3>Step 4: Configure Apache</h3>
<p>To get apache to handle python requests, we first need to activate
mod_python. Again, this is one of those things that will vary pretty
widely through distributions, but essentially you'll need this command
in Apache's httpd.conf file:</p>
<div>LoadModule python_module modules/mod_python.so</div>
<p>(note: Purportedly on debian this is done for you automatically - so you will likely be able to skip this step)<br />
In OpenSuSE the best way to do this is to go into YaST-&gt; Sysconfig
Editor-&gt; Network-&gt; WWW-&gt; Apache2, and append 'python' onto the
<tt>APACHE_MODULES</tt>
setting. There may be other ways to do this more painlessly than file
editing in other distro's, as well. Let me know if there are and I will
update this section.</p>
<p>Now that apache knows about python, we have to tell it where to
-use- python. So go into your httpd.conf file (if you're using virtual
hosts, pick the appropriate virtual host config file) and add this
location directive:</p>
<div>
<div>&lt;location "/myProject"&gt;<br />
&nbsp; &nbsp; &nbsp;SetHandler python-program<br />
&nbsp; &nbsp; &nbsp;PythonHandler django.core.handlers.modpython<br />
&nbsp; &nbsp; &nbsp;SetEnv DJANGO_SETTINGS_MODULE myProject.settings<br />
&nbsp; &nbsp; &nbsp;PythonPath "['/path/to/your/django/projects'] + sys.path"<br />
&nbsp; &nbsp; &nbsp;PythonDebug On<br />
&nbsp; &nbsp; &nbsp;PythonInterpreter myProject<br />
&nbsp;&lt;/location&gt;</div>
</div>
<p>Now save, restart apache, and browse to your server + /myProject (i.e., http://www.yourhost.com/myProject).</p>
<p>Did it come up with a special looking 404 error? If so, you've got
Django installed, man! Better go follow the more informative and better
written <a href="http://www.djangoproject.com/documentation/tutorial1/">Django Tutorial</a> to see how to really get rolling with it - you're ready to start developing!</p>
<img src ="http://www.blogjava.net/sealyu/aggbug/239122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-06 22:13 <a href="http://www.blogjava.net/sealyu/archive/2008/11/06/239122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache + mod_python + Django Step by Step</title><link>http://www.blogjava.net/sealyu/archive/2008/11/06/239110.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 06 Nov 2008 12:57:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/06/239110.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/239110.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/06/239110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/239110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/239110.html</trackback:ping><description><![CDATA[鉴于网上关于 Python 框架 Django 的 Apache + mod_python + Django 环境详细安装加实例文档还是比较难找到，所以石头在这边写一个文档与初学 Django 的同志们以共勉：）<br />
<p><strong> 1、下载需要模块。</strong><br />
<br />
a、apache (httpd-2.0.54.tar.gz or later)<br />
b、mod_python (mod_python-3.3.1.tgz)<br />
c、Django (Django-0.96.tar.gz)<br />
<br />
默认已安装 Python (<a href="http://www.python.org/">http://www.python.org</a>)<br />
<br />
<strong>2、安装配置环境。</strong><br />
<br />
首先，正常安装 apache 和 mod_python (<a href="http://www.modpython.org/">http://www.modpython.org/</a>),注意要打开 apache 的 DSO 功能，执行：<br />
<br />
#...<br />
#tar -zxvf httpd-2.0.54.tar.gz<br />
#cd httpd-2.0.54<br />
#./configure --prefix=/usr/local/apache2 --enable-so --enable-mods-shared=all<br />
#make install clean<br />
#...<br />
#tar -zxvf mod_python-3.3.1.tgz<br />
#cd mod_python-3.3.1<br />
#./configure --with-apxs=/usr/local/apache2/bin/apxs --with-python=/usr/local/bin/python<br />
#make install clean<br />
#...<br />
#tar -zxvf Django-0.96.tar.gz<br />
#cd Django-0.96<br />
#python setup.py install (<em>If
you installed Django using setup.py install, uninstalling is as simple
as deleting the django directory from your Python site-packages.</em>)<br />
#...<br />
<br />
这
样我们就安装好 Apache + mod_python + Django 了，你可以执行 apachectl start
测试一下能不能成功。然后我们开始配置环境，首先配置 httpd.conf 加入 LoadModule python_module
modules/mod_python.so (在安装 mod_python 的时候安装程序会自动把 mod_python.so 拷贝到
apache 的 modules 目录下)，接着配置虚拟主机。<br />
<br />
到这里你就可以利用 mod_python
来进行编程了，然后我们来配置一下 Django 并通过一个实例来让大家对这个现今最 HOT 的 python web
框架有一个大体的了解：首先，我们来学习一下用 django-admin.py 工具来简化你的工作 (当我们安装 Django
的时候，安装程序会自动把 django-admin.py 拷贝到 系统 PATH 下，所以我们可以直接使用它)。首先进入到我们的 python
程序目录 (我用的是：{DOCUMENT_ROOT}/python),执行：<br />
<br />
#django-admin.py startproject newtest<br />
<br />
这样就可以生成我们的测试工程了默认情况下会生成 {DOCUMENT_ROOT}/python/newtest 目录，该目录下会有如下文件：<br />
<br />
<strong>__init__.py</strong> (<em>表示这是一个 Python 的包</em>)<br />
<strong> manage.py</strong> (<em>提供简单化的 django-admin.py 命令，特别是可以自动进行 DJANGO_SETTINGS_MODULES 和 PYTHONPATH 的处理，而没有这个命令，处理上面环境变量是件麻烦的事情</em>)<br />
<strong> settings.py</strong> (<em>它是django的配置文件</em>)<br />
<strong> uls.py</strong> (<em>url映射处理文件， Karrigell 没有这种机制，它通过目录/文件/方法来自动对应，而 Django 的url映射是url对于某个模块方法的映射，目前不能自动完成</em>)<br />
<br />
然后我们在 apache 的虚拟主机配置文件里面加上：<br />
<br />
&lt;Location "/newtest/"&gt;<br />
SetHandler python-program<br />
PythonPath "sys.path+['{DOCUMENT_ROOT}/python']"<br />
PythonHandler django.core.handlers.modpython<br />
SetEnv DJANGO_SETTINGS_MODULE newtest.settings<br />
#PythonInterpreter mysite<br />
PythonDebug On<br />
&lt;/Location&gt;<br />
<br />
这
里要注意的是对于 PythonPath，必须设置成工程目录 ({DOCUMENT_ROOT}/python/newtest)
的上一级目录！这样我们就完成了 Django 和 apache 的整合了，赶快试一下吧，我们写一个 action 来测试一下 Django
的功能：</p>
<p><strong>3、编写测试程序。</strong><br />
<br />
<strong>1&gt;</strong> 首先，创建 ./list.py :<br />
<br />
#coding=utf-8<br />
from django.shortcuts import render_to_response<br />
<br />
address = [<br />
{'name':'张三', 'address':'地址一'},<br />
{'name':'李四', 'address':'地址二'}<br />
]<br />
<br />
def index(request):<br />
return render_to_response('list.html', {'address': address})<br />
<br />
<strong>2&gt;</strong> 然后，创建一个模版文件 ./templates/list.html :<br />
<br />
&lt;h2&gt;通讯录&lt;/h2&gt;<br />
&lt;table border="1"&gt;<br />
&lt;tr&gt;&lt;th&gt;姓名&lt;/th&gt;&lt;th&gt;地址&lt;/th&gt;&lt;/tr&gt;<br />
{% for user in address %}<br />
&lt;tr&gt;<br />
&lt;td&gt;{{ user.name }}&lt;/td&gt;<br />
&lt;td&gt;{{ user.address }}&lt;/td&gt;<br />
&lt;/tr&gt;<br />
{% endfor %}<br />
&lt;/table&gt;<br />
<br />
<strong>3&gt;</strong> 设置模版目录 (编辑 ./settings.py) :<br />
<br />
TEMPLATE_DIRS = (<br />
# Put strings here, like "/home/html/django_templates".<br />
# Always use forward slashes, even on Windows.<br />
'./templates',<br />
)<br />
<br />
<strong>4&gt;</strong> 修改 urls.py :<br />
<br />
from django.conf.urls.defaults import *<br />
<br />
urlpatterns = patterns('',<br />
# Example:<br />
# (r'^newtest/', include('newtest.foo.urls')),<br />
(r'^newtest/list/$', 'newtest.list.index'),<br />
<br />
# Uncomment this for admin:<br />
# (r'^admin/', include('django.contrib.admin.urls')),<br />
)<br />
<br />
5&gt; 重启 Apache 并访问相应 url (http://localhost/newtest/list/) 即可看到结果页面了：<br />
<br />
通讯录<br />
姓名    地址<br />
张三     地址一<br />
李四     地址二<br />
</p>
<p>到这里，你已经掌握了 Django 框架的基本内容了，就可以进一步学习 Django 的其他内容了，<strong>Enjoy It ：）</strong></p>
<img src ="http://www.blogjava.net/sealyu/aggbug/239110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-06 20:57 <a href="http://www.blogjava.net/sealyu/archive/2008/11/06/239110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Redhat AS5 + Apache2 + Django 1.0 配置 (转)</title><link>http://www.blogjava.net/sealyu/archive/2008/11/06/239046.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 06 Nov 2008 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/06/239046.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/239046.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/06/239046.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/239046.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/239046.html</trackback:ping><description><![CDATA[<div>1. 安装 apach2 服务器。</div>
<div>这个很简单，从官网上下载源代码，httpd-2.2.9.tar.gz，解压缩后 configure , make ,make install. 会安装在/usr/local/目录下。<br />
使用命令/usr/local/apache2/bin/apachectl start&nbsp;&nbsp;&nbsp;&nbsp;  开启apache服务。<br />
使用命令/usr/local/apache2/bin/apachectl stop&nbsp;&nbsp;&nbsp;&nbsp;  停止apache服务。<br />
使用命令/usr/local/apache2/bin/apachectl restart  重新启动apache服务。</div>
<p>2. 安装python 2.5<br />
从官网上下载2.5版本，Python-2.5.2.tgz，解压缩后./configure, make , make install.就可以完成安装。默认安装目录为/usr/local/lib/python2.5/<br />
3. 安装mod_python.<br />
./configure &#8211;with-apxs=/usr/local/apache2/bin/apxs
&#8211;with-python=/usr/bin/python2.5，再make， make install
即可。安装完毕后会在目录/usr/local/apache2/modules下有文件mod_python.so，这个在后面要使用到。<br />
4. 安装django 1.0<br />
从<a href="http://www.djangoproject.com/download/" target="_top">官网</a>下
载1.0版本Django-1.0.tar.gz,解压缩，使用命令python setup.py install
安装，注意，如果机器里有以前的版本，一定要把以前的版本文件完全卸载活删除，django
不会覆盖以前的文件。默认安装目录为/usr/local/lib/python2.5/site-packages/django/<br />
5.安装sqlite<br />
这里使用到的数据库为sqlite3，所以要安装相应的包，这里 从官网下载pysqlite-2.3.5.tar.gz,安装很容易。<br />
6.配置文件.<br />
这里使用了最简单的配置方法，直接修改/usr/local/apache2/conf/httpd.conf<br />
(1) ,默认端口，80，可以不修改。<br />
(2) 在有LoadModule example字样的下面添加一下一行<br />
LoadModule python_module modules/mod_python.so<br />
(3) 配置ServerName，在有 #ServerName www.example.com:80字样的下面添加一下行：<br />
ServerName yourIP:80<br />
(4) 这是最重要的一步了。在有字样# This should be changed to whatever you set
DocumentRoot to.的后面，修改&lt;Directory&gt; &#8230; &lt;/Directory&gt;中间的内容为：<br />
<code><br />
&lt;Directory &#8220;/home/af/af&#8220;&gt;<br />
#<br />
# Possible values for the Options directive are &#8220;None&#8221;, &#8220;All&#8221;,<br />
# or any combination of:<br />
#&nbsp;&nbsp;  Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews<br />
#<br />
# Note that &#8220;MultiViews&#8221; must be named *explicitly* — &#8220;Options All&#8221;<br />
# doesn&#8217;t give it to you.<br />
#<br />
# The Options directive is both complicated and important.  Please see<br />
# http://httpd.apache.org/docs/2.2/mod/core.html#options<br />
# for more information.<br />
#<br />
#Options Indexes FollowSymLinks<br />
#PythonHandler django.core.handlers.modpython<br />
<span> PythonPath &#8220;['/home/af/af','/usr/local/lib/python2.5/site-packages'] + sys.path&#8221;<br />
PythonHandler django.core.handlers.modpython<br />
SetEnv DJANGO_SETTINGS_MODULE aftest.settings<br />
SetHandler python-program<br />
PythonDebug On</span><br />
#<br />
# AllowOverride controls what directives may be placed in .htaccess files.<br />
# It can be &#8220;All&#8221;, &#8220;None&#8221;, or any combination of the keywords:<br />
#&nbsp;&nbsp;  Options FileInfo AuthConfig Limit<br />
#<br />
#AllowOverride None</code></p>
<p>#<br />
# Controls who can get stuff from this server.<br />
#<br />
#Order allow,deny<br />
Allow from all</p>
<p>&lt;/Directory&gt;</p>
<p>其中蓝色部分为要修改和添加的部分，/home/af/af是Django 工程所在的目录，aftest为项目名称。<br />
(5)添加media。这里以安装Django自己提供的admin为例。<br />
在上一步的&lt;/Directory&gt;下面再添加<br />
<span>Alias /media /usr/local/lib/python2.5/site-packages/django/contrib/admin/media<br />
&lt;Location &#8220;/media&#8221;&gt;<br />
Options None<br />
SetHandler None<br />
Allow from all<br />
&lt;/Location&gt;</span><br />
即可。</p>
<p>配置完毕。</p>
<img src ="http://www.blogjava.net/sealyu/aggbug/239046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-06 15:59 <a href="http://www.blogjava.net/sealyu/archive/2008/11/06/239046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Using PIL with Django</title><link>http://www.blogjava.net/sealyu/archive/2008/11/06/238957.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 06 Nov 2008 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/11/06/238957.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/238957.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/11/06/238957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/238957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/238957.html</trackback:ping><description><![CDATA[<p>Here&#8217;s a simple django view which creates a PIL image on the fly,
and returns it as a PNG image:
</p>
<pre>from django.utils.httpwrappers import HttpResponse<br />
from PIL import Image<br />
<br />
import random<br />
INK = "red", "blue", "green", "yellow"<br />
<br />
def image(request):<br />
<br />
# ... create/load image here ...<br />
image = Image.new("RGB", (800, 600), random.choice(INK))<br />
<br />
# serialize to HTTP response<br />
response = HttpResponse(mimetype="image/png")<br />
image.save(response, "PNG")<br />
return response</pre>
<div>&nbsp;</div>
<p>To draw things on the fly, you can use either PIL&#8217;s ImageDraw module,
or the <a href="http://effbot.org/zone/aggdraw-index.htm">aggdraw</a> module:
</p>
<pre wide="">from django.utils.httpwrappers import HttpResponse<br />
from PIL import Image<br />
from aggdraw import Draw, Pen, Brush, Font<br />
<br />
import random<br />
<br />
def graphics(request):<br />
<br />
image = Image.new("RGB", (800, 600), "white")<br />
draw = Draw(image)<br />
<br />
# ... draw graphics here ...<br />
for i in range(20):<br />
x0 = random.randint(0, image.size[0])<br />
y0 = random.randint(0, image.size[1])<br />
x1 = random.randint(0, image.size[0])<br />
y1 = random.randint(0, image.size[1])<br />
draw.rectangle((x0, y0, x1, y1), Pen(random.choice(INK), 5))<br />
<br />
draw.flush()<br />
<br />
response = HttpResponse(mimetype="image/png")<br />
image.save(response, "PNG")<br />
return response</pre>
<img src ="http://www.blogjava.net/sealyu/aggbug/238957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-11-06 09:32 <a href="http://www.blogjava.net/sealyu/archive/2008/11/06/238957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django 的继承机制</title><link>http://www.blogjava.net/sealyu/archive/2008/10/28/237235.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Tue, 28 Oct 2008 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/10/28/237235.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/237235.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/10/28/237235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/237235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/237235.html</trackback:ping><description><![CDATA[今天看到一篇关于介绍Django继承机制的帖子，虽然简单，但是还是记下来，以免忘记：<br />
django 的继承有两种方式：<br />
第一种：将父类声明为abstract,这样每个具体的子类均有一个对应的表，父类是抽象类，不会为之建表<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;django.db&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;models<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Create&nbsp;your&nbsp;models&nbsp;here.</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Person(models.Model):&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;models.CharField(max_length</span><span style="color: #000000;">=</span><span style="color: #000000;">10</span><span style="color: #000000;">)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;models.SmallIntegerField()&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Meta:<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abstract</span><span style="color: #000000;">=</span><span style="color: #000000;">True<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Man(Person):&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;models.CharField(max_length</span><span style="color: #000000;">=</span><span style="color: #000000;">20</span><span style="color: #000000;">)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Woman(Person):&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;makeup&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;models.CharField(max_length</span><span style="color: #000000;">=</span><span style="color: #000000;">20</span><span style="color: #000000;">)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
通过在Meta类中声明abstract=True，标识Person为抽象基类，这个类没有objects属性，也就是说没有Manager方法，无法进行单独的数据操作，所有的数据操作都要通过子类进行<br />
生成的sql语句如下<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">BEGIN</span><span style="color: #000000;">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">CREATE</span>&nbsp;<span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;`sample_woman`&nbsp;(<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`id`&nbsp;</span><span style="color: #0000ff;">integer</span><span style="color: #000000;">&nbsp;AUTO_INCREMENT&nbsp;</span><span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span>&nbsp;<span style="color: #0000ff;">PRIMARY</span>&nbsp;<span style="color: #0000ff;">KEY</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`name`&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">10</span><span style="color: #000000;">)&nbsp;</span><span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`height`&nbsp;</span><span style="color: #0000ff;">smallint</span>&nbsp;<span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`makeup`&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">20</span><span style="color: #000000;">)&nbsp;</span><span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">CREATE</span>&nbsp;<span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;`sample_man`&nbsp;(<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`id`&nbsp;</span><span style="color: #0000ff;">integer</span><span style="color: #000000;">&nbsp;AUTO_INCREMENT&nbsp;</span><span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span>&nbsp;<span style="color: #0000ff;">PRIMARY</span>&nbsp;<span style="color: #0000ff;">KEY</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`name`&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">10</span><span style="color: #000000;">)&nbsp;</span><span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`height`&nbsp;</span><span style="color: #0000ff;">smallint</span>&nbsp;<span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`job`&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">20</span><span style="color: #000000;">)&nbsp;</span><span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">COMMIT</span><span style="color: #000000;">;</span></div>
<br />
第二种：<br />
基类一个表，每个子类的扩展属性另一个表，写法上没有什么特别要求<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;django.db&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;models<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Create&nbsp;your&nbsp;models&nbsp;here.</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Person(models.Model):&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;models.CharField(max_length</span><span style="color: #000000;">=</span><span style="color: #000000;">10</span><span style="color: #000000;">)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;models.SmallIntegerField()&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Man(Person):&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;models.CharField(max_length</span><span style="color: #000000;">=</span><span style="color: #000000;">20</span><span style="color: #000000;">)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Woman(Person):&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;makeup&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;models.CharField(max_length</span><span style="color: #000000;">=</span><span style="color: #000000;">20</span><span style="color: #000000;">)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
生成的sql如下<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff;">BEGIN</span><span style="color: #000000;">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">CREATE</span>&nbsp;<span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;`sample_person`&nbsp;(<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`id`&nbsp;</span><span style="color: #0000ff;">integer</span><span style="color: #000000;">&nbsp;AUTO_INCREMENT&nbsp;</span><span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span>&nbsp;<span style="color: #0000ff;">PRIMARY</span>&nbsp;<span style="color: #0000ff;">KEY</span><span style="color: #000000;">,<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`name`&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">10</span><span style="color: #000000;">)&nbsp;</span><span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`height`&nbsp;</span><span style="color: #0000ff;">smallint</span>&nbsp;<span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />)<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">CREATE</span>&nbsp;<span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;`sample_woman`&nbsp;(<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`person_ptr_id`&nbsp;</span><span style="color: #0000ff;">integer</span>&nbsp;<span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span>&nbsp;<span style="color: #0000ff;">UNIQUE</span>&nbsp;<span style="color: #0000ff;">PRIMARY</span>&nbsp;<span style="color: #0000ff;">KEY</span><span style="color: #000000;">,<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`makeup`&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">20</span><span style="color: #000000;">)&nbsp;</span><span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />)<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">ALTER</span>&nbsp;<span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;`sample_woman`&nbsp;</span><span style="color: #0000ff;">ADD</span>&nbsp;<span style="color: #0000ff;">CONSTRAINT</span><span style="color: #000000;">&nbsp;person_ptr_id_refs_id_4baa7c33&nbsp;</span><span style="color: #0000ff;">FOREIGN</span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff;">KEY</span><span style="color: #000000;">&nbsp;(`person_ptr_id`)&nbsp;</span><span style="color: #0000ff;">REFERENCES</span><span style="color: #000000;">&nbsp;`sample_person`&nbsp;(`id`);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">CREATE</span>&nbsp;<span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;`sample_man`&nbsp;(<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`person_ptr_id`&nbsp;</span><span style="color: #0000ff;">integer</span>&nbsp;<span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span>&nbsp;<span style="color: #0000ff;">UNIQUE</span>&nbsp;<span style="color: #0000ff;">PRIMARY</span>&nbsp;<span style="color: #0000ff;">KEY</span><span style="color: #000000;">,<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;`job`&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">20</span><span style="color: #000000;">)&nbsp;</span><span style="color: #808080;">NOT</span>&nbsp;<span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />)<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">ALTER</span>&nbsp;<span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;`sample_man`&nbsp;</span><span style="color: #0000ff;">ADD</span>&nbsp;<span style="color: #0000ff;">CONSTRAINT</span><span style="color: #000000;">&nbsp;person_ptr_id_refs_id_78ed52db&nbsp;</span><span style="color: #0000ff;">FOREIGN</span><span style="color: #000000;">&nbsp;K<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />EY&nbsp;(`person_ptr_id`)&nbsp;</span><span style="color: #0000ff;">REFERENCES</span><span style="color: #000000;">&nbsp;`sample_person`&nbsp;(`id`);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">CREATE</span>&nbsp;<span style="color: #0000ff;">UNIQUE</span>&nbsp;<span style="color: #0000ff;">INDEX</span><span style="color: #000000;">&nbsp;`sample_woman_person_ptr_id`&nbsp;</span><span style="color: #0000ff;">ON</span><span style="color: #000000;">&nbsp;`sample_woman`&nbsp;(`person_ptr_<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />id`);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">CREATE</span>&nbsp;<span style="color: #0000ff;">UNIQUE</span>&nbsp;<span style="color: #0000ff;">INDEX</span><span style="color: #000000;">&nbsp;`sample_man_person_ptr_id`&nbsp;</span><span style="color: #0000ff;">ON</span><span style="color: #000000;">&nbsp;`sample_man`&nbsp;(`person_ptr_id`)<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">COMMIT</span><span style="color: #000000;">;</span></div>
<p>Person类可以进行数据查询操作，所以有必要识别返回的类是什么的问题，这里isinstance没用，django的处理是为Person添加子类的属性，以方便你通过这些属性访问具体的子类，在这里<br />
results=Person.objects.all()<br />
r=results[0]<br />
这个r就有woman和man两个属性，下面的结论摘自我在邮件列表中的答复，备忘用<br />
</p>
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">这时，person_obj有&nbsp;man和person两个属性&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />如果访问一个不是属于该类型的就会出现DoesNotExist&nbsp;异常&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />实际中，不用通过捕获异常去判断，直接用&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />hasattr(person_obj,'man')&nbsp;或&nbsp;hasattr(person_obj,'woman')&nbsp;就可以判断，返回True的就是&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />目标类型&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />(InteractiveConsole)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&gt;&gt;&gt;&nbsp;from&nbsp;sample.models&nbsp;import&nbsp;*&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&gt;&gt;&gt;&nbsp;results=Person.objects.all()&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&gt;&gt;&gt;&nbsp;r=results[0]&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&gt;&gt;&gt;&nbsp;hasattr(r,'woman')&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />False&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&gt;&gt;&gt;&nbsp;hasattr(r,'man')&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />True&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&gt;&gt;&gt;&nbsp;r.man.job&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />u'computer'&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&gt;&gt;&gt;&nbsp;r.woman&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last):&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;File&nbsp;"</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">console</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">",&nbsp;line&nbsp;1,&nbsp;in&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">module</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;File&nbsp;"C:"Python25"Lib"site-packages"django"db"models"fields&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"related.py",&nbsp;line&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />178,&nbsp;in&nbsp;__get__&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;rel_obj&nbsp;=&nbsp;self.related.model._default_manager.get(**params)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;File&nbsp;"C:"Python25"Lib"site-packages"django"db"models"manager.py",&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />line&nbsp;82,&nbsp;in&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />get&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self.get_query_set().get(*args,&nbsp;**kwargs)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;File&nbsp;"C:"Python25"Lib"site-packages"django"db"models"query.py",&nbsp;line&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />197,&nbsp;in&nbsp;g&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />et&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;self.model._meta.object_name)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />DoesNotExist:&nbsp;Woman&nbsp;matching&nbsp;query&nbsp;does&nbsp;not&nbsp;exist.&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
</span><br />
<br />
<img src ="http://www.blogjava.net/sealyu/aggbug/237235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-10-28 22:42 <a href="http://www.blogjava.net/sealyu/archive/2008/10/28/237235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django 上传图片（整理）</title><link>http://www.blogjava.net/sealyu/archive/2008/09/24/230997.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 24 Sep 2008 15:11:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/09/24/230997.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/230997.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/09/24/230997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/230997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/230997.html</trackback:ping><description><![CDATA[找到两篇相关帖子，mark一下：<br />
一。<br />
<div style="font-size: 10pt;">首先在model上要有一个ImageFiled字段，</div>
<div style="font-size: 10pt;">同时&nbsp;模板上对应放一个&lt;input type="file" name = "file"&gt;，</div>
<div style="font-size: 10pt;">以下就是视图的代码了，</div>
<div style="font-size: 10pt;">import Image<br />
import StringIO<br />
from datetime import datetime</div>
<div style="font-size: 10pt;">def add_topic(request):</div>
<div style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_obj = request.FILES.get('file', None)&nbsp;&nbsp;&nbsp;</div>
<div style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if file_obj:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = file_obj['content']<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f = StringIO.StringIO(data)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image = Image.open(f)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image = image.convert('RGB')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abs_name = '%s_%s_%s' %(str(request.user),"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str(datetime.today()).replace(':', '-')[:-7],"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_obj['filename'])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image.save(file(abs_name, 'wb'))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return HttpResponseRedirect("/forum/forum/") </div>
<br />
二。<br />
<h3 title="原创"><a href="http://bluecrystal.javaeye.com/blog/233030">谈谈django中图片上传的2种处理方式</a></h3>
<strong>关键字: django 上传图片 pil</strong>
<p>&nbsp;&nbsp;&nbsp; 首先申明该文使用的<a href="http://www.djangoproject.com/" title="django framework" target="_blank">django</a>
版本为<a href="http://subversion.tigris.org/" title="subversion" target="_blank">svn</a>
版本，我每天都在更新<img src="http://bluecrystal.javaeye.com/images/smiles/icon_lol.gif" alt="" />
，<a href="http://www.python.org/" target="_blank">python</a>
是2.5，<a href="http://www.pythonware.com/products/pil/" target="_blank">pil</a>
也是最新的版本。</p>
<p>&nbsp;&nbsp;&nbsp; 通常情况下用django上传图片我们会定义一个django.forms.Form的子类，比如：</p>
<div>
<div>
<div>Python代码 <a href="http://bluecrystal.javaeye.com/blog/233030#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" title="复制代码"><img src="http://bluecrystal.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol start="1">
    <li>#&nbsp;coding:&nbsp;utf-8&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>import&nbsp;django.forms&nbsp;as&nbsp;forms&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>class&nbsp;PictureForm(forms.Form):&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;图片&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;imagefile&nbsp;=&nbsp;forms.ImageField()&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;......&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="python"># coding: utf-8
import django.forms as forms
class PictureForm(forms.Form):
# ......
# 图片
imagefile = forms.ImageField()
# ......</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 然后我们在服务端会定义一个函数来处理图片上传，我们先来看看一般的做法：</p>
<div>
<div>
<div>Python代码 <a href="http://bluecrystal.javaeye.com/blog/233030#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" title="复制代码"><img src="http://bluecrystal.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol start="1">
    <li>#&nbsp;coding:&nbsp;utf-8&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>from&nbsp;django.http&nbsp;import&nbsp;HttpResponse&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>def&nbsp;addPicture(request):&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;request.method&nbsp;==&nbsp;'POST':&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;form&nbsp;=&nbsp;PictureForm(request.POST,&nbsp;request.FILES)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;form.is_valid():&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&nbsp;request.FILES["imagefile"]&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;des_origin_path&nbsp;为你在服务器上保存原始图片的文件物理路径&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;des_origin_f&nbsp;=&nbsp;open(des_origin_path,&nbsp;"ab")&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;chunk&nbsp;in&nbsp;f.chunks():&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;des_origin_f.write(chunk)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;des_origin_f.close()&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;图片文件被保存在硬盘上后，你可以用pil的Image.open打开进行处理，比如改变大小，加水印等等&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="python"># coding: utf-8
from django.http import HttpResponse
def addPicture(request):
if request.method == 'POST':
form = PictureForm(request.POST, request.FILES)
if form.is_valid():
f = request.FILES["imagefile"]
# des_origin_path 为你在服务器上保存原始图片的文件物理路径
des_origin_f = open(des_origin_path, "ab")
for chunk in f.chunks():
des_origin_f.write(chunk)
des_origin_f.close()
# 图片文件被保存在硬盘上后，你可以用pil的Image.open打开进行处理，比如改变大小，加水印等等</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在上面这种传统的做法中，是把图片文件保存到硬盘上后，再由pil图形库从硬盘上加载，再进行图片处理，明显多了很多的硬盘IO操作，如果你是一个图片处理量很大的应用，显然不想看到这样的局面。那我们来看看另外一个做法：</p>
<div>
<div>
<div>Python代码 <a href="http://bluecrystal.javaeye.com/blog/233030#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" title="复制代码"><img src="http://bluecrystal.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol start="1">
    <li>#&nbsp;coding:&nbsp;utf-8&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>from&nbsp;django.http&nbsp;import&nbsp;HttpResponse&nbsp;&nbsp;</li>
    <li>import&nbsp;ImageFile&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>def&nbsp;addPicture(request):&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;request.method&nbsp;==&nbsp;'POST':&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;form&nbsp;=&nbsp;PictureForm(request.POST,&nbsp;request.FILES)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;form.is_valid():&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&nbsp;request.FILES["imagefile"]&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parser&nbsp;=&nbsp;ImageFile.Parser()&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;chunk&nbsp;in&nbsp;f.chunks():&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parser.feed(chunk)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;=&nbsp;parser.close()&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;在img被保存之前，可以进行图片的各种操作，在各种操作完成后，在进行一次写操作&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img.save("yoursavepath")&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="python"># coding: utf-8
from django.http import HttpResponse
import ImageFile
def addPicture(request):
if request.method == 'POST':
form = PictureForm(request.POST, request.FILES)
if form.is_valid():
f = request.FILES["imagefile"]
parser = ImageFile.Parser()
for chunk in f.chunks():
parser.feed(chunk)
img = parser.close()
# 在img被保存之前，可以进行图片的各种操作，在各种操作完成后，在进行一次写操作
img.save("yoursavepath")
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;
在上面的做法中，我们利用pil的ImageFile直接从django接收的数据流中构建出图形对象，进行处理后，在保存，减少了硬盘的读操作。现在网
上有些例子使用StringIO对象来作为pil
Image.open的输入，经过我多次尝试，在ubuntu以及winxp、centos上都要报异常，我想可能跟pil的版本有关，或许以前的低版本
pil的确可以处理。<img src="http://bluecrystal.javaeye.com/images/smiles/icon_biggrin.gif" alt="" />
</p>
<br />
<br />
<img src ="http://www.blogjava.net/sealyu/aggbug/230997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-09-24 23:11 <a href="http://www.blogjava.net/sealyu/archive/2008/09/24/230997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django File Upload</title><link>http://www.blogjava.net/sealyu/archive/2008/09/22/230519.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Mon, 22 Sep 2008 15:08:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/09/22/230519.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/230519.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/09/22/230519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/230519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/230519.html</trackback:ping><description><![CDATA[<p>Some interesting examples on how to handle file uploads using <a href="http://www.djangoproject.com/">Django</a>:</p>
<ul>
    <li>Code snippet posted on <a href="http://www.djangosnippets.org/snippets/95/">Djangosnippets</a>. The file is saved by declaring a <code>save()</code> method in the form class.  This method is invoked when calling <code>form.save()</code>, which is standard Django newforms practice. (Note that this snipped uses <code>clean_data</code>.  As of Django version 0.96, <code>clean_data</code> <a href="http://code.djangoproject.com/changeset/5237">has been renamed</a> to <code>cleaned_data</code>, so you will have to change the code or it won&#8217;t work)</li>
    <li><a href="http://www.oluyede.org/blog/2007/03/18/django-image-uploading-validation-and-newforms/">Django image upload and validation</a>. The author uses a model for the file and its related data.  The uploaded file is saved by calling the <code>save_FOO_file</code> method. (This method is automatically provided by Django for fields declared as <code>models.ImageField</code> or <code>models.FileField</code> in the model. See the <a href="http://www.djangoproject.com/documentation/db-api/#save-foo-file">db-api documentation</a>.)</li>
    <li><a href="http://batiste.dosimple.ch/blog/2007-05-13-1/">Django image upload, form_for_instance and monkey-patching</a>.  The example code creates a form class from <code>request.user</code> by calling <code>form_for_instance</code>.
    The resulting class in then monkey-patched to insert the avatar image
    validation code. (Although the code is interesting the monkey patch
    seems unnecessary. I wouldn&#8217;t mind inserting the avatar validation
    method in a <code>UserProfileForm</code> class derived from <code>form.Forms</code>.  The code would be certainly clearer:  I think KISS takes precedence over DRY in this case.)</li>
</ul>
<p>Interesting, there seems to be no easy way of limiting the uploaded
file size. The file can be rejected at validation time, but the data
would have already been transfered.</p>
<h2>A file upload recipe</h2>
<p>After reading those posts, I think that a good recipe for handling file uploads in Django would be:</p>
<ul>
    <li>Write a django model for the uploaded file and its related data.
    Using a Django model makes sense, because it is usually necessary for
    the application to keep track of the uploaded files.</li>
    <li>Write a subclass of <code>form.Forms</code> and declare a <code>clean_FOO</code> method for each <code>models.FileInput</code> or <code>models.ImageInput</code> fields declared in the model class.  These clean_FOO methods are used to validate the uploaded files.</li>
    <li>use a django view to receive the POST data, or display the form if no data is posted or errors are found.</li>
    <li>validate the uploaded file or files by triggering the standard django newforms validation mechanism:  <code>is_valid()</code>.</li>
    <li>save the file or files getting the data directly from the <code>request.FILES</code> object, by writing a <code>save()</code> method for the subclassed form or by calling <code>save_FOO_file</code> for the model instance.</li>
</ul>
<h2>A simpler way to upload a file</h2>
<p>The following short <a href="http://www.djangoproject.com/">Django</a>
example uses no data models, does no data validation, and saves the
file directly to disk using python standard file functions. It is just
a simple test I wrote to get familiar with the <code>request.FILES</code> object. This is not production code:  it could be used to execute an arbitrary script on the server.<br />
The directory where the file is to be saved must be writable by the
user that is running the Django server script. (The example uses
MEDIA_ROOT as defined in <code>settings.py</code>.)</p>
<h3>file: views.py</h3>
<div>
<div>
<div><a href="http://www.zoia.org/blog/2007/07/29/django-file-upload/#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://www.zoia.org/blog/2007/07/29/django-file-upload/#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://www.zoia.org/blog/2007/07/29/django-file-upload/#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div>
</div>
<ol start="1">
    <li>from&nbsp;django&nbsp;import&nbsp;http&nbsp;&nbsp;</li>
    <li>from&nbsp;django&nbsp;import&nbsp;newforms&nbsp;as&nbsp;forms&nbsp;&nbsp;</li>
    <li>from&nbsp;django.shortcuts&nbsp;import&nbsp;render_to_response&nbsp;&nbsp;</li>
    <li>from&nbsp;djangotest.settings&nbsp;import&nbsp;MEDIA_ROOT&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>class&nbsp;SimpleFileForm(forms.Form):&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;forms.Field(widget=forms.FileInput,&nbsp;required=False)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>def&nbsp;directupload(request):&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;"""&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Saves&nbsp;the&nbsp;file&nbsp;directly&nbsp;from&nbsp;the&nbsp;request&nbsp;object.&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Disclaimer:&nbsp;&nbsp;This&nbsp;is&nbsp;code&nbsp;is&nbsp;just&nbsp;an&nbsp;example,&nbsp;and&nbsp;should&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;be&nbsp;used&nbsp;on&nbsp;a&nbsp;real&nbsp;website.&nbsp;&nbsp;It&nbsp;does&nbsp;not&nbsp;validate&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;uploaded:&nbsp;&nbsp;it&nbsp;could&nbsp;be&nbsp;used&nbsp;to&nbsp;execute&nbsp;an&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;arbitrary&nbsp;script&nbsp;on&nbsp;the&nbsp;server.&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;"""&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;=&nbsp;'fileupload.html'&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;request['method']&nbsp;==&nbsp;'POST':&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;'file'&nbsp;in&nbsp;request.FILES:&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;request.FILES['file']&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Other&nbsp;data&nbsp;on&nbsp;the&nbsp;request.FILES&nbsp;dictionary:&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;filesize&nbsp;=&nbsp;len(file['content'])&lt;br&nbsp;/&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;filetype&nbsp;=&nbsp;file['content-type']&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filename&nbsp;=&nbsp;file['filename']&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;=&nbsp;open('%s/%s'&nbsp;%&nbsp;(MEDIA_ROOT,&nbsp;filename),&nbsp;'wb')&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd.write(file['content'])&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd.close()&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;http.HttpResponseRedirect('&nbsp;upload_success.html')&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;else:&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;display&nbsp;the&nbsp;form&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;form&nbsp;=&nbsp;SimpleFileForm()&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;render_to_response(template,&nbsp;{&nbsp;'form':&nbsp;form&nbsp;})&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
</ol>
</div>
<textarea style="display: none;" name="code" class="python" cols="60" rows="10">from django import http
from django import newforms as forms
from django.shortcuts import render_to_response
from djangotest.settings import MEDIA_ROOT
&nbsp;
&nbsp;
class SimpleFileForm(forms.Form):
file = forms.Field(widget=forms.FileInput, required=False)
&nbsp;
&nbsp;
def directupload(request):
"""
Saves the file directly from the request object.
Disclaimer:  This is code is just an example, and should
not be used on a real website.  It does not validate
file uploaded:  it could be used to execute an
arbitrary script on the server.
"""
&nbsp;
template = 'fileupload.html'
&nbsp;
if request['method'] == 'POST':
if 'file' in request.FILES:
file = request.FILES['file']
&nbsp;
# Other data on the request.FILES dictionary:
#   filesize = len(file['content'])&lt;br /&gt;
#   filetype = file['content-type']
&nbsp;
filename = file['filename']
&nbsp;
fd = open('%s/%s' % (MEDIA_ROOT, filename), 'wb')
fd.write(file['content'])
fd.close()
&nbsp;
return http.HttpResponseRedirect(' upload_success.html')
else:
# display the form
form = SimpleFileForm()
return render_to_response(template, { 'form': form })
&nbsp;
</textarea>
<h3>file:  fileupload.html</h3>
<div>
<div>
<div><a href="http://www.zoia.org/blog/2007/07/29/django-file-upload/#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://www.zoia.org/blog/2007/07/29/django-file-upload/#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://www.zoia.org/blog/2007/07/29/django-file-upload/#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div>
</div>
<ol start="1">
    <li>{%&nbsp;extends&nbsp;"base.html"&nbsp;%}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;</li>
    <li>{%&nbsp;block&nbsp;body&nbsp;&nbsp;%}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h1&gt;Upload&nbsp;a&nbsp;file&lt;/h1&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form&nbsp;action="."&nbsp;method="post"&nbsp;enctype="multipart/form-data"&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{&nbsp;form&nbsp;}}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="submit"&nbsp;value="Upload"&nbsp;/&gt;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;&nbsp;&nbsp;</li>
    <li>{%&nbsp;endblock&nbsp;%}&nbsp; <br />
    </li>
</ol>
</div>
<img src ="http://www.blogjava.net/sealyu/aggbug/230519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-09-22 23:08 <a href="http://www.blogjava.net/sealyu/archive/2008/09/22/230519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django 学习笔记</title><link>http://www.blogjava.net/sealyu/archive/2008/09/18/229803.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 18 Sep 2008 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/09/18/229803.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/229803.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/09/18/229803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/229803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/229803.html</trackback:ping><description><![CDATA[今天开始，把学习django过程中碰到的需要注意的地方记在这里，mark一下<br />
<br />
1.使用mysql作为数据库的时候，在setting.py中设置端口号3306时，注意不要加引号 DATABASE_PORT = 3306.<br />
2.如果要写一个通用的404page放在template的根目录下时，如果在setting.py中DEBUG = True时，django默认还是会使用自带的404错误处理页面，只有将值设置为false时，自己写的404页面才会生效。<br />
待续。。。。<br />
<br />
<img src ="http://www.blogjava.net/sealyu/aggbug/229803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-09-18 21:48 <a href="http://www.blogjava.net/sealyu/archive/2008/09/18/229803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装配置Django开发环境（Eclipse + Pydev）（转）</title><link>http://www.blogjava.net/sealyu/archive/2008/09/13/228773.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Sat, 13 Sep 2008 11:24:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/09/13/228773.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/228773.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/09/13/228773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/228773.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/228773.html</trackback:ping><description><![CDATA[<span style="font-size: 10.5pt;"><font face="宋体"> 所谓工欲善其事，必先利其器。Python开发有很多工具，其中Eclipse+Pydev就是其中一种。尽管</font> </span><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#121;&#116;&#104;&#111;&#110;&#64;&#110;&#101;&#119;&#115;&#109;&#116;&#104;"><span style="font-size: 10.5pt; text-decoration: underline;">python@newsmth </span></a><span style="font-size: 10.5pt;"><font face="宋体">的置底文章对这对组合评价不高，但在pipi的坚持和推荐下，我还是选择了这对组合。反正都没有用过，我正好尝尝鲜。非常感谢Pipi，本文得到了Pipi同学的大力支持。</font> </span>
<p style="text-align: justify;"><span style="font-size: 10.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="宋体">下面将开发环境的安装配置过程写下来，供后来者参考。</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">一、安装Eclipse SDK。</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">到</font> </span><a href="http://download.eclipse.org/eclipse/downloads/"><span style="font-size: 10.5pt; text-decoration: underline;">http://download.eclipse.org/eclipse/downloads/ </span></a><span style="font-size: 10.5pt;"><font face="宋体">找SDK最新的Release版本，最新的版本是</font> </span><a href="http://download.eclipse.org/eclipse/downloads/drops/R-3.3.2-200802211800/index.php"><span style="font-size: 10.5pt; text-decoration: underline;">3.3.2 </span></a></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">下载。一开始我选择的是台湾的[Taiwan] </font></span><a href="http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.3.2-200802211800/eclipse-SDK-3.3.2-win32.zip&amp;url=http://eclipse.cdpa.nsysu.edu.tw/downloads/drops/R-3.3.2-200802211800/eclipse-SDK-3.3.2-win32.zip&amp;mirror_id=371"><span style="font-size: 10.5pt; text-decoration: underline;">National Center for High-Performance Computing (http) </span></a><span style="font-size: 10.5pt;"><font face="宋体">，速度只有5kB/s，还是小日本的快，118kB/S,，</font> </span><a href="http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.3.2-200802211800/eclipse-SDK-3.3.2-win32.zip&amp;url=http://ftp.jaist.ac.jp/pub/eclipse/eclipse/downloads/drops/R-3.3.2-200802211800/eclipse-SDK-3.3.2-win32.zip&amp;mirror_id=105"><span style="font-size: 10.5pt; text-decoration: underline;">Japan Advanced Institute of Science and Technology (http) </span></a><span style="font-size: 10.5pt;"><font face="宋体">，做事情应该也这样，一个明显很缓慢，就要当即力断换其他的。</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">下载完毕之后，将eclipse SDK解压到某个目录下，我的放在e:"eclipse就可以了。</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">如果要使用中文的，最好是使用跟SDK配套的语言包，否则也不能完全汉化（最后我选择了纯英文的，没汉化）。根据网上的资料，汉化前不要启动Eclipse，否则不能完全汉化。将语言包也解压到同一目录下即可。</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">二、安装Pydev</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">到</font> </span><a href="http://sourceforge.net/projects/pydev/"><span style="font-size: 10.5pt; text-decoration: underline;">http://sourceforge.net/projects/pydev/ </span></a><span style="font-size: 10.5pt;"><font face="宋体">这里找最新版本下载，最新版本是1.3.15</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">下
载后解压，将plugins目录下所有文件挪到Eclipse的相应目录下，将feature目录下所有文件挪到Eclipse的相应目录下，最后启动
Eclipse，在Help－》Software Upates－》Manage
Configuration，然后弹出的界面即可看到pydev的插件。</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">另一种安装插件的方法是：Help－》Software Upates－》Find and Install－》Search for new features to install-》New remote site－》随便起个name如pydev，url填</font> </span><a href="http://pydev.sf.net/updates/"><span style="font-size: 10.5pt; text-decoration: underline;">http://pydev.sf.net/updates/ </span></a><span style="font-size: 10.5pt;"><font face="宋体">－》然后照着提示下载安装即可。</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">两种方法我都尝试了一下，为保险起见，我选择的是第二种方法。</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">三</font> </span><span style="font-size: 10.5pt;"><font face="宋体">、Pydev的配置</font> <br />
</span><span style="font-size: 10.5pt;"><font face="宋体"><span style="font-size: 10.5pt;"><font face="宋体">在Eclipse IDE</font> </span><span style="font-size: 10.5pt;"><font face="宋体">下，</font> </span><span style="font-size: 10.5pt;"><font face="宋体">打开</font> </span><span style="font-weight: bold; font-size: 10.5pt;">Window-&gt;Preferences...</span> <span style="font-size: 10.5pt;"><font face="宋体">对话框，从右侧的树形列表中选择&#8220;</font> </span><span style="font-weight: bold; font-size: 10.5pt;">PyDev&#8221;-&gt;&#8220;Interpreter Python&#8221;<font face="宋体">，</font> </span><span style="font-size: 10.5pt;"><font face="宋体">点击New按钮，从Python的安装路径下选择Python.exe，然后会弹出一个对话框让你勾选System PYTHONPATH，我是都选了，应该无所谓。最后点Ok，退出。</font></span></font></span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体"><br />
四、进行Django项目开发</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;">1<font face="宋体">、建立PyDev Project</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;">Eclipse IDE<font face="宋体">－》File－》New－》Other－》Pydev－》选择Pydev Project－》起一个项目的名称（例如demo）－》选择路径，如E:"work－》选择适合你的Python版本（我的是2.5）－》将下面的勾去掉，不要建立src文件－》Finish</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;">2<font face="宋体">、建立Django Project</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">（1）django-admin.py startproject demo。</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><font face="宋体">（2）
把生成的Django项目目录拷贝到Eclipse刚刚建立的项目下的目录里。回到刚才的Elicpse IDE－》在PyDev
Package视图中右键单击新建的项目，从弹出的菜单中选择&#8220;Refresh&#8221;，即可看到Django的项目工程。添加、删除文件和目录的操作都可以通
过右键菜单来完成。</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;">(3)<font face="宋体">右键单击PyDev项目－》属性－》选择PyDev－》PYTHONPATH－》然后将src目录</font> </span><span style="font-size: 10pt;">(<font face="宋体">项目文件路径）</font> </span><span style="font-size: 10.5pt;"><font face="宋体">添加到项目代码中去－》确定</font> </span></p>
<p style="text-align: justify;"><span style="font-size: 10.5pt;"><br />
</span><span style="font-size: 10.5pt;"><font face="宋体">（4）对Pydev项目进行配置：
选择Pydev的项目名称－》Run菜单－》Open Run Dialog－》Python
Run－》右键New－》在Main面板中写入项目名称，通过Browse载入项目名称和Main Module，Main
Module选择manage.py－》在Augement面板中,argument必须是</font> </span><span style="font-size: 10pt;">runserver --noreload<font face="宋体">，下面的working </font></span><span style="font-size: 10.5pt;">directory<font face="宋体">加入你的base directory。</font> </span><span style="font-size: 10.5pt;"><br />
</span></p>
<p><span style="font-size: 10.5pt;"><font face="宋体">打完收工，接下来开始写Django应用吧。</font> <br />
<br />
最后补一个用SourceInsight看Python工程的方法：<br />
1、到<a href="http://www.sourceinsight.com/public/">http://www.sourceinsight.com/public/languages/</a>下载Python.CLF文件，这是python的语言支持包。<br />
2、打开SourceInsight-&gt;Options &gt; Preferences －&gt; Languages －&gt; Import －&gt; Select (.CLF)<br />
3、再做的：－&gt; Document Types - &gt; Add Type (Give it a name :
填Python－&gt;.给出类型名：我填的是*.py ) 在下面的下拉框里面选择之前导入的文件，然后确定。Source Insight
就可以识别该类型的文件了。<br />
</span></p>
<img src ="http://www.blogjava.net/sealyu/aggbug/228773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-09-13 19:24 <a href="http://www.blogjava.net/sealyu/archive/2008/09/13/228773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Using Eclipse and PyDev for django</title><link>http://www.blogjava.net/sealyu/archive/2008/09/13/228772.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Sat, 13 Sep 2008 11:23:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/archive/2008/09/13/228772.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/228772.html</wfw:comment><comments>http://www.blogjava.net/sealyu/archive/2008/09/13/228772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/228772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/228772.html</trackback:ping><description><![CDATA[<p>This guide assumes you&#8217;ve already installed Eclipse, PyDev, Python
and Django. It also assumes you&#8217;re using Eclipse 3.2, PyDev 1.2.4,
Django 0.95 and Python 2.4.</p>
<ul>
    <li>Go to
    Window-&gt;Preferences-&gt;Preferences-&gt;PyDev-&gt;Python
    Interpretter and add the django source file to the PYTHONPATH settings.</li>
    <li>Create a new PyDev pyhon project. Make sure you uncheck the &#8216;create src folder&#8217; option.</li>
    <li>Create project on the command line using django e.g. <code>django-admin.py startproject mysite</code></li>
    <li>In your newly created project directory create a <code>src</code> directory in it, and move the django generated source files here</li>
    <li>In eclipse, right-click your project and select refresh</li>
    <li>Right-click on the project and select <code>Properties-&gt;PyDev &#8211; PYTHONPATH</code>, and add your src folder to the project source settings</li>
</ul>
<p>That
should be it. I still get red underlines on the Django source imports
even thought PyDev seems to know about them &#8211; to test this is working
properly, open up your <code>urls.py</code> file and <code>ctrl</code> click on the <code>patterns</code> call &#8211; it should take you to <code>defaults.py</code>. </p>
<p>Now you can go ahead and create your database &amp; super user.</p>
<h3>Launching to built-in server</h3>
<p>Open up <code>manage.py</code> and hit <code>F9</code>. This should print out the usage information for the server. To actually start the server, select <code>Run-&gt;Run&#8230;</code>, and in the <code>Arguments</code> tab for <code>manage.py</code> enter <code>runserver—noreload</code>. The <code>noreload</code> argument gives you output.</p>
<p>Thanks go to PyDev creator Fabio Zadrozny for his <a href="http://pydev.blogspot.com/2006/09/configuring-pydev-to-work-with-django.html">guide</a> which got me going.  </p>
<img src ="http://www.blogjava.net/sealyu/aggbug/228772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-09-13 19:23 <a href="http://www.blogjava.net/sealyu/archive/2008/09/13/228772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>