2016-12-13 1 views
1

Я новичок в cherrypy и выбираю его для создания веб-сервисов для использования в других веб-приложениях. Я хочу запустить его с помощью apache2 и mod_wsgi. Я следовал за довольно old documentation, и пример hello world работал отлично.CherryPy: создать веб-сервис, работающий за apache2 (mod_wsgi)

Я сейчас смотрю на turotials и, конечно же, REST tutorial. Однако я не могу заставить его работать. Я получаю статус 500 и ошибки в журнале Apache:

TypeError: expose_() missing 1 required positional argument: 'func' 

Чтобы даже получить, что далеко я приспособил сценарий из учебника похож на привет мир, например, для работы с Apache:

import sys 
sys.stdout = sys.stderr 

import random 
import string 

import cherrypy 

cherrypy.config.update({'environment': 'embedded'}) 

@cherrypy.expose 
class StringGeneratorWebService(object): 

    @cherrypy.tools.accept(media='text/plain') 
    def GET(self): 
     return cherrypy.session['mystring'] 

    def POST(self, length=8): 
     some_string = ''.join(random.sample(string.hexdigits, int(length))) 
     cherrypy.session['mystring'] = some_string 
     return some_string 

    def PUT(self, another_string): 
     cherrypy.session['mystring'] = another_string 

    def DELETE(self): 
     cherrypy.session.pop('mystring', None) 


conf = { 
    '/': { 
     'request.dispatch': cherrypy.dispatch.MethodDispatcher(), 
     'tools.sessions.on': True, 
     'tools.response_headers.on': True, 
     'tools.response_headers.headers': [('Content-Type', 'text/plain')], 
    } 
} 
cherrypy.quickstart(StringGeneratorWebService(), '/', conf) 

Что я делаю неправильно?

ответ

1

Выпуск 1:

TypeError: expose_() missing 1 required positional argument: 'func' 

был вызван тем, что я использую анаконду питон и версию CherryPy с установленной conda install cherrypy является устаревшей (3.8.0). Удаление этой версии и установка новой версии с помощью pip решили это.

Выпуск 2:

Неправильная маршрутизация.

cherrypy.quickstart(StringGeneratorWebService(), '/', conf) 

должен быть

cherrypy.Application(StringGeneratorWebService(), script_name=None, config=conf) 

затем просто указав путь к файлу сценария будет работать.

Выпуск 3:

CherryPy сеансов по умолчанию в памяти и что не очень хорошо играть с mod_wsgi. Вам нужно использовать хранилище файлов для сеанса, например. настроить конфиг:

conf = { 
'/': { 
    'request.dispatch': cherrypy.dispatch.MethodDispatcher(), 
    'tools.sessions.on': True, 
    'tools.sessions.storage_type': 'file', 
    'tools.sessions.storage_path': '/path/to/sessions', # in case of 500 error check privileges of session folder!!! 
    'tools.response_headers.on': True, 
    'tools.response_headers.headers': [('Content-Type', 'text/plain')] 
} 

}

+0

Я не очень понимаю точку 'SCRIPT_NAME = None' – webKnjaZ

+1

Это прямо от одного из своих учебников. Ошибка была 'cherrypy.quickstart' против' cherrypy.Application'. Подобным образом это работает, и downvote ошибочен для тех, кто имеет одинаковые проблемы. Примечание. Лично мне нужно было заставить это работать на мою гордость, но теперь я рекомендую выбрать другую структуру в целом, поскольку документация разрежена и часто устаревает. –

+0

почему это было downvoted? – laserpython

 Смежные вопросы

  • Нет связанных вопросов^_^