杂家杂谈  
日历
统计
  • 随笔 - 7
  • 文章 - 1
  • 评论 - 15
  • 引用 - 0

导航

留言簿(2)

随笔分类

随笔档案

Python

搜索

  •  

积分与排名

  • 积分 - 25546
  • 排名 - 1499

最新评论

阅读排行榜

 
   使用Django已经一段时间了,非常喜欢这样的状态,很少的配置文件和代码,就可以样一个原型跑起来。1.0已经发布一段时间了,有了很多的改变,改进,很吸引眼球。但是还有一个特性非常吸引我,Django可以运行在Jython上了,这就意味着,可以在Tomcat,Glassfish等服务器上跑Django了,EXCITING?

   OK, Let's give a shot!

   1. of course, 先要现在Django
不过我还是推荐使用svn中的代码
svn co http://code.djangoproject.com/svn/django/trunk/ django-dev
   2. 接着就要下载Jython了,当前的stable版本是2.2.1,而我们需要的是2.5,该版本还是alpha阶段,所以,还是从svn中获取。
svn co https://jython.svn.sourceforge.net/svnroot/jython/trunk/jython/ jython-dev
   完成了Jython的检出,开始编译工作。需要指出的是,我们在这里使用ant来构建Jython,当然,也可以选择maven,看个人习惯了,ant和maven的具体安装方法大家可以去google,这里不再累述。
cd jython-dev
ant
   稍等片刻,就可以完成编译工作了,生成的文件在jython-dev下的dist文件夹下。然后,我将dist下的文件全部拷贝到D:/jython下,我在这里使用的是windows,大家可以根据自己的平台进行设置。
   为了能在console里使用Jython,我们还需要将jython目录下的bin文件夹添加到path。这里大家也可以去google,不再多说。现在打开一个console,输入jython,是不是能看到非常熟悉的,python控制台呢?
   3. 好的,现在就需要安装Django了。
cd django-dev
jython setup.py build
jython setup.py install
   安装完成后,就可以在jython/Lib/site-packages下看到Django了。为了查看是否安装成功,使用下面的方法。打开控制台:
D:\>jython
Jython 
2.5a3+ (trunk, ???? 16 200818: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.
svn co http://django-jython.googlecode.com/svn/trunk/ 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。
   好,切换到工作目录。
django-admin-jy.py startproject djangonjython
   是不是有djangonjython这个目录出现呢?对了,这就是我们创建的工程。
   如果你是一个急性子,那么就让我们尝试一下,看看是不是能够运行呢?
cd djangonjython
jython manage.py runserver
   熟悉的页面是否出现呢?
runserver.PNG
   在观察一下djangonjython目录里的文件,哈,没有了.pyc,改成了.class,确实是jython在工作了。
   如果只是运行这么一个东西,肯定就没有什么价值了。OK,let's build an application。我们在这里创建一个简单的blog(老生常谈了:))。
jython manage.py startapp blog
   这样就完成了app的创建,当然在djangonjython下应该多了一个blog文件夹,里面还包含了一些文件。
   首先修改models.py,内容如下:
 1 from django.db import models
 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文件,内容如下:
 1 from django.contrib import admin
 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
   取消这几行的注释:
from django.contrib import admin
admin.autodiscover()

(r
'^admin/(.*)', admin.site.root),
   为的是能够访问到admin page.
   接着是settings.py,
DATABASE_ENGINE = 'doj.backends.zxjdbc.postgresql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
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。
   好,完成了这些,就可以开始数据库的创建了。熟悉的命令:
jython manage.py syncdb
   按照上面的提示,一步一步的进行填写。完成之后,启动服务,是不是又是一个熟悉的画面?
   填写之前要求的管理员用户名和密码,就进入到了admin page,我习惯称后台管理页面。
   好了,在这里就可以添加一些entry了。完成了后台的管理,让我们添加一些前台的显示吧。

   在这里,我打算使用django自带的generic views,使用起来非常的简单。为了同项目的urls.py区别开,在blog下创建一个新的urls.py,内容如下:
 1 from django.conf.urls.defaults import *
 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)之前添加:
(r'', include('djangonjython.blog.urls')),
   接着就要添加模板文件了,在blog目录下创建templates/blog这样的目录,然后再里面添加entry_list.html和entry_detail.html两个文件,内容分别如下:
entry_list.html
1 {% if entry_list %}
2     {% for entry in entry_list %}
3         <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
1 {% if entry %}
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了:
import os
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行,原来是:
if dest_relative_path[-1== '/':
   现在我们要将其改为:
if dest_relative_path[-1== os.path.sep:
   因为在windows下得到的是'\\'而不是'/',所以执行的时候会出错,可能开发者没有在windows下进行测试,所以出现了这样的情况。
   接着,我们需要链接postgresql的jdbc包,大家可以在这里下载postgres-jdbc。下载后,将其放在项目目录下,开始打包:
jython manage.py war --include-java-libs=./postgresql-8.3-603.jdbc4.jar
   过一段时间,就可以在项目的上一级目录看到djangonjython.war
   到这里,java程序员就可以使用熟悉的java web server进行部署了!部署完成后,输入http://localhost:8080/djangonjython/blog/就可以进行访问了。
   这里给出一些在tomcat上运行的截图:
admin_page.PNG
backend.PNG
   怎么样,感觉还是不错吧。
   其实,Django on Jython还有很长的路要走,要支持更多的主流数据库,以及运行效率等问题。不过还是非常期待,希望能够快速的发展,毕竟Django的开发效率要远远高于Java。So let's look forward to it!




posted on 2008-09-17 00:41 glorywine 阅读(3696) 评论(0)  编辑  收藏 所属分类: PythonDjango

只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © glorywine Powered by: 博客园 模板提供:沪江博客