Cherrypy和Pyramid整合

时间:2016-03-23 09:44:29

标签: pyramid wsgi cherrypy

我有一个使用mod_wsgi在apache下运行的金字塔应用程序。 我计划从apache迁移到cherrypy。 我可以用cherrypy加载现有Web应用程序的静态页面。但是对于任何AJAX请求,我都找不到资源(404)错误。 任何线索??

谢谢

30-MAR-2016

这是代码结构

MyProject   
   |
cherry_wsgi.py (creates wsgi app object)
cherry_server.py (starts cherrypy server using app object from cherry_wsgi.py)  
development.ini
myproject
   |
    __init__.py  (Scans sub-folders recursively)
    views.py
    mydata
       |
        __init__.py 
        data
          |
          __init__.py  (Added route for getdata)
          views.py (implementation of getdata)
  |
myclient
    |
    index.html (AJAX query)

myclient / index.html的内容

<html>
   <head>
     <meta charset="utf-8">
     <title>HOME UI</title>
   </head>          
   <body>
     <button id="submit">Give it now!</button>
     <script src="./jquery-2.1.3.min.js"></script>
     <script>$("#submit").on('click', function() 
    {
       $.ajax(
      {
      type: "GET",
      async: false,
      url: "../myproject/data/getdata",
      success: function (data) 
      {
         console.log("LED On" );
      },
      error: function ()
      {
          console.error("ERROR");
       }
   });
});</script></body></html>

档案myproject/__init__.py

from pyramid.config import Configurator
from pyramid.renderers import JSONP
import os 
import logging

def includeme(config):
   """ If include function exists, write this space.
   """
   pass

def main(global_config, **settings):
   """ This function returns a Pyramid WSGI application."""
   config = Configurator(settings=settings)
   config.add_renderer('jsonp', JSONP(param_name='callback'))
   config.include(includeme)

   directory = "/home/redmine/Downloads/MyProject/myproject/mydata/"
   for root,dir,files in os.walk(directory):
      if root == directory:# Walk will return all sublevels. 
        for dirs in dir: #This is a tuple so we need to parse it
          config.include('myproject.mydata.' + str(dirs), route_prefix='/' + str(dirs))

config.add_static_view('static', 'prototype', cache_max_age=3600)
config.scan()
return config.make_wsgi_app()

档案myproject/views.py

from pyramid.view import view_config

档案myproject/mydata/__init__.py

import data

档案mproject/mydata/data/__init__.py

from pyramid.config import Configurator

def includeme(config):
   config.add_route('get_data', 'getdata', xhr=True)

def main(global_config, **settings):
   print 'hello'
   config = Configurator(settings=settings)
   config.include(includeme, route_prefix='/data')
   config.add_static_view('static', 'prototype', cache_max_age=3600)
   config.scan('data')
   return config.make_wsgi_app()

档案mproject/mydata/data/views.py

from pyramid.view import view_config
import json

@view_config(route_name='get_data', xhr=True, renderer='jsonp')
def get_data(request):
  return "{'firstName' : 'John'}"

档案cherry_wsgi.py

from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.paster import get_app

config = Configurator()
app = get_app('development.ini', 'main')

档案cherry_server.py

from cherry_wsgi import app
import cherrypy

conf = {
     '/': {
         'tools.sessions.on': True,
         'tools.staticdir.root': '/home/redmine/Downloads/MyProject/'
     },
     '/myclient': {
         'tools.staticdir.on': True,
         'tools.staticdir.dir': './myclient'
     }
 }


if __name__ == '__main__':
   cherrypy.tree.mount(app, "/", conf) 
   cherrypy.server.unsubscribe()
   server = cherrypy._cpserver.Server()
   server.socket_host = "0.0.0.0"
   server.socket_port = 9090
   server.thread_pool = 30

   server.subscribe()
   cherrypy.engine.start()
   cherrypy.engine.block()

1 个答案:

答案 0 :(得分:1)

我不确定我是否抓住了所有东西,但我确实看到了一些错误。首先,你的网址在你的ajax电话中关闭了。接下来在views.py中,您使用的是jsonp而不是json作为渲染器。此外,您正在使用&#34; route_name&#34;而不是&#34; route&#34; (ajax调用)为@view_config。最后,你返回一个字符串。我把它变成了一个字典。

如果你没有直接设置你的项目结构,金字塔可能会很棘手。我学到了很多方法:)

myclient / index.html的内容

<html>
    <head>
        <meta charset="utf-8">
        <title>HOME UI</title>
    </head>          
<body>
 <button id="submit">Give it now!</button>
 <script src="./jquery-2.1.3.min.js"></script>
 <script>$("#submit").on('click', function() 
{
   $.ajax(
  {
  type: "GET",
  async: false,
  url: "getdata",
  success: function (data) 
  {
     console.log("LED On" );
  },
  error: function ()
  {
      console.error("ERROR");
   }
  });
});
</script>
</body>
</html>

文件mproject / mydata / data / views.py

from pyramid.view import view_config

@view_config(name='get_data',  renderer='json')
def get_data(request):
    return {'firstName' : 'John'}

现在,在查看整体文件结构后,它看起来并不像标准金字塔应用程序。你有很多事情要做,看起来像编程过程。有很多重复的代码。也许你这样做是有原因的,但我不知道。

我在下面包含了一个金字塔启动git repo。我建立它是为了帮助人们开始在Openshift上放置金字塔项目。我认为你的金字塔项目应该遵循相同的轮廓。不需要深层文件夹。

您要特别关注的文件是&#34; app.py.disabled&#34;文件。不要介意残疾人。有两种方法可以启动Openshift金字塔应用程序,这个git repo正在使用wsgi.py文件。你可以切换两个。

无论如何,在app.py.disabled文件中,您可以看到我用wsgi服务器(简单,女服务员和樱桃)设置金字塔应用程序的所有不同方式。只需取消注释/注释掉您想要的代码。

我认为你正在混合使用cherrypy框架和金字塔框架。只需使用cherrypy的wsgi服务器。不要做任何樱桃配置。我听到的最后一点是Cherrypy将他们的wsgi服务器从他们的框架中分离出来。我看了以后已经至少一年了。

你可能只是尝试使用女服务员。非常好,简单,适用于所有平台。

Openshift-Pyramidstarter