Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top