Структура проекта для 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, я использовал что-то по второй опции, где код и шаблоны находятся рядом с Афоризм.

Для этого было две причины: одна, он сохранил код и шаблон рядом, а во-вторых, у меня был макет структуры каталогов, который имитирует веб-сайт, что делает его (для меня) немного легче запоминать, где все было.