【问题标题】:Problem to make an apache server run correctly under mod_python使 apache 服务器在 mod_python 下正确运行的问题
【发布时间】:2009-10-12 13:46:00
【问题描述】:

我们尝试将旧服务器迁移到新服务器,但我们遇到了 mod_python 的一些问题。

问题出在这个网页下面:

http://auction.tinyerp.org/auction-in-europe.com/aie/

这是我们的 apache2 配置:

NameVirtualHost *
<VirtualHost *>


 DocumentRoot /var/www/
 <Directory />
  Options FollowSymLinks
  AllowOverride all
 </Directory>
 <Directory "/var/www/auction-in-europe.com/aie">
  Options Indexes FollowSymLinks MultiViews
  #AddHandler mod_python .py
  PythonOption mod_python.legacy.importer *
  SetHandler mod_python
                PythonHandler mod_python.publisher
      PythonDebug On
  AllowOverride all
  Order allow,deny
  allow from all
  # This directive allows us to have apache2's default start page
                # in /apache2-default/, but still have / go to the right place
 </Directory>

 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
 <Directory "/usr/lib/cgi-bin">
  AllowOverride None
  Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
  Order allow,deny
  Allow from all
 </Directory>

 ScriptAlias /bin/ /home/www/auction-in-europe.com/aie/bin/
 ServerAdmin teamwork19@gmail.com
 ErrorLog /home/logs/auction-in-europe.com/error_log
 CustomLog /home/logs/auction-in-europe.com/access_log combined
 ServerName auction-in-europe.com
 ServerAlias www.auction-in-europe.com antique-in-europe.com www.antique-in-europe.com art-in-europe.com www.art-in-europe.com en.art-in-europe.com
 ServerAlias en.antique-in-europe.com en.auction-in-europe.com fr.antique-in-europe.com fr.art-in-europe.com fr.auction-in-europe.com auction.tinyerp.org
 #RewriteEngine on
 #RewriteRule ^/(.*)\.html /index.py [E=pg:$1]

 ErrorLog /var/log/apache2/error.log

 # Possible values include: debug, info, notice, warn, error, crit,
 # alert, emerg.
 LogLevel warn

 CustomLog /var/log/apache2/access.log combined
 ServerSignature On

 Alias /doc/ "/usr/share/doc/"
 <Directory "/usr/share/doc/">
  Options Indexes MultiViews FollowSymLinks
  AllowOverride None
  Order deny,allow
  Deny from all
  Allow from 127.0.0.0/255.0.0.0 ::1/128
 </Directory>
 <Directory /home/www/postfixadmin>
 </Directory>

</VirtualHost>

日志很空:

[Mon Oct 12 13:25:58 2009] [notice] mod_python: (Re)importing module 'mod_python.publisher'
[Mon Oct 12 13:25:58 2009] [notice] [client 212.166.58.166] Publisher loading page /home/www/auction-in-europe.com/aie/index.py

我真的不知道从哪里开始。

请帮忙!

【问题讨论】:

  • “/var/www/auction-in-europe.com/aie”中有哪些文件?它是否包含 index.py?该文件的内容是什么?

标签: python apache2 mod-python


【解决方案1】:

那是 index.py 吗?我相信您正在混淆您的安装。如果您不想编写自己的处理程序,请使用“PythonHandler mod_python.publisher”。您刚刚发布的文件包含一个处理程序,行:

def handler(req):
   return app.run(apacheapp.Request(req)) 

这很难解决,但我相信你的 apache 配置应该更接近这个:

 <Directory "/var/www/auction-in-europe.com/aie">
   Order allow,deny
   Allow from all
   SetHandler python-program .py
   PythonHandler index ## or what ever the above file is called without the .py
   PythonDebug On   
  </Directory>

这将使所有对“/var/www/auction-in-europe.com/aie”的请求都由 index.py 处理。

【讨论】:

    【解决方案2】:
    
    #!/usr/bin/python
    import os, sys
    base_dir = "/home/www/auction-in-europe.com/aie/"
    sys.path.insert(0, base_dir)
    import albatross
    import sql_db
    from albatross.apacheapp import Request
    from albatross import apacheapp
    from albatross.template import Content, EmptyTag, EnclosingTag
    import string
    import common
    class AppContext(albatross.SessionFileAppContext):
       def __init__(self, app):
           albatross.SessionFileAppContext.__init__(self, app)
    #        path = os.environ.get('PATH_INFO','').split('/')
    #        path = filter(lambda x: x, path)
    #        self.module = path.pop(0)
    #        self.path = {}
    #        while path:
    #            val = path.pop()
    #            self.path[ path.pop() ] = val
       def load_template_once(self, template):
           new_template = os.path.join(self.lang_get(),template)
           return albatross.SessionFileAppContext.load_template_once(new_template)
       def load_template(self, template):
                 new_template = os.path.join(self.lang_get(),template)
           return albatross.SessionFileAppContext.load_template(self,new_template)
       def run_template_once(self, template):
           new_template = os.path.join(self.lang_get(), template)
           return albatross.SessionFileAppContext.run_template_once(self,new_template)
       def run_template(self, template):
           new_template = os.path.join(self.lang_get(), template)
           return albatross.SessionFileAppContext.run_template(self,new_template)
       def req_get(self):
           return self.current_url()[len(self.base_url())+1:]
       def args_calc(self):
           path = self.current_url()[len(self.base_url())+1:].split('/')
           path = filter(lambda x: x, path)
           if not len(path):
               path=['index']
           self.module = path.pop(0)
           self.path = {}
           while path:
               val = path.pop()
               self.path[ path.pop() ] = val
       def lang_get(self):
           if self.request.get_header('host')[:3] in ('fr.','en.'):
               return self.request.get_header('host')[:2]
           try:
               language = self.request.get_header('Accept-Language')
               if language:
                   new_lang = language[:2]
                   if new_lang in ('fr','en'):
                       return new_lang
           except:
               return 'en'
           return 'en'
       def hostname_get(self):
           if self.request.get_header('host')[-17:]=='art-in-europe.com':
               return 'art'
           elif self.request.get_header('host')[-21:]=='antique-in-europe.com':
               return 'antique'
           else:
               return 'auction'
       def module_get(self):
           self.args_calc()
           return self.module
       def path_get(self, key):
           self.args_calc()
           return self.path[key]
    class App(albatross.ModularSessionFileApp):
       def __init__(self):
           albatross.ModularSessionFileApp.__init__(self,
               base_url = '/index.py',
               module_path = os.path.join(base_dir, 'modules'),
               template_path = os.path.join(base_dir, 'template'),
               start_page = 'index',
               secret = '(=-AiE-)',
               session_appid='A-i-E',
               session_dir='/var/tmp/albatross/')
       def create_context(self):
           return AppContext(self)
    class alx_a(albatross.EnclosingTag):
       name = 'alx-a'
       def to_html(self, ctx):
           ctx.write_content('')
           albatross.EnclosingTag.to_html(self, ctx)
           ctx.write_content('')
    # Escape text for attribute values
    def escape_br(text):
       text = str(text)
       text = string.replace(text, '&', '&')
       text = string.replace(text, '', '>',)
       text = string.replace(text, '"', '"')
       text = string.replace(text, "'", '')
       text = string.replace(text, "\n", '
    ') return text class alx_value(EmptyTag): name = 'alx-value' def __init__(self, ctx, filename, line_num, attribs): EmptyTag.__init__(self, ctx, filename, line_num, attribs) #self.compile_expr() def to_html(self, ctx): value = ctx.eval_expr(self.get_attrib('expr')) format = self.get_attrib('date') if format: value = time.strftime(format, time.localtime(value)) ctx.write_content(value) return lookup_name = self.get_attrib('lookup') if lookup_name: lookup = ctx.get_lookup(lookup_name) if not lookup: self.raise_error('undefined lookup "%s"' % lookup_name) lookup.lookup_html(ctx, value) return if self.has_attrib('noescape'): ctx.write_content(str(value)) else: ctx.write_content(escape_br(value)) app = App() app.register_tagclasses(alx_a) app.register_tagclasses(alx_value) def handler(req): return app.run(apacheapp.Request(req))

    【讨论】:

      最近更新 更多