2006年03月08日 星期三 15:55
开始主要是写给自己看的,凌乱之处还请原谅。 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 hostSetHandler 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/mediaSetHandler None SetHandler None 其中比较特殊是这一段 PythonPath "['E:/bom', 'E:/bom/bomweb'] 为了不改变开发环境的代码,需要在PythonPath同时加上app路径和project路径,也许有更合理的办法而我不知道。
2006年03月08日 星期三 16:06
> 其中比较特殊是这一段 > 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
2006年03月09日 星期四 09:50
谢谢分享,顶。 在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
2006年03月09日 星期四 16:01
好文 --
Zeuux © 2025
京ICP备05028076号