Структура проекта для Google App Engine - PullRequest
119 голосов
/ 07 сентября 2008

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

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

  • Основной уровень содержит:
    • все файлы .py (не знал, как заставить работать пакеты)
    • все шаблоны .html для страниц основного уровня
  • подкаталоги:
    • отдельные папки для css, images, 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?

    • Подпапка для кода. Это должно быть моей первой посылкой?
    • Подпапка для шаблонов. Папка heirarchy будет соответствовать пакету heirarchy
    • Отдельные подпапки для css, images, js и т. Д.
  • Основная папка, содержащая appdef, indexes, main.py?

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

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

Ответы [ 6 ]

104 голосов
/ 16 сентября 2008

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

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

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

Файлы Boilerplate

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

План проекта

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

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):

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

План проекта

  • статические /: статические файлы; обслуживается непосредственно App Engine
    • JS / *. JS
    • изображения / * GIF |. PNG | JPG
    • CSS / *. CSS
  • myapp /: структура приложения
    • модели / *. Py
    • вид / *. Py
    • Тесты / *. Py
    • templates / *. Html: templates
16 голосов
/ 30 сентября 2008

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

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

Я могу привести примеры того, как выглядят мои app.yaml, request.py, lib / init .py и примеры контроллеров, если это не ясно.

11 голосов
/ 21 сентября 2012

Сегодня я реализовал шаблонный движок приложения Google и проверил его на github. Это в духе описанного выше Ника Джонсона (который работал на Google).

Перейдите по этой ссылке Газовая табличка

7 голосов
/ 16 сентября 2008

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

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

3 голосов
/ 24 июня 2010

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

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

Здесь является примером.

1 голос
/ 07 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...