我有一个使用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()
答案 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服务器从他们的框架中分离出来。我看了以后已经至少一年了。
你可能只是尝试使用女服务员。非常好,简单,适用于所有平台。