Frage

Ich habe direkt nach der Veröffentlichung eine Anwendung in Google App Engine gestartet, um mit der Technologie zu experimentieren und an einem Lieblingsprojekt zu arbeiten, über das ich schon lange nachgedacht hatte, das ich aber nie in Angriff nehmen konnte.Das Ergebnis ist SchüsselSK.Da es jedoch gewachsen ist und Funktionen hinzugefügt wurden, ist es wirklich schwierig geworden, die Dinge zu organisieren – hauptsächlich aufgrund der Tatsache, dass dies mein erstes Python-Projekt ist und ich nichts darüber wusste, bis ich mit der Arbeit begann.

Was ich habe:

  • Hauptebene enthält:
    • alle .py-Dateien (wusste nicht, wie man Pakete zum Laufen bringt)
    • alle .html-Vorlagen für Hauptseiten
  • Unterverzeichnisse:
    • separate Ordner für CSS, Bilder, JS usw.
    • Ordner, die HTML-Vorlagen für URLs vom Typ Unterverzeichnis enthalten

Beispiel:
http://www.bowlsk.com/ Zuordnung zu HomePage (Standardpaket), Vorlage unter „index.html“
http://www.bowlsk.com/games/view-series.html?series=7130 Zuordnung zu ViewSeriesPage (wiederum Standardpaket), Vorlage unter „games/view-series.html“

Es ist fies.Wie restrukturiere ich?Ich hatte 2 Ideen:

  • Hauptordner mit:appdef, Indizes, main.py?

    • Unterordner für Code.Muss das mein erstes Paket sein?
    • Unterordner für Vorlagen.Die Ordnerhierarchie würde der Pakethierarchie entsprechen
    • Individuelle Unterordner für CSS, Bilder, JS usw.
  • Hauptordner mit appdef, Indizes, main.py?

    • Unterordner für Code + Vorlagen.Auf diese Weise habe ich die Handler-Klasse direkt neben der Vorlage, da ich in dieser Phase viele Funktionen hinzufüge, sodass Änderungen an einer Funktion auch Änderungen an der anderen bedeuten.Muss dieser Ordnername auch der erste Paketname für meine Klassen sein?Ich möchte, dass der Ordner „src“ lautet, aber ich möchte nicht, dass meine Klassen „src.WhateverPage“ heißen.

Gibt es eine Best Practice?Da Django 1.0 am Horizont steht, kann ich jetzt etwas tun, um meine Fähigkeit zur Integration zu verbessern, wenn es die offizielle GAE-Templating-Engine wird?Ich würde einfach anfangen, diese Dinge auszuprobieren und zu sehen, was besser erscheint, aber die Refactoring-Unterstützung von pyDev scheint Paketverschiebungen nicht sehr gut zu bewältigen, daher wird es wahrscheinlich eine nicht triviale Aufgabe sein, das alles wieder zum Laufen zu bringen.

War es hilfreich?

Lösung

Zunächst würde ich Ihnen empfehlen, einen Blick auf „Schnelle Entwicklung mit Python, Django und Google App Engine"

GvR beschreibt auf Seite 10 seines Buches ein allgemeines/Standard-Projektlayout Dia-Präsentation.

Hier werde ich eine leicht modifizierte Version des Layouts/der Struktur dieser Seite veröffentlichen.Ich selbst folge diesem Muster weitgehend.Sie haben auch erwähnt, dass Sie Probleme mit Paketen hatten.Stellen Sie einfach sicher, dass jeder Ihrer Unterordner eine __init__.py-Datei hat.Es ist in Ordnung, wenn es leer ist.

Boilerplate-Dateien

  • Diese variieren kaum zwischen den Projekten
  • app.yaml:Leiten Sie alle nicht statischen Anfragen an main.py weiter
  • main.py:App initialisieren und alle Anfragen senden

Projektlayout

  • statisch/*:statische Dateien;direkt von App Engine bereitgestellt
  • myapp/*.py:App-spezifischer Python-Code
    • Views.py, Models.py, Tests.py, __init__.py und mehr
  • templates/*.html:Vorlagen (oder myapp/templates/*.html)

Hier sind einige Codebeispiele, die ebenfalls hilfreich sein können:

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

Ich denke, dass dieses Layout hervorragend für neue und relativ kleine bis mittlere Projekte geeignet ist.Für größere Projekte würde ich vorschlagen, die Ansichten und Modelle aufzuteilen, um eigene Unterordner zu haben, etwa mit:

Projektlayout

  • statisch/:statische Dateien;direkt von App Engine bereitgestellt
    • js/*.js
    • images/*.gif|png|jpg
    • css/*.css
  • meine App/:App-Struktur
    • models/*.py
    • Ansichten/*.py
    • tests/*.py
    • templates/*.html:Vorlagen

Andere Tipps

Mein übliches Layout sieht in etwa so aus:

  • app.yaml
  • index.yaml
  • request.py – enthält die grundlegende WSGI-App
  • lib
    • __init__.py - allgemeine Funktionalität, einschließlich einer Basisklasse für den Anforderungshandler
  • Controller – enthält alle Handler.request.yaml importiert diese.
  • Vorlagen
    • alle Django-Vorlagen, die von den Controllern verwendet werden
  • Modell
    • alle Datenspeichermodellklassen
  • statisch
    • Statische Dateien (CSS, Bilder usw.).Von app.yaml /static zugeordnet

Ich kann Beispiele dafür bereitstellen, was meine app.yaml, request.py, lib/drin.py und Beispiel-Controller sehen aus, falls dies nicht klar ist.

Ich habe heute ein Google App Engine-Boilerplate implementiert und es auf Github überprüft.Dies entspricht dem oben von Nick Johnson beschriebenen Ansatz (der früher für Google arbeitete).

Folge diesem Link gae-boilerplate

Ich denke, die erste Option gilt als die beste Vorgehensweise.Und machen Sie den Codeordner zu Ihrem ersten Paket.Das von Guido van Rossum entwickelte Rietveld-Projekt ist ein sehr gutes Modell, von dem man lernen kann.Schau es dir an: http://code.google.com/p/rietveld

Im Hinblick auf Django 1.0 schlage ich vor, dass Sie beginnen, den Django-Trunk-Code anstelle des in GAE integrierten Django-Ports zu verwenden.Schauen Sie sich noch einmal an, wie es in Rietveld gemacht wird.

Ich mag webpy Daher habe ich es als Template-Framework für Google App Engine übernommen.
Meine Paketordner sind normalerweise wie folgt organisiert:

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

Hier ist ein Beispiel.

Ich bin nicht ganz auf dem neuesten Stand der Best Practices usw., wenn es um das Code-Layout geht, aber als ich meine erste GAE-Anwendung erstellt habe, habe ich etwas von Ihrer zweiten Option verwendet, bei der Code und Vorlagen nebeneinander liegen.

Dafür gab es zwei Gründe: Erstens blieben der Code und die Vorlage in der Nähe, und zweitens hatte ich das Layout der Verzeichnisstruktur so gestaltet, dass es dem der Website nachempfunden war, was es (für mich) etwas einfacher machte, mich daran zu erinnern, wo sich alles befand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top