Структура проекта для 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 ответов:
во-первых, я бы предложил вам взглянуть на "быстрое развитие с 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, я использовал что-то вдоль вашего второго варианта, где код и шаблоны находятся рядом друг с другом.
для этого было две причины - Во - первых, он держал код и шаблон рядом, а во-вторых, у меня был макет структуры каталогов, имитирующий макет веб-сайта, что делает его (для меня) немного проще, тоже помните, где все было.