2016-03-23 12 views
1

Ich habe eine Pyramiden-Anwendung unter Apache mit mod_wsgi ausgeführt. Ich plane, von Apache zu Cherrypy zu wandern. Ich kann statische Seite der bestehenden Webanwendung mit Cherrypy laden. Aber für jede AJAX-Anfrage bekomme ich den Fehler Ressource nicht gefunden (404). Irgendwelche Hinweise ??Cherrypy und Pyramid Integration

Dank

30-Mar-2016

Hier Codestruktur

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) 

Inhalt 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> 

Datei 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() 

Datei myproject/views.py

from pyramid.view import view_config 

Datei myproject/mydata/__init__.py

import data 

Datei 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() 

Datei 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'}" 

Datei 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') 

Datei 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

Verwenden Sie nur wsgi Server cherrypy für Ihren Pyramid-App? Das ist die einzige Pyramid/Cherrypy-Integration, die ich gemacht habe. –

+0

Ja. Ich benutze cherrypys wsgi Server für Pyramide. Ich folgte diesem Artikel https://www.digitalcocean.com/community/tutorials/how-to-deploy-python-wsgi-applications-using-a-cherrypy-web-server-behind-nginx (Beachten Sie, dass ich nicht verwendet habe nginx aber plane, es in naher Zukunft zu verwenden. Ab sofort nur cherrypy.) –

+0

Hier ist ein Beispiel, wie ich meine Pyramid-Apps auf Openshift einstelle. Es gibt Beispiele für die Einrichtung von Kellnerin und cherrypy in der App.py-Datei. Hth.http: //stackoverflow.com/questions/27264103/how-to-create-app-using-pyramid-into-openshift/27324518#27324518 –

Antwort

1

Ich bin mir nicht sicher, ob ich alles gefangen, aber ich habe ein paar Fehler sehen. Zuallererst war deine URL in deinem Ajax-Anruf deaktiviert. Als Nächstes haben Sie in Ihrer views.py jsonp und nicht json als Renderer verwendet. Außerdem verwendeten Sie "route_name" anstelle von "route" (Ajax-Aufrufe) für die @view_config. Schließlich haben Sie eine Zeichenfolge zurückgegeben. Ich habe es zu einem Diktat geändert.

Pyramide kann schwierig sein, wenn Sie Ihre Projektstruktur nicht auf einfache Weise einrichten. Ich habe gelernt, auf die harte Weise :)

Inhalt 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> 

Datei 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'} 

nun nach einem Blick auf Ihre gesamte Dateistruktur sieht nicht wie eine Standard-Pyramiden-App aus. Du hast eine Menge Dinge im Kopf und es sieht so aus, als ob ich nicht mehr programmieren würde. Es gibt viel doppelten Code. Vielleicht machst du das aus einem bestimmten Grund, aber ich weiß es nicht.

Ich habe unter einer Pyramide Start Git Repo enthalten. Ich habe es gebaut, um Leuten zu helfen, Pyramidenprojekte auf Openshift zu platzieren. Ich würde denken, dass Ihr Pyramidenprojekt dem gleichen Umriss folgen sollte.Keine Notwendigkeit für tiefe Ordner.

Die Datei, auf die Sie besonders achten möchten, ist die Datei "app.py.disabled". Den behinderten Teil nicht stören. Es gibt zwei Möglichkeiten, eine Openshift-Pyramiden-App zu starten, und dieses Git-Repo verwendet die Datei wsgi.py. Sie können nur die zwei wechseln.

Wie auch immer, in der Datei app.py.disabled können Sie alle verschiedenen Möglichkeiten sehen, die ich verwendet habe, um eine Pyramiden-App mit wsgi-Servern (simple, kellnerin und cherrypy) einzurichten. Sie können den gewünschten Code einfach auskommentieren/auskommentieren.

Ich denke, Sie mischen das cherrypy Rahmen und Pyramidenrahmen. Verwenden Sie einfach den wsgi-Server von cherrypy. Tun Sie keine der cherrypy Konfiguration. Das letzte, was ich hörte, war, dass Cherrypy ihren wsgi-Server von ihrem Framework trennte. Es ist mindestens ein Jahr her, seit ich nachgesehen habe.

Sie können versuchen, nur mit der Kellnerin. Sehr gut und einfach und funktioniert über alle Plattformen hinweg.

Openshift-Pyramidstarter