Вопрос по webapp2, python, mod-wsgi, apache – webapp2 под Apache (= без Google App Engine)

4

Я пытаюсь запустить webapp2 под Python с Apache и mod_wsgi, а именно: Wampserver для Windows 7 с Apache 2.2.22. Пока что я с треском провалился. :-(

Я использовал следующий пример изhttps://developers.google.com/appengine/docs/python/gettingstartedpython27/usingwebapp:

import webapp2

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write('Hello, webapp World!')

app = webapp2.WSGIApplication([('/', MainPage)],
                              debug=True)

Когда я сохраняю этот файл какc:wamp\www\Python\hello.pyи перейдите кlocalhost/Python/hello.pyЯ получил:

Not Found
The requested URL /python/hello.py was not found on this server.

Однако позвольте мне заявить, что mod_wsgi для Python в Apache работает нормально; следующий код

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello from Python!'

    response_headers = [('Content-type', 'text/plain'), 
        ('Content-Length', str(len(output)))]

    start_response(status, response_headers)
    return [output]

находится по адресуc:\wamp\www\Python\test.py, Когда я иду вlocalhost/Python/test.pyбраузер говоритHello from Python! как я и ожидал.

До сих пор я только узнал, как изменить имя по умолчанию для def (= & quot; application & quot;) на & quot ;thing_else & quot; поставив линию

WSGICallableObject something_else

в.htaccess.

Но как я могу заставить Apache принять переменнуюapp как вызываемый объект? (До сих пор я использовал Python в основном для программирования вне Интернета, поэтому я надеюсь, что это не глупый вопрос.)

Любая помощь приветствуется.

Update:

Грэм спросил меня о конфигурации mod_wsgi, которую я использую в файлах конфигурации Apache, и где я ее добавляю. я добавил

LoadModule wsgi_module modules/mod_wsgi.so

<Directory "c:/wamp/www/python">
Options +ExecCGI
AddHandler wsgi-script .py
Order allow,deny
Allow from all
</Directory>

вhttpd.conf прямо в конце всего «LoadModule» линий.

Некоторая дополнительная информация о моей конфигурации: я использую mod_wsgi-win32-ap22py27-3.3.so. (Конечно, я переименовал его вmod_wsgi.so и поместил его вc:\wamp\bin\apache\apache2.2.22\modules.) Моя командная строка Python говорит об этой версии:Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win 32, Сервер Wamp, который я использую, является 32-битным. Моя операционная система - Windows 7 Ultimate 64bit SP1.

Надеюсь, это поможет с диагнозом ...

Ваш Ответ

5   ответов
1

WebOb, Paste prerequisites в среду хостинга, используя pip или easy_install

2) Создайте файл wsgi.py в корневой папке веб-сайта (/var/www/website/wsgi.py).

#/var/www/website/wsgi.py
import webapp2
class Index(webapp2.RequestHandler):
    def get(self):
        output = 'webapp2 running on apache2'
        self.response.headers = [('Content-type','text/plain'),('Content-length',str(len(output)))]
        self.response.out.write(output)

application = webapp2.WSGIApplication([('/',Index)], debug=True)

3) Создайте файл конфигурации apache2 в папке sites-available (/etc/apache2/sites-available/website.conf)

<VirtualHost *:80>
    ServerName website
    WSGIScriptAlias / "/var/www/ website /wsgi.py"
</VirtualHost>

4) Добавить & # x201C; веб-сайт & # x201D; псевдоним & # x201C; / etc / hosts & # x201D; файл.

5) Запустите следующую команду, чтобы включить & # x201C; /etc/apache2/sites-available/website.conf”

a2ensite website.conf

6) Перезагрузите и перезапустите веб-сервер apache2

service apache2 reload 
/etc/init.d/apache2 restart

7) Веб-сервер Apache автоматически загрузит & # x201C; сайт & # x201D; Конфигурация при перезапуске Экземпляр webapp2.WSGIApplication будет указывать на mod_wsgi & quot; application & quot ;.

Please note above example is tested on an Ubuntu 13.10 operating system.
0

Я еще не пробовал сам, но вы создали еще один модуль Python, скажем runme.py, со следующим кодом:

def main():
  run_wsgi_app(yourmodule.app)
if __name__ == '__main__':
  main()

(Примечание: я получил это отhttps://developers.google.com/appengine/docs/python/python27/migrate27#wsgi

Спасибо за подсказку. Я проверил страницу, на которую вы ссылаетесь. К сожалению у меня нетyourmodule.app как я работаюwithout Google App Engine. Кроме того, это даже не было бы правильным решением, если бы я работалwith GAE, как этот кусок кода, который должен бытьcommented out когда вы переходите на Python 2.7. Так что это было бы даже неправильно, если бы я пытался подключиться к GAE. Rainer
7

http://code.google.com/p/modwsgi/wiki/InstallationOnWindows и настройте ваш httpd.conf правильно.

Я полагаю, вы уже добавили эти 2 строки:

LoadModule wsgi_module modules/mod_wsgi.so
WSGICallableObject app

Установите py-setuptools изhttp://pypi.python.org/pypi/setuptools затем установите модули для вашего питона

easy_install WebOb
easy_install Paste
easy_install webapp2

Создать виртуальный хост

<VirtualHost *>
  ServerAdmin [email protected]
  DocumentRoot "/vhost/domains/mydomain/htdocs"
  ServerName a.mydomain.net
  WSGIScriptAlias / "/vhost/domains/mydomain/wsgi/main.py"
  Alias /static/ "/vhost/domains/mydomain/htdocs/static/"
</VirtualHost>

File: main.py

import webapp2

class Hello(webapp2.RequestHandler):
  def get(self):
    self.response.headers['Content-Type'] = 'text/html; charset=utf-8'
    self.response.out.write('hello world!')

application = webapp2.WSGIApplication([
    ('/', Hello)
], debug=True)
0

app = webapp2.WSGIApplication([('/', MainPage)], debug=True)

должно быть:

app = webapp2.WSGIApplication([('/Python/hello.py', MainPage)], debug=True)

и тогда все работает! Arghh!

Огромное спасибо Грэму за терпеливое продвижение в правильном направлении: проблема действительно была в пределах webapp2, как только WSGICallableObject был установлен в «приложение»!

Чтобы кто-нибудь застрял на аналогичной проблеме маршрутизации с webapp2: ознакомьтесьhttp://webapp-improved.appspot.com/guide/routing.html, Первый пример, на «простых маршрутах» заставил меня переписать мой звонокwebapp.WSGIApplication в течение нескольких минут!

Update

К сожалению, приведенное выше решение не кажется надежным: сегодня я иногда получал правильный ответ от webapp2, а иногда я получал 404 от webapp2.

Не изменяя ни одной строки кода со вчерашнего дня.

Я не могу воспроизвести, при каких условиях я получаю 404 или правильный ответ. Я отказываюсь от этого на данный момент. Что печально, так как я думаю, что Python такой классный язык.

@Graham: Опять же, спасибо за вашу помощь.

Хорошо, я попробую. Rainer
Если это работает, то в основном говорит, что webapp2 не является хорошо управляемым приложением WSGI, так как игнорирует точку монтирования. Следует разрешать только URL-адреса относительно точки монтирования, которая передается в SCRIPT_NAME. IOW, они должны отображать PATH_INFO.
@ Грэхем: webapp2 явно плохо себя ведет: я удалил свой собственный & quot; принять ответ & quot; проверять. (См. Обновление выше.) Я сдаюсь на данный момент. Я больше не могу позволить себе поиграть с этим, так как я оценивал Python / webapp2 для важного проекта. На мой вкус, это явно недостаточно надежно. Что очень жаль, так как Python такой классный язык. Но спасибо за помощь мне. Rainer
Лично я бы порекомендовал вам использовать Flask. Это значительно улучшенная среда WSGI, которая небольшая и простая в использовании. Фреймворк webapp2 не имеет такой хорошей репутации в веб-сообществе Python и не так хорошо известен.
0

Вы не пробовали:

 WSGICallableObject app

Вы также можете изменить свой код, чтобы сказать:

application = webapp2.WSGIApplication([('/', MainPage)], debug=True)

и избегайте необходимости указывать mod_wsgi искать другое имя.

Что установлен DocumentRoot в вашей конфигурации Apache?
Я добавил эти детали в вопрос сейчас. Это достаточно информации или вам нужно больше? Заранее спасибо. Rainer
DocumentRoot "c:/wamp/www/" Rainer
Да я пробовалWSGICallableObject app прежде чем задавать вопрос. Это дало мне404 Not Found The resource could not be found. Ваше предложениеapplication = webapp2... это то, что я не придумал. К сожалению, это также дает мне 404. Rainer
Затем добавьте дополнительную информацию к исходному вопросу, который показывает конфигурацию mod_wsgi, которую вы используете в файлах конфигурации Apache и где вы ее добавляете.

Похожие вопросы