Cấu trúc dự án cho Google App Engine


119

Tôi đã bắt đầu một ứng dụng trong Google App Engine ngay khi nó ra mắt, để chơi với công nghệ và làm việc trong một dự án thú cưng mà tôi đã nghĩ đến trong một thời gian dài nhưng chưa bao giờ bắt đầu. Kết quả là BowlSK . Tuy nhiên, khi nó đã phát triển và các tính năng đã được thêm vào, thật sự rất khó để giữ mọi thứ có tổ chức - chủ yếu là do đây là dự án python đầu tiên của tôi và tôi không biết gì về nó cho đến khi bắt đầu làm việc.

Tôi có gì:

  • Cấp chính bao gồm:
    • tất cả các tệp .py (không biết cách làm cho các gói hoạt động)
    • tất cả các mẫu .html cho các trang cấp chính
  • Thư mục con:
    • các thư mục riêng biệt cho css, hình ảnh, js, v.v.
    • các thư mục chứa .html mẫu cho url loại trực tiếp con

Ví dụ:
http://www.bowlsk.com/ ánh xạ tới Trang chủ (gói mặc định), mẫu tại "index.html"
http://www.bowlsk.com/games/view-series.html?series=7130 bản đồ tới ViewSeriesPage (một lần nữa, gói mặc định), mẫu tại "games / view-series.html"

Thật khó chịu. Làm thế nào để tôi tái cấu trúc? Tôi có 2 ý tưởng:

  • Thư mục Chính chứa: appdef, indexes, main.py?

    • Thư mục con cho mã. Đây có phải là gói đầu tiên của tôi không?
    • Thư mục con cho các mẫu. Hệ thống thứ tự thư mục sẽ khớp với thứ bậc gói
    • Các thư mục con riêng lẻ cho css, hình ảnh, js, v.v.
  • Thư mục Chính chứa appdef, indexes, main.py?

    • Thư mục con cho mã + mẫu. Bằng cách này, tôi có lớp xử lý ngay bên cạnh mẫu, bởi vì trong giai đoạn này, tôi đang thêm rất nhiều tính năng, vì vậy sửa đổi đối với một loại có nghĩa là sửa đổi đối với cái kia. Một lần nữa, tôi có phải đặt tên thư mục này là tên gói đầu tiên cho các lớp của tôi không? Tôi muốn thư mục là "src", nhưng tôi không muốn các lớp của mình là "src.W AnythingPage"

Có một thực hành tốt nhất? Với Django 1.0 sắp ra mắt, tôi có thể làm gì bây giờ để cải thiện khả năng tích hợp với nó khi nó trở thành công cụ tạo mẫu GAE chính thức không? Tôi chỉ đơn giản là bắt đầu thử những thứ này và thấy điều đó có vẻ tốt hơn, nhưng hỗ trợ tái cấu trúc của pyDev dường như không xử lý tốt các chuyển động của gói, vì vậy có thể sẽ là một nhiệm vụ không hề nhỏ để tất cả những thứ này hoạt động trở lại.

Câu trả lời:


104

Đầu tiên, tôi khuyên bạn nên xem " Phát triển nhanh với Python, Django và Google App Engine "

GvR mô tả bố cục dự án chung / tiêu chuẩn trên trang 10 của bản trình bày slide của mình .

Ở đây tôi sẽ đăng một phiên bản sửa đổi một chút của bố cục / cấu trúc từ trang đó. Tôi khá tự làm theo mô hình này. Bạn cũng đã đề cập rằng bạn đã gặp sự cố với các gói. Chỉ cần đảm bảo mỗi thư mục con của bạn có tệp __init__.py. Sẽ ổn nếu nó trống.

Các tệp bản ghi sẵn

  • Những điều này hầu như không khác nhau giữa các dự án
  • app.yaml: hướng tất cả các yêu cầu không tĩnh đến main.py
  • main.py: khởi tạo ứng dụng và gửi tất cả các yêu cầu

Bố cục dự án

  • static / *: tệp tĩnh; được phân phát trực tiếp bởi App Engine
  • myapp / *. py: mã python dành riêng cho ứng dụng
    • views.py, models.py, tests.py, __init__.py, v.v.
  • mẫu / *. html: mẫu (hoặc myapp / mẫu / *. html)

Dưới đây là một số ví dụ mã cũng có thể hữu ích:

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

Tôi nghĩ bố cục này hoạt động tốt cho các dự án mới và tương đối nhỏ đến vừa. Đối với các dự án lớn hơn, tôi khuyên bạn nên chia nhỏ các chế độ xem và mô hình để có các thư mục con của riêng chúng với những thứ như:

Bố cục dự án

  • static /: tệp tĩnh; được phân phát trực tiếp bởi App Engine
    • js / *. js
    • hình ảnh / *. gif | png | jpg
    • css / *. css
  • myapp /: cấu trúc ứng dụng
    • mô hình / *. py
    • lượt xem / *. py
    • tests / *. py
    • mẫu / *. html: mẫu

2
Khi bạn nhận được 20 hoặc 30 lượt xem và một vài "lượt xem" chỉ xử lý các bài đăng và sau đó chuyển hướng, bạn có chia chúng thành các tệp riêng biệt không? Có lẽ trong myapp / views / view1.py, myapp / views / view2.py? Hay đó chỉ là nền Java / C # của tôi hiển thị thông qua?
Chris Marasti-Georg

1
Tôi đã chỉnh sửa bài đăng của mình để giải quyết các dự án lớn hơn. Tôi hy vọng rằng sẽ giúp. Hãy nhớ rằng trong một số trường hợp, nó sẽ là một lời kêu gọi phán xét.
fuentesjr 20/09/08

1
Tôi có một bố cục tương tự, nhưng sử dụng "app" thay vì "myapp".
Alexander Kojevnikov 23/09/08

Ai đó có thể cung cấp một ví dụ làm việc cho một bố cục dự án như vậy không? Tôi đã không tìm thấy bất cứ điều gì phù hợp.
herrherr

16

Bố cục thông thường của tôi trông giống như sau:

  • app.yaml
  • index.yaml
  • request.py - chứa ứng dụng WSGI cơ bản
  • lib
    • __init__.py - chức năng chung, bao gồm một lớp cơ sở của trình xử lý yêu cầu
  • bộ điều khiển - chứa tất cả các bộ xử lý. request.yaml nhập những cái này.
  • mẫu
    • tất cả các mẫu django, được bộ điều khiển sử dụng
  • mô hình
    • tất cả các lớp mô hình kho dữ liệu
  • tĩnh
    • tệp tĩnh (css, hình ảnh, v.v.). Được ánh xạ tới / static bởi app.yaml

Tôi có thể cung cấp các ví dụ về app.yaml, request.py, lib / init .py và bộ điều khiển mẫu của tôi trông như thế nào, nếu điều này không rõ ràng.


5
Xin chào Nick, hãy làm điều đó! Tôi cũng cần phải so sánh giữa các giải pháp khác nhau :) Cảm ơn bạn!
Hoàng Phạm

2
Xin chào, tôi cũng muốn xem một số ví dụ nếu có thể. Cảm ơn.

11

Hôm nay, tôi đã triển khai bảng soạn sẵn công cụ ứng dụng google và kiểm tra nó trên github. Đây là những dòng mô tả của Nick Johnson ở trên (người từng làm việc cho Google).

Theo liên kết này gae-boilerplate


1
Bạn có thể mở rộng về câu trả lời này một chút? Liên kết github đều tốt và tốt để hỗ trợ câu trả lời của bạn, nhưng ít nhất bạn nên cố gắng giới thiệu nó một chút.
Shog

1
README.md trong gốc gae-boilerplate giải thích tất cả. github.com/droot/gae-boilerplate/blob/master/README.md
Ed Randall

7

Tôi nghĩ lựa chọn đầu tiên được coi là phương pháp tốt nhất. Và làm cho thư mục mã gói đầu tiên của bạn. Dự án Rietveld do Guido van Rossum phát triển là một mô hình rất tốt để học hỏi. Hãy xem nó: http://code.google.com/p/rietveld

Đối với Django 1.0, tôi khuyên bạn nên bắt đầu sử dụng mã thân Django thay vì GAE được tích hợp trong cổng django. Một lần nữa, hãy xem cách nó được thực hiện trong Rietveld.


Lý do tốt nhất để sử dụng Django là gì? Tôi đang sử dụng WebApp và nó đang phục vụ tôi rất tốt. Bên cạnh đó, tôi hy vọng Google sẽ sớm tích hợp tốt hơn cả hai. Nhược điểm của việc sử dụng cổng Django tích hợp sẵn là gì?
jamtoday 27/09/08

3

Tôi thích webpy nên tôi đã sử dụng nó làm khuôn mẫu tạo mẫu trên Google App Engine.
Các thư mục gói của tôi thường được tổ chức như thế này:

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

Đây là một ví dụ.


1

Tôi không hoàn toàn cập nhật các phương pháp hay nhất mới nhất, v.v. khi nói đến bố cục mã, nhưng khi tôi thực hiện ứng dụng GAE đầu tiên của mình, tôi đã sử dụng một cái gì đó cùng với tùy chọn thứ hai của bạn, trong đó mã và mẫu nằm cạnh nhau.

Có hai lý do cho điều này - một, nó giữ mã và mẫu gần đó, và thứ hai, tôi có bố cục cấu trúc thư mục bắt chước trang web - làm cho nó (đối với tôi) dễ dàng hơn một chút khi nhớ mọi thứ ở đâu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.