Структура проекта для Google App Engine
-
09-06-2019 - |
Вопрос
Я запустил приложение в Google App Engine сразу после его выхода, чтобы поэкспериментировать с технологией и поработать над любимым проектом, о котором я давно думал, но так и не успел начать.Результат БоулСК.Однако по мере того, как он рос и добавлялись новые функции, стало очень сложно поддерживать порядок — в основном из-за того, что это мой первый проект на 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, индексы, main.py?
- Подпапка для кода.Это должна быть моя первая посылка?
- Подпапка для шаблонов.Иерархия папок будет соответствовать иерархии пакетов.
- Отдельные подпапки для css, изображений, js и т. д.
Основная папка, содержащая appdef, индексы, main.py?
- Подпапка для кода + шаблонов.Таким образом, у меня есть класс-обработчик рядом с шаблоном, потому что на этом этапе я добавляю множество функций, поэтому изменения в одном означают изменения в другом.Опять же, нужно ли мне, чтобы это имя папки было первым именем пакета для моих классов?Я бы хотел, чтобы папка была «src», но я не хочу, чтобы мои классы были «src.WhateverPage».
Есть ли передовая практика?Учитывая, что Django 1.0 уже на горизонте, могу ли я что-нибудь сделать сейчас, чтобы улучшить свои возможности интеграции с ним, когда он станет официальным механизмом шаблонов GAE?Я бы просто начал пробовать эти вещи и смотреть, что кажется лучше, но поддержка рефакторинга pyDev, похоже, не очень хорошо справляется с перемещением пакетов, поэтому, вероятно, будет нетривиальной задачей заставить все это снова работать.
Решение
Для начала я бы посоветовал вам взглянуть на "Быстрая разработка с использованием Python, Django и Google App Engine"
GvR описывает общий/стандартный макет проекта на странице 10 своего слайд-презентация.
Здесь я опубликую слегка измененную версию макета/структуры с этой страницы.Я сам во многом следую этой схеме.Вы также упомянули, что у вас были проблемы с пакетами.Просто убедитесь, что в каждой из ваших подпапок есть файл __init__.py.Ничего страшного, если там пусто.
Шаблонные файлы
- Они практически не различаются в зависимости от проекта.
- приложение.yaml:направьте все нестатические запросы на main.py
- основной.py:инициализировать приложение и отправлять ему все запросы
Планировка проекта
- статический/*:статические файлы;обслуживается непосредственно App Engine
- мое приложение/*.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)
мое приложение/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")
мое приложение/models.py
from google.appengine.ext import db
class SampleModel(db.Model):
Я думаю, что этот макет отлично подходит для новых и относительно небольших и средних проектов.Для более крупных проектов я бы предложил разбить представления и модели на отдельные подпапки, например:
Планировка проекта
- статический/:статические файлы;обслуживается непосредственно App Engine
- js/*.js
- изображения/*.gif|png|jpg
- css/*.css
- мое приложение/:структура приложения
- модели/*.py
- просмотры/*.py
- тесты/*.py
- шаблоны/*.html:шаблоны
Другие советы
Мой обычный макет выглядит примерно так:
- app.yaml
- index.yaml
- request.py — содержит базовое приложение WSGI.
- библиотека
__init__.py
- общая функциональность, включая базовый класс обработчика запросов
- контроллеры — содержит все обработчики.request.yaml импортирует их.
- шаблоны
- все шаблоны django, используемые контроллерами
- модель
- все классы модели хранилища данных
- статический
- статические файлы (css, изображения и т. д.).Сопоставлено с /static с помощью app.yaml
Я могу предоставить примеры того, что мои app.yaml, request.py, lib/в этом.py, и как выглядят примеры контроллеров, если это не ясно.
Сегодня я реализовал шаблон движка приложений Google и проверил его на github.Это похоже на то, что описал выше Ник Джонсон (который раньше работал в Google).
Перейдите по этой ссылке gae-шаблон
Я думаю, что первый вариант считается лучшей практикой.И сделайте папку с кодом своим первым пакетом.Проект Ритвельда, разработанный Гвидо ван Россумом, является очень хорошей моделью для обучения.Посмотри на это: http://code.google.com/p/rietveld
Что касается Django 1.0, я предлагаю вам начать использовать код магистрали Django вместо встроенного порта GAE в django.Опять же, посмотрите, как это сделано в Ритвельде.
Мне нравится вебпи поэтому я принял его в качестве платформы шаблонов в Google App Engine.
Папки моих пакетов обычно организованы следующим образом:
app.yaml
application.py
index.yaml
/app
/config
/controllers
/db
/lib
/models
/static
/docs
/images
/javascripts
/stylesheets
test/
utility/
views/
Здесь это пример.
Я не совсем в курсе последних лучших практик и т. д., когда дело доходит до макета кода, но когда я создавал свое первое приложение GAE, я использовал что-то похожее на ваш второй вариант, где код и шаблоны находятся рядом друг с другом.
Для этого было две причины: во-первых, код и шаблон хранились поблизости, а во-вторых, у меня была структура каталогов, имитирующая структуру веб-сайта, что делало (для меня) немного проще запомнить, где что находится.