|
|
|
|
|
|
|
[Original]
[Print]
[Top]
|
最近在做一个用Django框架来代替传统CGI的工作。
在Django框架中views里需要调用shell 命令,我用commands中的API实现。
在mange.py runserver 环境下实验没有问题。
但是,我把代码移植到apache上时,就出现问题了。
访问sqlite3数据库时,出现 write a readonly database。我想这是由于 apache是以nobody.nobody的权限运行py的。所以,我将数据库的权限改为了777.但是,继续报错,说unable to open database file。出错的debug代码都显示是python2.4/site-packages/Django-0.95.2-py2.4.egg/django/db/backends/sqlite3/base.py in execute, line 77出的错误。
我注释掉写数据库的动作。
之后,不报错了。但是返回执行shell 命令错误。原因是不允许。
我尝试着采用os.setuid(0)来提升权限,但是出现系统错误。
我把代码贴出来,希望大家帮助。
views.py
Create your views here.
from django.template import loader, Context
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from ethconfig.ethcfg.models import ethinfo
def index(request):
return render_to_response('show.html',{})
def edit(request,devicename):
if request.POST['dev']:
dev = request.POST['dev']
ip = request.POST['ip']
mask=request.POST['mask']
device = ethinfo.objects.filter(devicename=dev)
if device:
c= device[0].set_ipaddr(ip,mask)
return render_to_response('show.html', {'name':device[0].devicename,'ipaddr':device[0].ipaddr,'netmask':device[0].netmask,'errormark':c[0],'error':c[1]})
models.py:
import commands
import os
# Create your models here.
class ethinfo(models.Model):
devicename=models.CharField(maxlength=100)
ipaddr=models.CharField(maxlength=30)
netmask=models.CharField(maxlength=30)
def set_ipaddr(self,ip,mask):
#os.setuid(0)
self.ipaddr=ip
self.netmask=mask
self.save()
command = 'ifconfig '+self.devicename+' '+ip+' '+'netmask'+' '+mask
return commands.getstatusoutput(command)
httpd.conf:
<Location "/ethconfig">
SetHandler python-program
PythonHandler django.core.handlers.modpython
PythonPath "['/MVC','/usr/lib/python2.4/site-packages/Django-0.95.2-py2.4.egg/django/']+sys.path"
SetEnv DJANGO_SETTINGS_MODULE ethconfig.settings_apache
PythonAutoReload Off
PythonDebug On
</Location>
可以进入index页面,输入要配置的信息,提交,就会出现错误。
请大家帮我分析。谢谢
|
|
|
----
为他人所未为,为他人所不敢为。
|
|
[Original]
[Print]
[Top]
|
|
|