2012-05-25 6 views
0

Мне нужно сделать buildout движок Google. Я написал конфигурационный файл buildout.cfg:buildout google app engine

[buildout] 
parts = 
    gae_sdk 
    gae_tools 
    app_lib 

unzip = true 
relative-paths = true 
download-cache = etc/downloads 
develop-eggs-directory = etc/develop-eggs 
parts-directory = etc/parts 


[gae_sdk] 
recipe = appfy.recipe.gae:sdk 
url = http://googleappengine.googlecode.com/files/google_appengine_1.4.3.zip 
destination = ${buildout:parts-directory} 
hash-name = false 
clear-destination = true 


[gae_tools] 
recipe = appfy.recipe.gae:tools 
sdk-directory = ${gae_sdk:destination}/google_appengine 

[app_lib] 
recipe = appfy.recipe.gae:app_lib 
lib-directory = src/distlib 
use-zipimport = false 


eggs = 
    webapp2 

После команды запуска питона < (свернуться http://python-distribute.org/bootstrap.py) -distribute и ./bin/buildout GAE Безразлично `хочет работать. Сервер работает, но самый простой мир Hello с сайта GAE показывает ошибку importError: нет модуля с именем webapp2. На первом мне нужно запустить Hello world, после моего скрипта. файл и структура папок: Progect/buildout.cfg Progect/SRC/hello_world.py, app.yaml

file app.yaml: 
application: hello_world 
version: 1 
runtime: python 
api_version: 1 
threadsafe: true 

handlers: 
- url: /.* 
script:hello_world.app 

builtins: 
- deferred: on 

file hello_world.py: 
import webapp2 

class MainPage(webapp2.RequestHandler): 
def get(self): 
self.response.headers = ‘text/plain’ 
self.response.out.write('Hello, webapp World!') 

app = webapp2.WSGIApplication(, 
debug=True) 
help me, please. 

ответ

2

webapp2 включен в последние SDK (google_appengine/lib/webapp2). Если вы используете более новый SDK или не импортируете webapp2, он должен работать на вас.

Если вы заинтересованы в немного другой настройке компоновки, я включил ее.

Я использовал rod.recipe.appengine для сборки и был очень доволен этим. Он даже позволяет вам исправлять SDK приложения, если вам нужно исправить PyCrypto imports и т. Д.

Я сделал свой конфиг на основе bobo example и некоторых других источников. В приведенном ниже примере вы можете получить зависимости, такие как PIL, от dist.plone.org, он тянет wtforms для обработки формы и gdata для удобства криптографии и помещает их в package.zip, который может быть добавлен в sys.path перед импортом, например с import zippedpackages где zippedpackages.py выглядит

import sys 
if 'packages.zip' not in sys.path: 
    sys.path.insert(0, 'packages.zip') 

Также отметим, что settings.py и app.yaml генерируются из шаблонов и переменных, как appspotname и appspotversion вставлены.

Конструкция основана на запущенной структуре, но этот точный пример не был протестирован, а также отсутствуют некоторые шаблоны. Если вы посмотрите на разные рецепты на pypi, вы можете прочитать параметры и синтаксис.

Если вы используете шаблоны, вам может потребоваться дважды запустить сборку, чтобы сначала генерировать файлы из шаблонов (в каталоге src в моей настройке), а затем создать символическую ссылку на каталог частей (где работает SDK). Если вам не нужны шаблоны, удалите их из сборки и настройте, как обычно. Использование яиц вместо virtualenv позволяет вам переключать библиотеки как конфигурацию, а не иметь разные virtualenvs. Однако не большая проблема, поскольку версии библиотеки редко меняются. Если вы столкнулись с проблемами с яйцами, стоит также отметить, что магия импорта SDK знает о пакетах сайтов и в некоторой степени virtualenvs, но не о яйцах, поэтому в любом случае некоторые библиотеки могут быть установлены в virtualenv.

[buildout] 
appspotname = progect 
appspotversion = dev 

versions = versions 
develop = 
    src/progect 
parts = 
    progect 
    progectconfig 
    progectsettings 
    nosetests 
    noseconfig 
    zipsymlink 

unzip = true 

find-links = 
    http://dist.plone.org/thirdparty/ 

[progect] 
recipe = rod.recipe.appengine 
url = http://googleappengine.googlecode.com/files/google_appengine_1.6.6.zip 
server-script = dev_appserver 
packages = 
    wtforms 
    gdata 
src = ${buildout:directory}/src/progect 
exclude = tests 
zip-packages = True 
use_setuptools_pkg_resources = True 
# We have a patch overriding imports to enable buildout and eggs 
#patch = ${buildout:directory}/google_appserver.patch 

[progectconfig] 
recipe = collective.recipe.template 
input = ${buildout:directory}/templates/app.yaml.in 
output = ${progect:src}/app.yaml 

[progectsettings] 
recipe = collective.recipe.template 
input = ${buildout:directory}/templates/settings.py.in 
output = ${progect:src}/settings.py 

[nosetests] 
recipe = zc.recipe.egg 
eggs = 
    NoseGAE 
    WebTest 
    progect 
    nose 

extra-paths = 
    ${buildout:directory}/etc 
    ${buildout:directory}/parts/google_appengine 
    ${buildout:directory}/parts/google_appengine/lib/antlr3 
    ${buildout:directory}/parts/google_appengine/lib/django_1_3 
    ${buildout:directory}/parts/google_appengine/lib/fancy_urllib 
    ${buildout:directory}/parts/google_appengine/lib/ipaddr 
    ${buildout:directory}/parts/google_appengine/lib/webob_1_1_1 
    ${buildout:directory}/parts/google_appengine/lib/webapp2/ 
    ${buildout:directory}/parts/google_appengine/lib/yaml/lib 
    ${buildout:directory}/parts/google_appengine/lib/simplejson 
    ${buildout:directory}/parts/google_appengine/lib/graphy 
interpreter = python 

[noseconfig] 
recipe = collective.recipe.template 
input = ${buildout:directory}/templates/setup.cfg.in 
output = ${buildout:directory}/setup.cfg 

[zipsymlink] 
recipe = svetlyak40wt.recipe.symlinks 
path = ${progect:src} 
files = ${progect:app-directory}/packages.zip 

[versions] 
Django = 1.3 
gdata = 2.0.16 
lxml = 2.3 
PIL = 1.1.7 
PyCrypto = 2.3 
setuptools = 0.6c11 
webapp2 = 2.3 
WebOb = 1.1.1 
WTForms = 1.0.1 

# Tools and dependencies 
svetlyak40wt.recipe.symlinks = 0.2.1 

Приложение.Шаблон YAML может выглядеть

application: ${buildout:appspotname} 
version: ${buildout:appspotversion} 
runtime: python27 
threadsafe: true 
api_version: 1 

libraries: 
- name: PIL 
    version: "${versions:PIL}" 
- name: pycrypto 
    version: "${versions:PyCrypto}" 
- name: django 
    version: "${versions:Django}" 
- name: lxml 
    version: "${versions:lxml}" 
- name: setuptools 
    version: "${versions:setuptools}" 
- name: webapp2 
    version: "${versions:webapp2}" 
- name: webob 
    version: "${versions:WebOb}" 

handlers: 
- url: /.* 
    script:hello_world.app 
- url: /_ah/queue/deferred 
    script: google.appengine.ext.deferred.application 
    login: admin 

builtins: 
- deferred: on 

Носа шаблон тесты конфигурации, запуск тестов с каталогом Src (в отличии от основных альтернативных частей/Progect):

[nosetests] 
verbosity=1 
detailed-errors=1 
with-gae=1 
gae-application=${progect:src} 
gae-lib-root=${buildout:directory}/parts/google_appengine 
where=${progect:src} 

Когда я хочу, чтобы установить это, я перейти в каталог Buildout корня и введите

/path/to/appropriate/python bootstrap.py --distribute 
bin/buildout -c buildout.cfg 

, а затем я могу запустить bin/nosetests или bin/dev_appserver parts/progect

+0

Спасибо, проблема закончена – voha

0

webapp2 не входит в SDK, вам необходимо либо установить пакет в среде питона или включить это в buildout, если вы используете песочницу или virtualenv внутри сборки.

+0

Я использую virtualenv. Как я могу включить webapp2 в мою сборку? – voha

+0

Вы установили virtualenv с помощью сборки или вручную? – aschmid00

+0

Я создаю virtualenv вручную. Можете ли вы написать мне пример построения? – voha