Google App Engine의 프로젝트 구조


119

저는 Google App Engine이 출시 되 자마자 애플리케이션을 시작하여 기술을 가지고 놀면서 오랫동안 생각해 왔지만 시작하지 못한 애완 동물 프로젝트를 수행했습니다. 결과는 BowlSK 입니다. 그러나 성장하고 기능이 추가됨에 따라 구성을 유지하는 것이 정말 어려웠습니다. 주로 이것이 저의 첫 번째 파이썬 프로젝트라는 사실 때문이며 작업을 시작하기 전까지는 그것에 대해 아무것도 몰랐습니다.

내가 가진 것 :

  • 메인 레벨은 다음을 포함합니다 :
    • 모든 .py 파일 (패키지 작동 방법을 몰랐 음)
    • 기본 수준 페이지를위한 모든 .html 템플릿
  • 하위 디렉토리 :
    • css, images, js 등을위한 별도의 폴더
    • 하위 디렉토리 유형 URL에 대한 .html 템플릿이있는 폴더

예 :
http://www.bowlsk.com/ 은 홈페이지 (기본 패키지)에 매핑 되고 "index.html"의 템플릿은
http://www.bowlsk.com/games/view-series.html?series=7130에 매핑됩니다. ViewSeriesPage (다시 말하지만 기본 패키지), "games / view-series.html"의 템플릿

끔찍 해요. 어떻게 재구성합니까? 두 가지 아이디어가 있습니다.

  • 주요 폴더 : appdef, indexes, main.py?

    • 코드의 하위 폴더입니다. 이것이 내 첫 번째 패키지 여야합니까?
    • 템플릿의 하위 폴더. 폴더 계층이 패키지 계층과 일치합니다.
    • css, images, js 등의 개별 하위 폴더
  • appdef, indexes, main.py를 포함하는 메인 폴더?

    • 코드 + 템플릿의 하위 폴더입니다. 이렇게하면 템플릿 바로 옆에 핸들러 클래스가 있습니다.이 단계에서는 많은 기능을 추가하고 있으므로 하나의 수정은 다른 하나의 수정을 의미합니다. 다시 말하지만이 폴더 이름이 내 수업의 첫 번째 패키지 이름이되어야합니까? 폴더를 "src"로하고 싶지만 클래스가 "src.WhateverPage"가되는 것을 원하지 않습니다.

모범 사례가 있습니까? 장고 1.0이 다가 오면 공식 GAE 템플릿 엔진이되었을 때이를 통합하는 능력을 향상시킬 수있는 방법이 있습니까? 나는 단순히 이러한 것들을 시도하기 시작하고 어느 것이 더 좋아 보이는지 보지만 pyDev의 리팩토링 지원은 패키지 이동을 잘 처리하지 않는 것 같으 므로이 모든 것을 다시 작동시키는 것은 사소한 작업이 아닐 것입니다.

답변:


104

첫째, 난 당신이 "한 번 봐 가지고 제안 파이썬, 장고, 구글 앱 엔진과 신속한 개발을 "

GvR은 슬라이드 프레젠테이션의 10 페이지에있는 일반 / 표준 프로젝트 레이아웃을 설명합니다 .

여기에서는 해당 페이지의 레이아웃 / 구조를 약간 수정 한 버전을 게시하겠습니다. 나는이 패턴을 거의 그대로 따른다. 또한 패키지에 문제가 있다고 언급했습니다. 각 하위 폴더에 __init__.py 파일이 있는지 확인하십시오. 비어 있으면 괜찮습니다.

상용구 파일

  • 프로젝트마다 거의 다르지 않습니다.
  • app.yaml : 모든 비 정적 요청을 main.py로 보냅니다.
  • main.py : 앱 초기화 및 모든 요청 보내기

프로젝트 레이아웃

  • static / * : 정적 파일; App Engine에서 직접 제공
  • myapp / *. py : 앱별 Python 코드
    • views.py, models.py, tests.py, __init__.py 등
  • templates / *. html : 템플릿 (또는 myapp / templates / *. 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):

이 레이아웃은 새롭고 비교적 중소 규모의 프로젝트에 적합하다고 생각합니다. 더 큰 프로젝트의 경우 다음과 같은 자체 하위 폴더를 갖도록 뷰와 모델을 분할하는 것이 좋습니다.

프로젝트 레이아웃

  • static / : 정적 파일; App Engine에서 직접 제공
    • js / *. js
    • images / *. gif | png | jpg
    • css / *. css
  • myapp / : 앱 구조
    • models / *. py
    • views / *. py
    • tests / *. py
    • templates / *. html : 템플릿

2
20 개 또는 30 개의보기와 게시물을 처리 한 다음 리디렉션하는 몇 개의 "보기"가 발생하면이를 별도의 파일로 분리합니까? 아마도 myapp / views / view1.py, myapp / views / view2.py? 아니면 내 Java / C # 배경이 보여 지나요?
Chris Marasti-Georg

1
더 큰 프로젝트를 다루기 위해 게시물을 편집했습니다. 도움이 되었기를 바랍니다. 어떤 경우에는 판결 요청이 될 것임을 명심하십시오.
fuentesjr

1
비슷한 레이아웃이 있지만 "myapp"대신 "app"을 사용합니다.
Alexander Kojevnikov

누군가 그러한 프로젝트 레이아웃에 대한 작업 예제를 제공 할 수 있습니까? 나는 적합한 것을 찾지 못했습니다.
herrherr

16

내 일반적인 레이아웃은 다음과 같습니다.

  • app.yaml
  • index.yaml
  • request.py-기본 WSGI 앱 포함
  • lib
    • __init__.py -요청 처리기 기본 클래스를 포함한 공통 기능
  • 컨트롤러-모든 핸들러를 포함합니다. request.yaml은이를 가져옵니다.
  • 템플릿
    • 컨트롤러가 사용하는 모든 django 템플릿
  • 모델
    • 모든 데이터 저장소 모델 클래스
  • 공전
    • 정적 파일 (css, 이미지 등). app.yaml에 의해 / static에 매핑 됨

명확하지 않은 경우 내 app.yaml, request.py, lib / init .py 및 샘플 컨트롤러의 예를 제공 할 수 있습니다 .


5
안녕 닉, 제발하세요! 다른 솔루션도 비교해야합니다. :) 감사합니다!
Hoang Pham

2
안녕하세요, 가능하다면 몇 가지 예도보고 싶습니다. 감사.

11

오늘 Google 앱 엔진 상용구를 구현하고 github에서 확인했습니다. 이것은 위의 Nick Johnson (Google에서 일했던 사람)이 설명한 내용을 따릅니다.

이 링크를 따라 GAE-보일러를


1
이 답변을 조금 확장 할 수 있습니까? github 링크는 귀하의 답변을 지원하는 데 모두 훌륭하고 좋지만 적어도 조금 소개해야합니다.
Shog9

1
gae-boilerplate 루트의 README.md는 모든 것을 설명합니다. github.com/droot/gae-boilerplate/blob/master/README.md
Ed Randall

7

첫 번째 옵션이 모범 사례라고 생각합니다. 그리고 코드 폴더를 첫 번째 패키지로 만드십시오. Guido van Rossum이 개발 한 Rietveld 프로젝트는 배우기에 아주 좋은 모델입니다. 한번보세요 : http://code.google.com/p/rietveld

Django 1.0과 관련하여 django 포트에 내장 된 GAE 대신 Django 트렁크 코드를 사용하는 것이 좋습니다. 다시, Rietveld에서 어떻게 수행되는지 살펴보십시오.


Django를 사용하는 가장 좋은 이유는 무엇입니까? 저는 WebApp을 사용해 왔으며 잘 제공되고 있습니다. 게다가 조만간 구글이이 둘의 더 나은 통합을 제공하기를 바랍니다. 내장 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.