โครงสร้างโครงการสำหรับ Google App Engine


119

ฉันเริ่มต้นแอปพลิเคชันใน Google App Engine ทันทีเพื่อเล่นกับเทคโนโลยีและทำงานในโครงการสัตว์เลี้ยงที่ฉันคิดมานาน แต่ไม่เคยได้เริ่มต้นเลย ผลที่ได้คือBowlSK อย่างไรก็ตามในขณะที่มันเติบโตขึ้นและมีการเพิ่มฟีเจอร์เข้ามามันทำให้การจัดระเบียบสิ่งต่างๆเป็นเรื่องยากมากโดยส่วนใหญ่เป็นเพราะนี่เป็นโปรเจ็กต์ python แรกของฉันและฉันไม่รู้อะไรเลยจนกระทั่งฉันเริ่มทำงาน

สิ่งที่ฉันมี:

  • ระดับหลักประกอบด้วย:
    • ไฟล์. py ทั้งหมด (ไม่ทราบวิธีทำให้แพ็คเกจทำงาน)
    • เทมเพลต. html ทั้งหมดสำหรับเพจระดับหลัก
  • ไดเรกทอรีย่อย:
    • แยกโฟลเดอร์สำหรับ css, รูปภาพ, js ฯลฯ
    • โฟลเดอร์ที่เก็บเทมเพลต. html สำหรับ URL ประเภท subdirecty

ตัวอย่าง:
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 ดูเหมือนจะไม่สามารถจัดการกับการเคลื่อนย้ายแพ็คเกจได้ดีนักดังนั้นจึงน่าจะเป็นงานที่ไม่สำคัญที่จะทำให้ทั้งหมดนี้ทำงานได้อีกครั้ง

คำตอบ:


104

ก่อนอื่นฉันขอแนะนำให้คุณดู " การพัฒนาอย่างรวดเร็วด้วย Python, Django และ Google App Engine "

GvR อธิบายรูปแบบโครงการทั่วไป / มาตรฐานในหน้า 10 ของเขานำเสนอภาพนิ่ง

ที่นี่ฉันจะโพสต์รูปแบบ / โครงสร้างที่ปรับเปลี่ยนเล็กน้อยจากหน้านั้น ฉันทำตามรูปแบบนี้ด้วยตัวเอง คุณยังบอกว่าคุณมีปัญหากับแพ็คเกจ ตรวจสอบให้แน่ใจว่าแต่ละโฟลเดอร์ย่อยของคุณมีไฟล์ __init__.py ถ้าว่างก็โอเค

ไฟล์ Boilerplate

  • สิ่งเหล่านี้แทบจะไม่แตกต่างกันระหว่างโครงการ
  • app.yaml: ส่งคำขอแบบไม่คงที่ทั้งหมดไปที่ main.py
  • main.py: เริ่มต้นแอปและส่งคำขอทั้งหมด

เค้าโครงโครงการ

  • คงที่ / *: ไฟล์คงที่; ให้บริการโดยตรงโดย App Engine
  • myapp / *. py: รหัสหลามเฉพาะแอป
    • views.py, models.py, tests.py, __init__.py และอื่น ๆ
  • แม่แบบ / *. html: แม่แบบ (หรือ myapp / แม่แบบ / *. 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)

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

ฉันคิดว่าเค้าโครงนี้ใช้งานได้ดีสำหรับโครงการใหม่และค่อนข้างเล็กถึงขนาดกลาง สำหรับโปรเจ็กต์ขนาดใหญ่ฉันขอแนะนำให้เลิกมุมมองและโมเดลเพื่อมีโฟลเดอร์ย่อยของตัวเองด้วยสิ่งต่างๆเช่น:

เค้าโครงโครงการ

  • คง /: ไฟล์คงที่; ให้บริการโดยตรงโดย App Engine
    • js / *. js
    • ภาพ / * GIF. | PNG | JPG
    • CSS / *. CSS
  • myapp /: โครงสร้างแอป
    • รุ่น / *. PY
    • มุมมอง / *. PY
    • การทดสอบ / *. PY
    • เทมเพลต / *. html: แม่แบบ

2
เมื่อคุณได้รับการดู 20 หรือ 30 ครั้งและมี "การดู" สองรายการที่จัดการโพสต์แล้วเปลี่ยนเส้นทางคุณจะแยกออกเป็นไฟล์แยกกันหรือไม่ บางทีใน myapp / views / view1.py, myapp / views / view2.py? หรือว่าพื้นหลัง Java / C # ของฉันเท่านั้นที่แสดงผ่าน?
Chris Marasti-Georg

1
ฉันแก้ไขโพสต์เพื่อกล่าวถึงโครงการขนาดใหญ่ ฉันหวังว่าจะช่วยได้ โปรดทราบว่าในบางกรณีอาจเป็นการเรียกร้องการตัดสิน
fuentesjr

1
ฉันมีเลย์เอาต์ที่คล้ายกัน แต่ใช้ "app" แทน "myapp"
Alexander Kojevnikov

ใครช่วยให้ตัวอย่างการทำงานสำหรับเค้าโครงโครงการดังกล่าวได้หรือไม่? ฉันยังไม่พบสิ่งที่เหมาะสม
herrherr

16

เค้าโครงปกติของฉันมีลักษณะดังนี้:

  • app.yaml
  • index.yaml
  • request.py - มีแอป WSGI พื้นฐาน
  • lib
    • __init__.py - ฟังก์ชันทั่วไปรวมถึงคลาสพื้นฐานของตัวจัดการคำขอ
  • ตัวควบคุม - มีตัวจัดการทั้งหมด request.yaml นำเข้าสิ่งเหล่านี้
  • แม่แบบ
    • เทมเพลต django ทั้งหมดที่ใช้โดยคอนโทรลเลอร์
  • แบบ
    • คลาสโมเดลที่เก็บข้อมูลทั้งหมด
  • คงที่
    • ไฟล์แบบคงที่ (css, รูปภาพ, ฯลฯ ) แมปกับ / คงโดย app.yaml

ฉันสามารถให้ตัวอย่างว่า app.yaml, request.py, lib / init .py และตัวควบคุมตัวอย่างของฉันมีลักษณะอย่างไรหากยังไม่ชัดเจน


5
สวัสดีนิคโปรดทำ! ฉันจำเป็นต้องเปรียบเทียบระหว่างโซลูชันต่างๆด้วย :) ขอบคุณ!
Hoang Pham

2
สวัสดีฉันต้องการดูตัวอย่างด้วยถ้าเป็นไปได้ ขอบคุณ

11

วันนี้ฉันติดตั้งโปรแกรมสำเร็จรูปของเครื่องยนต์แอป Google และตรวจสอบบน github นี่เป็นไปตามบรรทัดที่ Nick Johnson อธิบายไว้ข้างต้น (ซึ่งเคยทำงานให้กับ Google)

ตามลิงค์นี้gae-boilerplate


1
คุณช่วยขยายคำตอบนี้หน่อยได้ไหม ลิงก์ github นั้นดีและดีสำหรับการสนับสนุนคำตอบของคุณ แต่อย่างน้อยคุณควรพยายามแนะนำมันสักหน่อย
Shog9

1
README.md ในรูท gae-boilerplate อธิบายทั้งหมด github.com/droot/gae-boilerplate/blob/master/README.md
Ed Randall

7

ฉันคิดว่าตัวเลือกแรกถือเป็นแนวทางปฏิบัติที่ดีที่สุด และทำให้โฟลเดอร์รหัสเป็นแพ็คเกจแรกของคุณ โครงการ Rietveld พัฒนาโดย Guido van Rossum เป็นรูปแบบที่ดีมากในการเรียนรู้ ดูได้ที่: http://code.google.com/p/rietveld

สำหรับ Django 1.0 ฉันขอแนะนำให้คุณเริ่มใช้ Django trunk code แทน GAE ที่สร้างขึ้นในพอร์ต django ดูอีกครั้งว่าทำอย่างไรใน Rietveld


เหตุผลที่ดีที่สุดในการใช้ Django คืออะไร? ฉันใช้ WebApp และให้บริการฉันได้ดี นอกจากนี้ฉันหวังว่า Google จะนำเสนอการผสานรวมที่ดีขึ้นของทั้งสองในเร็ว ๆ นี้ ข้อเสียของการใช้พอร์ต Django ในตัวคืออะไร?
jamtoday

3

ฉันชอบwebpyจึงนำมาใช้เป็นเฟรมเวิร์กเทมเพลตบน Google App Engine
โดยทั่วไปโฟลเดอร์แพ็คเกจของฉันจะถูกจัดระเบียบดังนี้:

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

นี่คือตัวอย่าง


1

ฉันไม่ได้รับข้อมูลล่าสุดเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดล่าสุดและอื่น ๆ เกี่ยวกับการจัดวางโค้ด แต่เมื่อฉันใช้แอปพลิเคชัน GAE ครั้งแรกฉันใช้บางอย่างร่วมกับตัวเลือกที่สองของคุณโดยที่โค้ดและเทมเพลตจะอยู่ติดกัน

มีสองเหตุผลสำหรับสิ่งนี้คือหนึ่งมันเก็บรหัสและเทมเพลตไว้ใกล้ ๆ และประการที่สองฉันมีเค้าโครงโครงสร้างไดเรกทอรีที่เลียนแบบเว็บไซต์ทำให้ (สำหรับฉัน) ง่ายขึ้นเล็กน้อยจำได้ว่าทุกอย่างอยู่ที่ไหน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.