2014-09-01 2 views
-1

Я читаю «Head First Python». Я нахожусь в главе 10, где представлен Google App Engine. Первоначальный мир приветствия с использованием Python и Google App Engine был успешным, но последующие программы все провалились.Google App Engine - Django - Python - Ubuntu - Проблемы

У меня есть следующий app.yaml файл:

application: three 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: false 

handlers: 
- url: /.* 
    script: page368b.py 

libraries: 
- name: django 
    version: "1.3" 

Со следующим Python кода (page368b.py):

import wsgiref.handlers 

from google.appengine.ext import webapp 
from google.appengine.ext import db 
from google.appengine.ext.webapp import template 

#this line throws the error when accessing the web-page 
from google.appengine.ext.db import djangoforms 

import birthDB 

class BirthDetailsForm(djangoforms.ModelForm): 
    class Meta: 
     model = birthDB.BirthDetails 

class SimpleInput(webapp.RequestHandler): 
    def get(self): 
     html = template.render('templates/header.html', {'title': 'Provide your birth details'}) 
     html = html + template.render('templates/form_start.html', {}) 
     html = html + str(BirthDetailsForm(auto_id=False))  
     html = html + template.render('templates/form_end.html', {'sub_title': 'Submit Details'}) 
     html = html + template.render('templates/footer.html', {'links': ''}) 
     self.response.out.write(html) 

def main(): 
    app = webapp.WSGIApplication([('/.*', SimpleInput)], debug=True) 
    wsgiref.handlers.CGIHandler().run(app) 

if __name__ == '__main__': 
    main() 

Вот другой модуль Python импортирован в один выше (

from google.appengine.ext import db 

class BirthDetails(db.Model): 
    name =   db.StringProperty() 
    date_of_birth = db.DateProperty() 
    time_of_birth = db.TimeProperty() 

Существует шаблоны, которые вызывается вышеуказанным модулем Python. В них есть код HTML с некоторым кодом Django. Ниже приведен пример использования footer.html.

<p> 
{{ links }} 
</p> 
</body> 
</html> 

Другие файлы HTML аналогичны. Я могу запустить Google App Engine без проблем, используя эту команду из BASH: python google_appengine/dev_appserver.py ~/Desktop/three Каталог три содержит шаблоны папку, файл app.yaml, модули Python, приведенные выше.

Моя проблема, когда я получить доступ к веб-странице на http://localhost:8080 ничего там и BASH оболочки, где выполняется команда, чтобы начать это показывает все вызовы в программе Python, вызвавшего проблему, а затем, наконец, говорит: ImportError : Параметры не могут быть импортированы, поскольку переменная среды DjANGO_SETTINGS_MODULE не определена.

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

Кроме того, в книге говорится, что для установки этого кода используется Python2.5, но Google App Engine теперь поддерживает Python2.7, который не был доступен на момент написания книг. Кроме того, я только что проверил, и Python2.5 даже не может использоваться с Google App Engine. Python2.5 deprecated

Это, вероятно, слишком сложно решить здесь. Я удивлен, что все эти различные технологии используются в книге Head First Python. Он задает много Python noob.^_^

С уважением,

user_loser

UPDATE - я установил Django на моей Ubuntu операционной системы

Когда я изменить строку в модуле питон 368B.ру from google.appengine.ext.db import djangoforms к from django import forms я получаю следующее сообщение об ошибке на консоли при доступе к веб-странице на localhost:

[email protected]:~/Desktop$ google_appengine/dev_appserver.py three 
INFO  2014-09-06 21:08:36,669 api_server.py:171] Starting API server at:  http://localhost:56044 
INFO  2014-09-06 21:08:36,677 dispatcher.py:183] Starting module "default" running at: http://localhost:8080 
INFO  2014-09-06 21:08:36,678 admin_server.py:117] Starting admin server at: http://localhost:8000 
ERROR 2014-09-06 21:08:48,942 cgi.py:121] Traceback (most recent call last): 
File "/home/loser/Desktop/three/page368b.py", line 13, in <module> 
class BirthDetailsForm(forms.ModelForm): 
File "/home/loser/Desktop/google_appengine/lib/django-1.3/django/forms/models.py", line 205, in __new__ 
opts.exclude, opts.widgets, formfield_callback) 
File "/home/loser/Desktop/google_appengine/lib/django-1.3/django/forms/models.py", line 145, in fields_for_model 
opts = model._meta 
AttributeError: type object 'BirthDetails' has no attribute '_meta' 

INFO  2014-09-06 21:08:48,953 module.py:652] default: "GET/HTTP/1.1" 500 - 
ERROR 2014-09-06 21:08:49,031 cgi.py:121] Traceback (most recent call last): 
File "/home/loser/Desktop/three/page368b.py", line 13, in <module> 
class BirthDetailsForm(forms.ModelForm): 
File "/home/loser/Desktop/google_appengine/lib/django-1.3/django/forms/models.py", line 205, in __new__ 
opts.exclude, opts.widgets, formfield_callback) 
File "/home/loser/Desktop/google_appengine/lib/django-1.3/django/forms/models.py", line 145, in fields_for_model 
opts = model._meta 
AttributeError: type object 'BirthDetails' has no attribute '_meta' 

ошибки обновления от запуска программы, как без внесения каких-либо изменений:

[email protected]:~/Desktop$ google_appengine/dev_appserver.py three/ 
INFO  2014-09-06 21:35:19,347 api_server.py:171] Starting API server at: http://localhost:60503 
INFO  2014-09-06 21:35:19,356 dispatcher.py:183] Starting module "default" running at: http://localhost:8080 
INFO  2014-09-06 21:35:19,358 admin_server.py:117] Starting admin server at: http://localhost:8000 
ERROR 2014-09-06 21:35:25,011 cgi.py:121] Traceback (most recent call last): 
File "/home/loser/Desktop/three/page368b.py", line 13, in <module> 
class BirthDetailsForm(djangoforms.ModelForm): 
File "/home/loser/Desktop/google_appengine/google/appengine/ext/db/djangoforms.py", line 772, in __new__ 
form_field = prop.get_form_field() 
File "/home/loser/Desktop/google_appengine/google/appengine/ext/db/djangoforms.py", line 370, in get_form_field 
return super(DateProperty, self).get_form_field(**defaults) 
File "/home/loser/Desktop/google_appengine/google/appengine/ext/db/djangoforms.py", line 353, in get_form_field 
return super(DateTimeProperty, self).get_form_field(**defaults) 
File "/home/loser/Desktop/google_appengine/google/appengine/ext/db/djangoforms.py", line 200, in get_form_field 
return form_class(**defaults) 
File "/home/loser/Desktop/google_appengine/lib/django-1.3/django/forms/fields.py", line 340, in __init__ 
super(DateField, self).__init__(*args, **kwargs) 
File "/home/loser/Desktop/google_appengine/lib/django-1.3/django/forms/fields.py", line 99, in __init__ 
widget = widget() 
File "/home/loser/Desktop/google_appengine/lib/django-1.3/django/forms/widgets.py", line 382, in __init__ 
self.format = formats.get_format('DATE_INPUT_FORMATS')[0] 
File "/home/loser/Desktop/google_appengine/lib/django-1.3/django/utils/formats.py", line 67, in get_format 
if use_l10n or (use_l10n is None and settings.USE_L10N): 
File "/home/loser/Desktop/google_appengine/lib/django-1.3/django/utils/functional.py", line 276, in __getattr__ 
self._setup() 
File "/home/loser/Desktop/google_appengine/lib/django-1.3/django/conf/__init__.py", line 40, in _setup 
raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE) 
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined. 
+0

Где вы разместили файл settings.py? – power

+0

Вот пример установки (не мой): http://django-rocket-engine.readthedocs.org/en/latest/installation.html – power

+0

@power нет settings.py - Да, я прочитал об этом файле но в примере в книге не было ни одного. Но книга была написана, когда Python2.5 все еще использовался в Google App Engine. –

ответ

2

Я предполагаю, что вы работаете с примером кода, который прилагается к книге, доступной с этого сайта: http://examples.oreilly.com/0636920003434/

Если вы загружаете и расширяете архив главы 10 (chapter10.zip), вы увидите несколько файлов примеров, а также несколько архивов .zip. Файл page368b.py соответствует архиву webapp-chapter10-simpleform.zip. Откройте этот архив, чтобы создать каталог webapp-chapter10-simpleform. Этот каталог содержит файл app.yaml, файл simpleform.py (идентичный page368b.py), birthDB.py (класс модели ext.db) и статические и шаблонные файловые каталоги.

К сожалению, как вы, возможно, уже заметили, пример не работает из коробки с последним SDK. (Я использую версию 1.9.10 SDK, которая была только что выпущена.) Когда вы пытаетесь загрузить страницу, она сообщает «ImportError: Нет модуля с именем django.core.exceptions». Строго говоря, этот пример: не приложение Django, а просто пытается использовать библиотеку, которая зависит от присутствия Django.

Среда исполнения Python 2.5, выбранная файлом app.yaml, включенным в этот пример, по умолчанию включает Django 0.96. Однако это изменение изменилось в SDK с Написал Head First Python. Самый маленький фикс, чтобы этот пример работы, чтобы добавить эти строки в simpleform.py до импорта djangoforms:

import os 
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

from google.appengine.dist import use_library 
use_library('django', '0.96') 

Затем создайте файл с именем settings.py в корневой директории приложения (каталог webapp-chapter10-simpleform). В этом случае этот файл может быть пустым. (Как отметили другие комментаторы, есть лучший способ для создания этого файла при использовании рамки Django, но в данном случае нам просто нужно импортировать, чтобы добиться успеха.)


Чтобы обновить этот пример, чтобы использовать Python 2.7 среды выполнения, изменять app.yaml следующим образом:

application: simpleform 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: true 

handlers: 
- url: /static 
    static_dir: static 

- url: /*. 
    script: simpleform.app 

изменения:

  • runtime: теперь python27
  • threadsafe: true
  • Ссылка на simpleform.py теперь представляет собой путь объекта Python к глобальной переменной app.

Затем измените simpleform.py так, что все следующие определения SimpleInput класса заменяется:

app = webapp.WSGIApplication([('/.*', SimpleInput)], debug=True) 

Вместо запуска simpleform.py сценарий, в Python 2.7 импортирует выполнения среды его как модуль, то внешний вид для объекта приложения WSGI в глобальной переменной. Линии, которые мы удалили, выполнили приложение, и теперь это делается для среды выполнения.

Здесь вы можете использовать предложение libraries:, как вы это сделали, чтобы выбрать более новую версию Django, если хотите. Быстрый тест в dev-сервере показывает, что модифицированный пример работает с Django 1.5, который является последней поддерживаемой версией.

+0

Другим аспектом этого примера, который немного устарел, является использование библиотеки 'ext.db'. Если вы хотите продолжить это после завершения этой главы, вам может потребоваться посмотреть библиотеку 'ndb', также включенную в App Engine и описанную в официальных документах App Engine. Однако нет встроенной поддержки 'djangoforms'. https://developers.google.com/appengine/docs/python/ndb/ –

+0

Также стоит отметить: SDK App Engine будет использовать собственную версию Django, а не ту, которую вы установили на своей машине Ubuntu. В SDK включены поддерживаемые версии Django. (Я не знаю, будет ли это в случае будущих версий.) –

+0

Спасибо, Дэн за помощь! Это работает на моей машине. Теперь я могу видеть форму на странице 369. Вы вполне являетесь магом Python + Google App Engine. Кроме того, могу ли я работать в Google, как вы? Еще раз спасибо, сэр за ответ на мой звонок на Python.: D –