Структура проекта для Google App Engine


Я запустил приложение в Google App Engine прямо тогда, когда оно вышло, чтобы играть с технологией и работать над домашним проектом, о котором я думал в течение длительного времени, но никогда не собирался начинать. В результате получается BowlSK. Однако, поскольку он вырос, и были добавлены функции, стало очень сложно держать вещи организованными-в основном из-за того, что это мой первый проект python, и я ничего не знал об этом, пока не начал рабочий.

что у меня есть:

  • Основной уровень содержит:
    • все файлы .py (не знал, как заставить пакеты работать)
    • все .html шаблоны для страниц основного уровня
  • поддиректории:
    • отдельные папки для css, изображений, js и т. д.
    • папки .html шаблоны для типа подкаталога URL-адреса

Пример:
http://www.bowlsk.com/ карты на главную страницу (пакет по умолчанию), шаблон в "index.html"
http://www.bowlsk.com/games/view-series.html?series=7130 maps to ViewSeriesPage (опять же, пакет по умолчанию), шаблон в "games/view-series.html"

Это отвратительно. Как я могу реструктурировать? У меня было 2 идеи:

  • основная папка, содержащая: appdef, индексы, main.py?

    • подпапка для кода. Это мой первый пакет?
    • папку для шаблонов. Иерархии папок будет соответствовать иерархии пакет
    • отдельные подпапки для css, изображений, js и т. д.
  • основная папка, содержащая appdef, индексы, main.py?

    • подпапка для кода + шаблоны. Таким образом, у меня есть класс обработчика прямо рядом с шаблоном, потому что на этом этапе я добавление большого количества функций, поэтому изменения в одном означают изменения в другом. Опять же, нужно ли мне, чтобы это имя папки было первым именем пакета для моих классов? Я бы хотел, чтобы папка была "src", но я не хочу, чтобы мои классы были " src.WhateverPage"

есть ли лучшая практика? С Django 1.0 на горизонте, есть ли что-то, что я могу сделать сейчас, чтобы улучшить свою способность интегрироваться с ним, когда он станет официальным шаблоном GAE? Я бы просто начните пробовать эти вещи и видеть, что кажется лучше, но поддержка рефакторинга pyDev, похоже, не очень хорошо справляется с перемещением пакетов, поэтому, вероятно, будет нетривиальной задачей снова заставить все это работать.

6 118

6 ответов:

во-первых, я бы предложил вам взглянуть на "быстрое развитие с Python, Django и Google App Engine"

GvR описывает общий / стандартный макет проекта на странице 10 своего презентацию.

здесь я опубликую немного измененную версию макета / структуры с этой страницы. Я в значительной степени следую этой схеме сам. Вы также упомянули, что у вас были проблемы с пакетами. Просто убедитесь, что каждая из ваших вложенных папок имеет __init__.py файл. Это нормально, если он пустой.

шаблонные файлы

  • они едва ли различаются между проектами
  • приложение.yaml: направляйте все нестатические запросы main.py
  • main.py: инициализировать приложение и отправить его все запросы

план проекта

  • static/*: статические файлы; обслуживается непосредственно App Engine
  • myapp/*. py: специфичный для приложения код python
    • views.py, models.py, tests.py, __init__.py и еще
  • шаблоны/*.html: шаблоны (или 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)

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/ структура приложения
    • models/*. py
    • просмотров/*. py
    • Тесты/*. py
    • шаблоны/*.формат html: шаблоны

мой обычный макет выглядит примерно так:

  • приложение.и YAML
  • .и YAML
  • request.py -содержит основное приложение WSGI
  • lib
    • __init__.py - общая функциональность, включая базовый класс обработчика запросов
  • контроллеры - содержит все обработчики. запрос.ямл импортирует их.
  • шаблоны
    • все шаблоны django, используемые контроллеры
  • модель
    • все классы модели хранилища данных
  • статический
    • статические файлы (CSS, изображения, и т. д.). Сопоставлено с /статическим приложением.и YAML

Я могу привести примеры того, что мое приложение.ямл, request.py, lib/init.py, и образцы контроллеров выглядят так, если это не ясно.

я реализовал шаблон Google App engine сегодня и проверил его на github. Это примерно так, как описано ником Джонсоном выше (который раньше работал в Google).

по этой ссылке gae-boilerplate

Я думаю, что первый вариант является лучшей практикой. И сделайте папку кода вашим первым пакетом. Проект Rietveld, разработанный Гвидо ван Россумом, является очень хорошей моделью для изучения. Взгляните на него:http://code.google.com/p/rietveld

Что касается Django 1.0, я предлагаю вам начать использовать код магистрали Django вместо GAE, встроенного в порт django. Опять же, посмотрите, как это делается в Ритвельда.

Мне нравится webpy поэтому я принял его в качестве шаблона структуры на Google App Engine.
Мои папки пакетов обычно организованы следующим образом:

app.yaml
application.py
index.yaml
/app
   /config
   /controllers
   /db
   /lib
   /models
   /static
        /docs
        /images
        /javascripts
        /stylesheets
   test/
   utility/
   views/

здесь - Это пример.

Я не совсем в курсе последних лучших практик и т. д., Когда дело доходит до макета кода, но когда я сделал свое первое приложение GAE, я использовал что-то вдоль вашего второго варианта, где код и шаблоны находятся рядом друг с другом.

для этого было две причины - Во - первых, он держал код и шаблон рядом, а во-вторых, у меня был макет структуры каталогов, имитирующий макет веб-сайта, что делает его (для меня) немного проще, тоже помните, где все было.