Struktur proyek untuk Google App Engine

119

Saya memulai aplikasi di Google App Engine tepat saat aplikasi itu diluncurkan, untuk bermain dengan teknologi dan mengerjakan proyek hewan peliharaan yang telah lama saya pikirkan tetapi tidak pernah sempat saya mulai. Hasilnya adalah BowlSK . Namun, seiring perkembangannya, dan fitur telah ditambahkan, menjadi sangat sulit untuk mengatur semuanya - terutama karena fakta bahwa ini adalah proyek python pertama saya, dan saya tidak tahu apa-apa tentang itu sampai saya mulai bekerja.

Apa yang saya punya:

  • Level Utama berisi:
    • semua file .py (tidak tahu cara membuat paket berfungsi)
    • semua template .html untuk halaman tingkat utama
  • Subdirektori:
    • folder terpisah untuk css, gambar, js, dll.
    • folder yang menyimpan template .html untuk url jenis subdirektori

Contoh:
http://www.bowlsk.com/ maps to HomePage (paket default), template di "index.html"
http://www.bowlsk.com/games/view-series.html?series=7130 dipetakan ke ViewSeriesPage (sekali lagi, paket default), template di "games / view-series.html"

Itu jorok. Bagaimana cara saya merestrukturisasi? Saya punya 2 ide:

  • Folder Utama berisi: appdef, indexes, main.py?

    • Subfolder untuk kode. Apakah ini harus menjadi paket pertama saya?
    • Subfolder untuk template. Hirarki folder akan cocok dengan heirarki paket
    • Subfolder individual untuk css, gambar, js, dll.
  • Folder Utama berisi appdef, indexes, main.py?

    • Subfolder untuk kode + template. Dengan cara ini saya memiliki kelas penangan tepat di sebelah template, karena dalam tahap ini, saya menambahkan banyak fitur, jadi modifikasi pada satu berarti modifikasi ke yang lain. Sekali lagi, apakah saya harus menjadikan nama folder ini sebagai nama paket pertama untuk kelas saya? Saya ingin foldernya menjadi "src", tetapi saya tidak ingin kelas saya menjadi "src.WhateverPage"

Apakah ada praktik terbaik? Dengan Django 1.0 di depan mata, adakah sesuatu yang dapat saya lakukan sekarang untuk meningkatkan kemampuan saya untuk mengintegrasikannya ketika itu menjadi mesin template GAE resmi? Saya hanya akan mulai mencoba hal-hal ini, dan melihat mana yang tampak lebih baik, tetapi dukungan refactoring pyDev tampaknya tidak menangani perpindahan paket dengan sangat baik, jadi kemungkinan akan menjadi tugas yang tidak sepele untuk membuat semua ini berfungsi lagi.

Chris Marasti-Georg
sumber

Jawaban:

104

Pertama, saya sarankan Anda melihat " Pengembangan Cepat dengan Python, Django, dan Google App Engine "

GvR menjelaskan tata letak proyek umum / standar pada halaman 10 presentasi slide- nya .

Di sini saya akan memposting versi tata letak / struktur yang sedikit dimodifikasi dari halaman itu. Saya sendiri cukup banyak mengikuti pola ini. Anda juga menyebutkan bahwa Anda mengalami masalah dengan paket. Pastikan saja setiap sub folder Anda memiliki file __init__.py. Tidak apa-apa jika kosong.

File Boilerplate

  • Ini hampir tidak berbeda antar proyek
  • app.yaml: mengarahkan semua permintaan non-statis ke main.py
  • main.py: menginisialisasi aplikasi dan mengirimkan semua permintaan

Tata letak proyek

  • statis / *: file statis; disajikan langsung oleh App Engine
  • myapp / *. py: kode python khusus aplikasi
    • views.py, models.py, tests.py, __init__.py, dan banyak lagi
  • templates / *. html: templates (atau myapp / templates / *. html)

Berikut beberapa contoh kode yang mungkin membantu juga:

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

Saya pikir tata letak ini berfungsi dengan baik untuk proyek baru dan relatif kecil hingga menengah. Untuk proyek yang lebih besar, saya sarankan untuk memecah tampilan dan model agar memiliki sub-folder sendiri dengan sesuatu seperti:

Tata letak proyek

  • statis /: file statis; disajikan langsung oleh App Engine
    • js / *. js
    • gambar / *. gif | png | jpg
    • css / *. css
  • myapp /: struktur aplikasi
    • model / *. py
    • tampilan / *. py
    • tes / *. py
    • template / *. html: template
fuentesjr
sumber
2
Setelah Anda mendapatkan 20 atau 30 tampilan, dan beberapa "tampilan" yang hanya menangani posting dan kemudian mengarahkan ulang, apakah Anda memecahnya menjadi file terpisah? Mungkin di myapp / views / view1.py, myapp / views / view2.py? Atau hanya latar belakang Java / C # saya yang terlihat?
Chris Marasti-Georg
1
Saya mengedit posting saya untuk menangani proyek yang lebih besar. Saya harap itu membantu. Ingatlah bahwa dalam beberapa kasus, ini akan menjadi keputusan pengadilan.
fuentesjr
1
Saya memiliki tata letak yang mirip, tetapi menggunakan "app", bukan "myapp".
Alexander Kojevnikov
Bisakah seseorang memberikan contoh kerja untuk tata letak proyek seperti itu? Saya belum menemukan yang cocok.
Herrherr
16

Tata letak saya yang biasa terlihat seperti ini:

  • app.yaml
  • index.yaml
  • request.py - berisi aplikasi WSGI dasar
  • lib
    • __init__.py - fungsionalitas umum, termasuk kelas dasar penangan permintaan
  • pengontrol - berisi semua penangan. request.yaml mengimpor ini.
  • template
    • semua template django, digunakan oleh pengontrol
  • model
    • semua kelas model datastore
  • statis
    • file statis (css, gambar, dll). Dipetakan ke / statis oleh app.yaml

Saya dapat memberikan contoh seperti apa tampilan app.yaml, request.py, lib / init .py, dan contoh pengontrol saya, jika ini tidak jelas.

Nick Johnson
sumber
5
Hai Nick, tolong lakukan! Saya perlu membandingkan antara solusi yang berbeda juga :) Terima kasih!
Hoang Pham
2
Hai, saya juga ingin melihat beberapa contoh jika memungkinkan. Terima kasih.
11

Saya menerapkan boilerplate mesin aplikasi google hari ini dan memeriksanya di github. Ini seperti yang dijelaskan oleh Nick Johnson di atas (yang dulu bekerja untuk Google).

Ikuti tautan ini gae-boilerplate

sunil
sumber
1
Bisakah Anda memperluas jawaban ini sedikit? Tautan github semuanya baik dan bagus untuk mendukung jawaban Anda, tetapi Anda setidaknya harus mencoba memperkenalkannya sedikit.
Shog9
1
README.md di root gae-boilerplate menjelaskan semuanya. github.com/droot/gae-boilerplate/blob/master/README.md
Ed Randall
7

Saya pikir opsi pertama dianggap sebagai praktik terbaik. Dan jadikan folder kode sebagai paket pertama Anda. Proyek Rietveld yang dikembangkan oleh Guido van Rossum adalah model yang sangat bagus untuk dipelajari. Silakan lihat di: http://code.google.com/p/rietveld

Berkenaan dengan Django 1.0, saya sarankan Anda mulai menggunakan kode batang Django alih-alih GAE yang dibangun pada port django. Sekali lagi, lihat bagaimana ini dilakukan di Rietveld.

Jiayao Yu
sumber
Apa alasan terbaik menggunakan Django? Saya telah menggunakan WebApp, dan telah melayani saya dengan baik. Selain itu, saya berharap Google akan menawarkan integrasi yang lebih baik dari keduanya dalam waktu dekat. Apa kerugian menggunakan pelabuhan dibangun di Django?
jamtoday
3

Saya suka webpy jadi saya telah mengadopsinya sebagai kerangka kerja template di Google App Engine.
Folder paket saya biasanya diatur seperti ini:

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

Berikut ini contohnya.

systempuntoout
sumber
1

Saya tidak sepenuhnya mengikuti praktik terbaik terbaru, dan lain-lain dalam hal tata letak kode, tetapi ketika saya melakukan aplikasi GAE pertama saya, saya menggunakan sesuatu di sepanjang opsi kedua Anda, di mana kode dan templat berada di samping satu sama lain.

Ada dua alasan untuk ini - satu, itu membuat kode dan templat tetap dekat, dan kedua, saya memiliki tata letak struktur direktori yang meniru situs web - membuatnya (bagi saya) sedikit lebih mudah juga mengingat di mana semuanya berada.

Dominic Eidson
sumber