Python论坛  - 讨论区

标题:[python-chinese] 使用django点滴

2006年03月08日 星期三 15:55

FCG Chen YeHao YeHao.Chen at alcatel-sbell.com.cn
Wed Mar 8 15:55:49 HKT 2006

开始主要是写给自己看的,凌乱之处还请原谅。

1.	使用原有的数据库	1
2.	用户认证与权限管理	2
2.1.	创建用户	2
2.2.	创建自定义permission	2
2.3.	在代码中使用权限	3
3.	基础数据的输入和修改	3
4.	以表格形式显示各种查询结果	3
5.	以web接口提供客户端软件的数据请求	3
5.1.	接收用户请求	3
5.2.	返回数据	4
6.	在apache上发布	4
6.1.	安装apache和mod_python	4
6.2.	我的配置	4



把最近看django代码的体会记录下来,不记录自己也会忘

django是用python开发的一套web framework工具,提供了完整的各方面功能,我最近花时间把django的文档读了一遍,联系平时的开发记录一些心得。

与遗留的系统整合
原则:
数据维护和查询全部放在web,客户端保留最少访问数据库代码,这部分代码用web接口改写。

考虑以下方面:
* 使用原有的数据库
* 用户认证与权限管理
* 基础数据的输入和修改
* 以表格形式显示各种查询结果
* 以web接口提供客户端软件的数据请求
* 在apache发布

现在已经基本完成了上面提到的功能,发现windows平台仍然不能作为production environment。
P-M 1.3G + Winxp sp2 + python 2.4.2 + apache 2.xx + mod_python 3.xx + django 0.91 + postgresql 8.0.7 无法响应并发的两个请求,两个客户端同时收到 error 500
安装到 P3 500 + Fedora Linux + python 2.4.1 + apache 2.xx + mod_python 3.xx + django 0.91 + postgresql 8.0.7 完全没有同样的问题,三个客户端等待30秒后都先后得到正确的结果。
再仔细测试,发现无关数据库,用linux上的django连windows上的postgresql没有问题。那么可能出现问题的是 apache, mod_python, python, django,没有精力做更多测试,供参考。

1. 使用原有的数据库
参考文档 Integrating with a legacy database http://www.djangoproject.com/documentation/legacy_databases/
注意以下技巧
* 预先设置环境,编辑运行以下.bat文件
set PYTHONPATH=E:\bom
set DJANGO_SETTINGS_MODULE=bomweb.settings
* 运行django-admin.py inspectdb [databasename] > appname.py生成数据定义文件
注意,我们并不会去修改原来的表结构,我们是修改定义文件使之适应已经有的表结构
一个典型的例子
class Part(meta.Model):
    part_code = meta.CharField(maxlength=40, primary_key=True)
    part_desc = meta.CharField(maxlength=80)
    family = meta.CharField(maxlength=20)
    buyer = meta.CharField(maxlength=20)
    controller = meta.CharField(maxlength=20)
    unit_price = meta.FloatField(max_digits=16, decimal_places=2) # This is a guess!
    flag = meta.IntegerField()
    class META:
        db_table = 'parts'
        admin = meta.Admin(list_display = ('part_code', 'part_desc', 'family', 'buyer', 'controller', 'flag'),
            search_fields = ('part_code',))
        verbose_name = "part"
        verbose_name_plural = "parts"
        ordering = ['part_code']

数据库中原有的双精度浮点型会被翻译成TextField,需要根据需要手工修改成FloatField(max_digits=16, decimal_places=2);
需要显示指定primary_key=True字段避免django自动生成id字段;
根据输入数据需要编辑admin的属性。
* 运行django-admin.py sqlreset [appname] > a.sql 手工编辑生成的sql脚本,删除table的相关操作,保留权限的相关操作
2. 用户认证与权限管理
参考文档 User authentication in Django http://www.djangoproject.com/documentation/authentication/
为了利用django已经提供的数据维护工具,只能服从django的用户与权限设计,当然django的设计非常完整,可以满足我的要求,但是这部分代码是要修改的

2.1. 创建用户
使用django的admin网页创建。
Password要这样取得
import md5
p = md5.new('johnpassword').hexdigest()

2.2. 创建自定义permission
未完成
2.3. 在代码中使用权限
常用方法
* from django.contrib.admin.views.decorators import staff_member_required
只有staff_member可用
* from django.views.decorators.auth import login_required
需要login才可用
* 检查特定权限
    def get_modules_and_options(self, app_label, module_name, request):
        self.mod, self.opts = _get_mod_opts(app_label, module_name)
        if not request.user.has_perm(app_label + '.' + self.opts.get_change_permission()):
            raise PermissionDenied
3. 基础数据的输入和修改
利用admin网页
4. 以表格形式显示各种查询结果
考虑利用admin的浏览页面,代码是在django\contrib\admin\views\main.py
我的做法是把整个django\contrib\admin复制到我的app目录下,修改main.py,浏览代码的核心是class ChangeList,从这个类派生自己的定制子类,利用admin网页提供的分页,排序,筛选等功能。
查询如何用ChangeList显示需要一个小技巧,就是把所有查询在数据库中创建对应的数据库视图,用反向工程(django-admin.py inspectdb)生成类定义,使系统以为有这么一个table。
5. 以web接口提供客户端软件的数据请求
5.1. 接收用户请求
参考文档: Request and response objects http://www.djangoproject.com/documentation/request_response/
例子:
def login(request):
    f = open('tmp.log', 'a')
    print 'uploading...'
    f.write('uploading...' + '\n')
    #print request.POST.items()[0]
    f.write(repr(request.FILES) + '\n')
    #for i in request.POST.items():
    #    for j in i:
    #        if j.startswith('%'):
    #            f.write(j)
    username = request.POST.get('username', None)
    
    if username:
        return render_to_response('pobom/login', {'username':username})
    else:
        return render_to_response('pobom/login')
5.2. 返回数据
未完成

6. 在apache上发布
参考文档 How to use Django with mod_python http://www.djangoproject.com/documentation/modpython/

limodou的配置请参考 http://www.woodpecker.org.cn/obp/django/django-stepbystep/newtest/doc/tut12.html#apache

6.1. 安装apache和mod_python
(略)

6.2. 我的配置
复制settings.py到settings_apache.py,修改以下相对路径为绝对路径
TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates".
    # Always use forward slashes, even on Windows.
    'E:/bom/bomweb/templates',
)

编辑http.conf
没有使用virtual host


    SetHandler python-program
    PythonPath "['E:/bom', 'E:/bom/bomweb'] + sys.path"
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE bomweb.settings_apache
    PythonAutoReload Off
    PythonDebug On


    SetHandler python-program
    PythonPath "['E:/bom', 'E:/bom/bomweb'] + sys.path"
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE bomweb.settings_apache
    PythonAutoReload Off
    PythonDebug On


    SetHandler python-program
    PythonPath "['E:/bom', 'E:/bom/bomweb'] + sys.path"
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE bomweb.settings_apache
    PythonAutoReload Off
    PythonDebug On

#Alias /site_media d:/project/svn/limodou/django-stepbystep/newtest/newtest/media
Alias /media D:/Python24/Lib/site-packages/django/contrib/admin/media

    SetHandler None


    SetHandler None


其中比较特殊是这一段
PythonPath "['E:/bom', 'E:/bom/bomweb']
为了不改变开发环境的代码,需要在PythonPath同时加上app路径和project路径,也许有更合理的办法而我不知道。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年03月08日 星期三 16:06

limodou limodou at gmail.com
Wed Mar 8 16:06:32 HKT 2006

> 其中比较特殊是这一段
> PythonPath "['E:/bom', 'E:/bom/bomweb']
> 为了不改变开发环境的代码,需要在PythonPath同时加上app路径和project路径,也许有更合理的办法而我不知道。

不错。我感觉这样挺好。因为在开发时有一个问题就是以前django建议是将project的父目录作为PYTHONPATH加入sys.path中去的,但这样,所以有子模块导入需要带上project的名字。但这样非常不利于移值。最好是两个都加上。其实我试过manage.py的作法,它就是把project目录加入到sys.path中去了。

--
I like python!
My Blog: http://www.donews.net/limodou
NewEdit Maillist: http://groups.google.com/group/NewEdit

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年03月09日 星期四 09:50

tommy xiaods xiaods at gmail.com
Thu Mar 9 09:50:52 HKT 2006

谢谢分享,顶。

在06-3-8,limodou <limodou at gmail.com> 写道:
>
> > 其中比较特殊是这一段
> > PythonPath "['E:/bom', 'E:/bom/bomweb']
> > 为了不改变开发环境的代码,需要在PythonPath同时加上app路径和project路径,也许有更合理的办法而我不知道。
>
> 不错。我感觉这样挺好。因为在开发时有一个问题就是以前django建议是将project的父目录作为PYTHONPATH加入sys.path中去的,
> 但这样,所以有子模块导入需要带上project的名字。但这样非常不利于移值。最好是两个都加上。其实我试过manage.py的作法,
> 它就是把project目录加入到sys.path中去了。
>
> --
> I like python!
> My Blog: http://www.donews.net/limodou
> NewEdit Maillist: http://groups.google.com/group/NewEdit
>
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>


--
QQ: 2667799
MSN Messenger: xds2000ATmsn.com
E-mail: xiaodsATgmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060309/fcf1f887/attachment.html

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年03月09日 星期四 16:01

邱立宏 qiulihong at gmail.com
Thu Mar 9 16:01:36 HKT 2006

好文
-- 
 


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号