Google App Engine için proje yapısı


119

Ortaya çıktığında, teknolojiyle oynamak ve uzun zamandır düşündüğüm ama hiç başlamamış olduğum bir evcil hayvan projesi üzerinde çalışmak için Google App Engine'de bir uygulama başlattım. Sonuç BowlSK'dır . Bununla birlikte, büyüdükçe ve özellikler eklendikçe, işleri düzenli tutmak gerçekten zorlaştı - esas olarak bunun benim ilk python projem olması ve çalışmaya başlayana kadar bu konuda hiçbir şey bilmiyordum.

Neyim var:

  • Ana Seviye şunları içerir:
    • tüm .py dosyaları (paketlerin nasıl çalıştırılacağını bilmiyordum)
    • ana düzey sayfalar için tüm .html şablonları
  • Alt Dizinler:
    • css, resimler, js vb. için ayrı klasörler
    • alt dizin türü url'ler için .html şablonlarını tutan klasörler

Örnek:
http://www.bowlsk.com/ , HomePage (varsayılan paket) ile eşleşir, "index.html"
adresindeki şablon http://www.bowlsk.com/games/view-series.html?series=7130 , ViewSeriesPage (yine varsayılan paket), "games / view-series.html" adresindeki şablon

O iğrenç. Nasıl yeniden yapılandırırım? 2 fikrim vardı:

  • Ana Klasör şunları içerir: appdef, indexes, main.py?

    • Kod için alt klasör. Bu benim ilk paketim olmak zorunda mı?
    • Şablonlar için alt klasör. Klasör hiyerarşisi, paket hiyerarşisiyle eşleşir
    • Css, images, js, vb. İçin ayrı alt klasörler.
  • Appdef, indexes, main.py? İçeren Ana Klasör?

    • Kod + şablonlar için alt klasör. Bu şekilde, şablonun hemen yanında işleyici sınıfım var, çünkü bu aşamada, birçok özellik ekliyorum, bu yüzden birinde yapılan değişiklikler diğerine yapılan değişiklikler anlamına gelir. Yine, bu klasör adının sınıflarım için ilk paket adı olması gerekiyor mu? Klasörün "src" olmasını istiyorum, ancak sınıflarımın "src.WhateverPage" olmasını istemiyorum

Bir en iyi uygulama var mı? Ufukta Django 1.0 ile, resmi GAE şablon motoru haline geldiğinde onunla bütünleşme yeteneğimi geliştirmek için şimdi yapabileceğim bir şey var mı? Basitçe bunları denemeye ve hangisinin daha iyi göründüğünü görmeye başlayacaktım, ancak pyDev'in yeniden düzenleme desteği paket hareketlerini pek iyi karşılamıyor gibi görünüyor, bu yüzden tüm bunların yeniden çalışmasını sağlamak muhtemelen önemsiz bir görev olacak.

Yanıtlar:


104

Birincisi, sana "bir göz öneririm Python, Django, ve Google App Engine Rapid Development "

GvR, slayt sunumunun 10. sayfasında genel / standart bir proje düzenini açıklamaktadır .

Burada, bu sayfadan düzen / yapının biraz değiştirilmiş bir versiyonunu yayınlayacağım. Ben de bu kalıbı kendim takip ediyorum. Ayrıca paketlerle ilgili sorun yaşadığından da bahsetmiştin. Alt klasörlerinizin her birinde bir __init__.py dosyası olduğundan emin olun. Boşsa sorun değil.

Klişe dosyaları

  • Bunlar projeler arasında neredeyse hiç değişmiyor
  • app.yaml: statik olmayan tüm istekleri main.py'ye yönlendirin
  • main.py: uygulamayı başlatın ve tüm istekleri gönderin

Proje düzeni

  • statik / *: statik dosyalar; doğrudan App Engine tarafından sunulur
  • myapp / *. py: uygulamaya özel python kodu
    • views.py, models.py, tests.py, __init__.py ve daha fazlası
  • templates / *. html: templates (veya myapp / templates / *. html)

İşte yardımcı olabilecek bazı kod örnekleri:

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

Bence bu düzen yeni ve nispeten küçük ila orta ölçekli projeler için harika çalışıyor. Daha büyük projeler için, aşağıdaki gibi bir şeyle kendi alt klasörlerine sahip olmak için görünümleri ve modelleri ayırmayı öneririm:

Proje düzeni

  • statik /: statik dosyalar; doğrudan App Engine tarafından sunulur
    • js / *. js
    • images / * gif |. png | jpg
    • css / *. css
  • uygulamam /: uygulama yapısı
    • Modeller / *. py
    • görünümler / *. py
    • Testler / *. py
    • şablonlar / *. html: şablonlar

2
20 veya 30 görünüme ulaştığınızda ve yalnızca gönderileri işleyip yeniden yönlendiren bir çift "görünüm" elde ettiğinizde, bunları ayrı dosyalara böler misiniz? Belki uygulamam / views / view1.py, uygulamam / views / view2.py'de? Yoksa sadece Java / C # arka planımın görünmesi mi?
Chris Marasti-Georg

1
Gönderimi daha büyük projeleri ele alacak şekilde düzenledim. Umarım bu yardımcı olur. Bazı durumlarda bunun bir karar çağrısı olacağını unutmayın.
fuentesjr

1
Benzer bir düzenim var, ancak "uygulamam" yerine "uygulama" kullanıyorum.
Alexander Kojevnikov

Birisi böyle bir proje düzeni için çalışan bir örnek verebilir mi? Uygun bir şey bulamadım.
herrherr

16

Her zamanki düzenim şuna benzer:

  • app.yaml
  • index.yaml
  • request.py - temel WSGI uygulamasını içerir
  • lib
    • __init__.py - bir istek işleyici temel sınıfı dahil olmak üzere ortak işlevsellik
  • denetleyiciler - tüm işleyicileri içerir. request.yaml bunları içe aktarır.
  • şablonları
    • denetleyiciler tarafından kullanılan tüm django şablonları
  • model
    • tüm veri deposu modeli sınıfları
  • statik
    • statik dosyalar (css, resimler vb.). App.yaml tarafından / statik olarak eşlendi

Açık değilse app.yaml, request.py, lib / init .py ve örnek denetleyicilerimin neye benzediğine dair örnekler verebilirim .


5
Merhaba Nick, lütfen yap! Farklı çözümler arasında da karşılaştırma yapmam gerekiyor :) Teşekkürler!
Hoang Pham

2
Merhaba, mümkünse bazı örnekler de görmek isterim. Teşekkürler.

11

Bugün bir google uygulama motoru standart şablonu uyguladım ve github'da kontrol ettim. Bu, yukarıda (Google için çalışan) Nick Johnson tarafından açıklanan çizgidedir.

Bu bağlantıyı takip et gae-boilerplate


1
Bu cevabı biraz açabilir misin? Github bağlantısı cevabınızı desteklemek için iyi ve iyidir, ancak en azından biraz tanıtmaya çalışmalısınız.
Shog9

1
Gae-boilerplate kökündeki README.md her şeyi açıklıyor. github.com/droot/gae-boilerplate/blob/master/README.md
Ed Randall 13

7

İlk seçeneğin en iyi uygulama olarak kabul edildiğini düşünüyorum. Ve kod klasörünü ilk paketiniz yapın. Guido van Rossum tarafından geliştirilen Rietveld projesi, öğrenmek için çok iyi bir model. Şuna bir bakın: http://code.google.com/p/rietveld

Django 1.0 ile ilgili olarak, django bağlantı noktası yerleşik GAE yerine Django ana hat kodunu kullanmaya başlamanızı öneririm. Rietveld'de nasıl yapıldığına bir kez daha bakın.


Django'yu kullanmanın en iyi nedeni nedir? WebApp kullanıyorum ve bana gayet iyi hizmet ediyor. Ayrıca, Google'ın yakın zamanda bu ikisinin daha iyi bir entegrasyonunu sunacağını umuyorum. Yerleşik Django bağlantı noktasını kullanmanın dezavantajı nedir?
jamtoday

3

Gibi webpy Google App Engine üzerinde çerçeveyi templating olarak kabul ettik böylece.
Paket klasörlerim genellikle şu şekilde düzenlenir:

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

İşte bir örnek.


1

Kod düzeni söz konusu olduğunda, en son en iyi uygulamalar hakkında tam olarak güncel bilgi sahibi değilim, ancak ilk GAE uygulamamı yaptığımda, ikinci seçeneğinizde kod ve şablonların yan yana olduğu bir şey kullandım.

Bunun iki nedeni vardı - birincisi, kodu ve şablonu yakınınızda tuttu ve ikincisi, dizin yapısı düzeninin web sitesininkini taklit etmesini sağladım - (benim için) her şeyin nerede olduğunu hatırlamak da biraz daha kolay.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.