Структура проекта для Google App Engine
Я начал приложение в Google App Engine сразу, когда он вышел, чтобы играть с технологией и работать над проектом для домашних животных, о котором я долго думал, но так и не начал. Результатом является BowlSK. Тем не менее, по мере того, как он вырос, и добавлены функции, было очень сложно организовать работу - в основном из-за того, что это мой первый проект python, и я ничего не знал об этом, пока не начал работать.
Что у меня:
- Основной уровень содержит:
- все файлы .py(не знали, как создавать пакеты)
- все .html шаблоны для страниц основного уровня
- подкаталоги:
- отдельные папки для css, изображений, js и т.д.
- папки, в которых хранятся шаблоны .html для URL-адресов поддиректории
Пример:
http://www.bowlsk.com/ сопоставляется с HomePage (пакет по умолчанию), шаблон в "index.html"
http://www.bowlsk.com/games/view-series.html?series=7130 сопоставляется с ViewSeriesPage (опять же, по умолчанию), шаблон в "games/view-series.html"
Это противно. Как мне реструктурировать? У меня было 2 идеи:
-
Основная папка, содержащая: appdef, indexes, main.py?
- Подпапка для кода. Это должен быть мой первый пакет?
- Подпапка для шаблонов. Периферия папок будет соответствовать пакетной иерархии.
- Индивидуальные подпапки для css, изображений, js и т.д.
-
Основная папка, содержащая appdef, indexes, main.py?
- Подпапка для шаблонов+. Таким образом, у меня есть класс обработчика рядом с шаблоном, потому что на этом этапе я добавляю множество функций, поэтому модификации одних средних изменений в другом. Опять же, мне нужно, чтобы это имя папки было первым именем пакета для моих классов? Я хотел бы, чтобы папка была "src", но я не хочу, чтобы мои классы были "src.WhateverPage"
Есть ли наилучшая практика? С Django 1.0 на горизонте, есть ли что-то, что я могу сделать сейчас, чтобы улучшить свою способность интегрироваться с ним, когда станет официальным механизмом шаблонов GAE? Я просто начал бы пробовать эти вещи и видеть, что кажется лучше, но поддержка рефакторинга pyDev, похоже, не очень хорошо справляется с ходом пакета, поэтому, вероятно, будет нетривиальная задача, чтобы все это снова работало.
Ответы
Ответ 1
Во-первых, я бы посоветовал вам взглянуть на " Rapid Development с Python, Django и Google App Engine"
GvR описывает общий/стандартный макет проекта на стр. 10 его слайд-презентация.
Здесь я опубликую немного измененную версию макета/структуры с этой страницы. Я в значительной степени следую этой схеме сам. Вы также упомянули, что у вас проблемы с пакетами. Просто убедитесь, что в каждой из ваших подпапок есть файл __init__.py. Это нормально, если его пустой.
Файлы котла
- Они практически не меняются между проектами
- app.yaml: направьте все нестатические запросы на main.py
- main.py: инициализировать приложение и отправлять ему все запросы
План проекта
- static/*: статические файлы; обслуживается непосредственно App Engine
- myapp/*. py: специфичный для приложения код python
- views.py, models.py, tests.py, __init__.py и более
- templates/*. html: templates (или myapp/templates/*. html)
Вот некоторые примеры кода, которые могут также помочь:
main.py
import wsgiref.handlers
from google.appengine.ext import webapp
from myapp.views import *
application = webapp.WSGIApplication([
('/', IndexHandler),
('/foo', FooHandler)
], debug=True)
def main():
wsgiref.handlers.CGIHandler().run(application)
MyApp/views.py
import os
import datetime
import logging
import time
from google.appengine.api import urlfetch
from google.appengine.ext.webapp import template
from google.appengine.api import users
from google.appengine.ext import webapp
from models import *
class IndexHandler(webapp.RequestHandler):
def get(self):
date = "foo"
# Do some processing
template_values = {'data': data }
path = os.path.join(os.path.dirname(__file__) + '/../templates/', 'main.html')
self.response.out.write(template.render(path, template_values))
class FooHandler(webapp.RequestHandler):
def get(self):
#logging.debug("start of handler")
MyApp/models.py
from google.appengine.ext import db
class SampleModel(db.Model):
Я думаю, что этот макет отлично подходит для новых и относительно небольших и средних проектов. Для больших проектов я бы предложил разбить взгляды и модели, чтобы иметь свои собственные подпапки с чем-то вроде:
План проекта
- static/: статические файлы; обслуживается непосредственно App Engine
- JS/*. JS
- изображения /* GIF |. PNG | JPG
- CSS/*. CSS
- myapp/: структура приложения
- модель /*. Р
- вид /*. Ру
- Тесты /*. Ру
- шаблоны /*.html: шаблоны
Ответ 2
Мой обычный макет выглядит примерно так:
- app.yaml
- index.yaml
- request.py - содержит основное приложение WSGI
- Lib
-
__init__.py
- общая функциональность, включая базовый класс обработчика запросов
Контроллеры - - содержат все обработчики. request.yaml импортирует эти данные.
- Шаблоны
- все шаблоны django, используемые контроллерами
- модель
- все классы модели хранилища данных
- Статическая
- статические файлы (css, изображения и т.д.). Отображается/статично по app.yaml
Я могу привести примеры того, что мои app.yaml, request.py, lib/ init.py и образцовые контроллеры выглядят, если это не ясно.
Ответ 3
Сегодня я реализовал схему движка Google и проверил ее на github. Это происходит по строкам, описанным Ником Джонсоном выше (кто работал в Google).
Следуйте по этой ссылке gae-boilerplate
Ответ 4
Я думаю, что первый вариант считается лучшей практикой. И сделайте папку кода вашим первым пакетом. Проект Rietveld, разработанный Guido van Rossum, является очень хорошей моделью для изучения. Посмотрите на это: http://code.google.com/p/rietveld
Что касается Django 1.0, я предлагаю вам начать использовать соединительный код Django вместо GAE, встроенного в порт django. Еще раз посмотрим, как это делается в Rietveld.
Ответ 5
Мне нравится webpy, поэтому я принял его как шаблон для платформы Google App Engine.
Мои папки папок обычно организованы следующим образом:
app.yaml
application.py
index.yaml
/app
/config
/controllers
/db
/lib
/models
/static
/docs
/images
/javascripts
/stylesheets
test/
utility/
views/
Здесь приведен пример.
Ответ 6
Я не совсем в курсе последних лучших практик и так далее, когда дело доходит до макета кода, но когда я сделал свое первое приложение GAE, я использовал что-то по второй опции, где код и шаблоны находятся рядом с Афоризм.
Для этого было две причины: одна, он сохранил код и шаблон рядом, а во-вторых, у меня был макет структуры каталогов, который имитирует веб-сайт, что делает его (для меня) немного легче запоминать, где все было.