Django on Jython
使用Django已经一段时间了,非常喜欢这样的状态,很少的配置文件和代码,就可以样一个原型跑起来。1.0已经发布一段时间了,有了很多的改变,改 进,很吸引眼球。但是还有一个特性非常吸引我,Django可以运行在Jython上了,这就意味着,可以在Tomcat,Glassfish等服务器上 跑Django了,EXCITING?
OK, Let's give a shot!
1. of course, 先要现在Django,不过我还是推荐使用svn中的代码。
2. 接着就要下载Jython了,当前的stable版本是2.2.1,而我们需要的是2.5,该版本还是alpha阶段,所以,还是从svn中获取。
完成了Jython的检出,开始编译工作。需要指出的是,我们在这里使用ant来构建Jython,当然,也可以选择maven,看个人习惯了,ant和maven的具体安装方法大家可以去google,这里不再累述。
ant
稍等片刻,就可以完成编译工作了,生成的文件在jython-dev下的dist文件夹下。然后,我将dist下的文件全部拷贝到D:/jython下,我在这里使用的是windows,大家可以根据自己的平台进行设置。
为了能在console里使用Jython,我们还需要将jython目录下的bin文件夹添加到path。这里大家也可以去google,不再多说。现在打开一个console,输入jython,是不是能看到非常熟悉的,python控制台呢?
3. 好的,现在就需要安装Django了。
jython setup.py build
jython setup.py install
安装完成后,就可以在jython/Lib/site-packages下看到Django了。为了查看是否安装成功,使用下面的方法。打开控制台:
Jython 2.5a3+ (trunk, ???? 16 2008, 18:50:22)
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_10-beta
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.get_version()
u'1.0-post-release-SVN-SVN-unknown'
如果看到了最后的输出就表示安装成功了。
4. 当前Django on Jython只支持postgresql,所以,我们这里还需要下载一个Lib,Django-Jython.
cd django-jython
jython setup.py build
jython setup.py install
这样就完成了django-jython的安装。
5. 最后就是安装postgresql数据库了,大家可以根据官方的文档进行安装。
万事俱备,让我们开始真正的Django on Jython之旅吧。
这里还需要说明一点,在完成Django的安装之后,在jython/bin下会有一个django-admin.py,这个是Django命令的工具,为了同CPython下的Django进行区别,我在这里将其重命名为django-admin-jy.py。
好,切换到工作目录。
是不是有djangonjython这个目录出现呢?对了,这就是我们创建的工程。
如果你是一个急性子,那么就让我们尝试一下,看看是不是能够运行呢?
jython manage.py runserver
熟悉的页面是否出现呢?
在观察一下djangonjython目录里的文件,哈,没有了.pyc,改成了.class,确实是jython在工作了。
如果只是运行这么一个东西,肯定就没有什么价值了。OK,let's build an application。我们在这里创建一个简单的blog(老生常谈了:))。
这样就完成了app的创建,当然在djangonjython下应该多了一个blog文件夹,里面还包含了一些文件。
首先修改models.py,内容如下:
2 from django.contrib.auth.models import User
3
4 class Entry(models.Model):
5 STATUS_CHOICES = (
6 (0, 'live'),
7 (1, 'draft'),
8 (2, 'cancel'),
9 )
10 author = models.ForeignKey(User)
11 title = models.CharField(max_length=255)
12 slug = models.SlugField()
13 content = models.TextField()
14 create_at = models.DateTimeField(auto_now_add=True)
15 status = models.IntegerField(default=0, choices=STATUS_CHOICES)
16
17 def __unicode__(self):
18 return self.title
19
20 def get_absolute_url(self):
21 return '/blog/%s' % (self.slug)
22
23 class Meta:
24 ordering = ['-create_at']
这只是一个非常简单的原型,说明问题就行了。好,既然使用了Django 1.0那么就要有一些改变,现在的Django使用了newform-admin,那么就在blog目录下创建admin.py文件,内容如下:
2
3 from djangonjython.blog.models import Entry
4
5 class EntryAdmin(admin.ModelAdmin):
6 list_display = ('title', 'author', 'create_at', 'status',)
7 ordering = ['-create_at']
8 list_filter = ('author', 'status',)
9 prepopulated_fields = {'slug': ('title',),}
10
11 admin.site.register(Entry, EntryAdmin)
这样就将Entry注册到了admin site里,就可以在admin page里进行管理了。
再进一步之前,先启动先前安装的postgresql,创建database blog。完成之后,就要对项目进行一些配置了。
首先是djangonjython目录下的urls.py
取消这几行的注释:
admin.autodiscover()
(r'^admin/(.*)', admin.site.root),
为的是能够访问到admin page.
接着是settings.py,
DATABASE_NAME = 'blog' # Or path to database file if using sqlite3.
DATABASE_USER = 'yourname' # Not used with sqlite3.
DATABASE_PASSWORD = 'yourpassword' # Not used with sqlite3.
DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3.
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'djangonjython.blog',
'doj',
)
对上面的代买进行一些说明:
doj.backends.zxjdbc.postgresql是之前安装的django-jython提供的数据支持,当然,要使用这个,必须将doj
这个库添加到PYTHONPATH中,所以在下面的INSTALLED_APPS里,加入了doj,而djangonjyton.blog就是之前创建的
app。
好,完成了这些,就可以开始数据库的创建了。熟悉的命令:
按照上面的提示,一步一步的进行填写。完成之后,启动服务,是不是又是一个熟悉的画面?
填写之前要求的管理员用户名和密码,就进入到了admin page,我习惯称后台管理页面。
好了,在这里就可以添加一些entry了。完成了后台的管理,让我们添加一些前台的显示吧。
在这里,我打算使用django自带的generic views,使用起来非常的简单。为了同项目的urls.py区别开,在blog下创建一个新的urls.py,内容如下:
2
3 from djangonjython.blog.models import Entry
4
5 entry_dict = {
6 'queryset': Entry.objects.all(),
7 'template_object_name': 'entry',
8 }
9
10 urlpatterns = patterns('django.views.generic.list_detail',
11 (r'^blog/$', 'object_list', entry_dict),
12 (r'^blog/(?P<slug>.*)/$', 'object_detail', entry_dict),
13 )
14
然后就要修改项目目录下的urls.py了,在(r'^admin/(.*)', admin.site.root)之前添加:
接着就要添加模板文件了,在blog目录下创建templates/blog这样的目录,然后再里面添加entry_list.html和entry_detail.html两个文件,内容分别如下:
entry_list.html
2 {% for entry in entry_list %}
3 <a href="/blog/{{ entry.slug }}"><h3>{{ entry.title }}</h3></a> Post at: {{ entry.create_at|date:"Y-b-d" }}<hr/>
4 {% endfor %}
5 {% endif %}
entry_detail.html
2 <span style="color: green;">{{ entry.title }}</span><br/><br/>
3 post by: <b>{{ entry.author.username }}</b><br/><br/>
4 <div style="color: blue">{{ entry.content|safe }}</div>
5 {% endif %}
完成了这些之后,就要告诉django,怎么处理了,也就是要修改settings.py了:
PROJECT_ROOT = os.path.abspath(__file__)
TEMPLATE_DIRS = (
os.path.join(PROJECT_ROOT, 'blog/templates'),
)
添加前面两句,修改后面的TEMPLATE_DIRS,告诉django到哪里去找模板文件。
重新启动服务器,输入http://localhost:8000/blog/,就可以看到一个简单的blog列表了,如果有的话。点击相应的标题,就会进入到具体的entry了。
到这里位置,一个简单的blog就算是创建好了。我们的目的主要是要看他在其他的服务器上是否能够运行,好的,这里就要进行打包处理了。
django-jython提供了一个war命令,会将我们的工程打包成war包,方便部署。不过django-jython有一个小小的bug。找到
jython/Lib/site-packages/doj/manamgement/commands/war.py,在该文件的第228行,原来是:
现在我们要将其改为:
因为在windows下得到的是'\\'而不是'/',所以执行的时候会出错,可能开发者没有在windows下进行测试,所以出现了这样的情况。
接着,我们需要链接postgresql的jdbc包,大家可以在这里下载postgres-jdbc。下载后,将其放在项目目录下,开始打包:
过一段时间,就可以在项目的上一级目录看到djangonjython.war
到这里,java程序员就可以使用熟悉的java web server进行部署了!部署完成后,输入http://localhost:8080/djangonjython/blog/就可以进行访问了。
这里给出一些在tomcat上运行的截图:
怎么样,感觉还是不错吧。
其实,Django on Jython还有很长的路要走,要支持更多的主流数据库,以及运行效率等问题。不过还是非常期待,希望能够快速的发展,毕竟Django的开发效率要远远高于Java。So let's look forward to it!

浙公网安备 33010602011771号