Google ऐप इंजन के लिए प्रोजेक्ट संरचना


119

मैंने सही समय पर Google App Engine में एक एप्लिकेशन शुरू किया, जब यह तकनीक के साथ खेलने और एक पालतू प्रोजेक्ट पर काम करने के लिए था, जिसके बारे में मैं लंबे समय से सोच रहा था, लेकिन शुरू करने के लिए कभी भी आस-पास नहीं हुआ। परिणाम बाउलस्क है । हालांकि, जैसा कि यह बड़ा हो गया है, और सुविधाओं को जोड़ा गया है, चीजों को व्यवस्थित रखने के लिए वास्तव में मुश्किल हो गया है - मुख्य रूप से इस तथ्य के कारण कि यह मेरी पहली अजगर परियोजना है, और जब तक मैंने काम करना शुरू नहीं किया, तब तक मुझे इसके बारे में कुछ भी नहीं पता था।

जो मेरे पास है:

  • मुख्य स्तर में शामिल हैं:
    • सभी .py फाइलें (पैकेज काम करने का तरीका नहीं जानता)
    • मुख्य स्तर के पृष्ठों के लिए सभी। html टेम्प्लेट
  • उप-निर्देशिकाएं:
    • सीएसएस, चित्र, जेएस, आदि के लिए अलग फ़ोल्डर।
    • फ़ोल्डर्स जो कि .html उप-प्रकार के यूआरएल के लिए टेम्पलेट्स रखते हैं

उदाहरण: होमपेज (डिफ़ॉल्ट पैकेज) के लिए
http://www.bowlsk.com/ मैप्स, "index.html" पर टेम्पलेट
http://www.bowlsk.com/games/view-series.html?series=7130 मैप्स ViewSeriesPage (फिर, डिफ़ॉल्ट पैकेज), "गेम / व्यू-सीरीज़.html" पर टेम्पलेट

वो बहुत बेकार है। मैं कैसे पुनर्गठन करूं? मेरे 2 विचार थे:

  • मुख्य फ़ोल्डर युक्त: appdef, अनुक्रमित, main.py?

    • कोड के लिए सबफ़ोल्डर। क्या यह मेरा पहला पैकेज होना चाहिए?
    • टेम्पलेट्स के लिए सबफ़ोल्डर। फ़ोल्डर उत्तराधिकारिणी पैकेज वारिस से मेल खाएगा
    • सीएसएस, चित्र, js, आदि के लिए अलग-अलग सबफ़ोल्डर।
  • मुख्य फ़ोल्डर जिसमें appdef, indexes, main.py?

    • कोड + टेम्पलेट्स के लिए सबफ़ोल्डर। इस तरह से मेरे पास टेम्पलेट के ठीक बगल में हैंडलर क्लास है, क्योंकि इस चरण में, मैं बहुत सारी विशेषताओं को जोड़ रहा हूं, इसलिए एक में संशोधन का मतलब दूसरे से संशोधन करना है। फिर से, क्या मुझे इस फ़ोल्डर का नाम अपनी कक्षाओं के लिए पहला पैकेज नाम होना चाहिए? मुझे फ़ोल्डर "src" चाहिए, लेकिन मैं नहीं चाहता कि मेरी कक्षाएं "src.WhateverPage" हों

क्या कोई सबसे अच्छा अभ्यास है? Django 1.0 के साथ क्षितिज पर, क्या ऐसा कुछ है जो अब मैं इसके साथ एकीकृत करने की क्षमता में सुधार कर सकता हूं जब यह आधिकारिक GAE अस्थायी इंजन बन जाता है? मैं बस इन चीजों की कोशिश करना शुरू करूँगा, और यह देखना कि जो बेहतर लगता है, लेकिन pyDev के रीफैक्टरिंग समर्थन पैकेज को बहुत अच्छी तरह से संभालना नहीं लगता है, इसलिए यह फिर से काम करने के लिए एक गैर-तुच्छ कार्य होगा।

जवाबों:


104

सबसे पहले, मैं आपको सुझाव दूंगा कि " पायथन, Django और Google ऐप इंजन के साथ तीव्र विकास "

जीवीआर अपनी स्लाइड प्रस्तुति के पेज 10 पर एक सामान्य / मानक परियोजना लेआउट का वर्णन करता है ।

यहाँ मैं उस पृष्ठ से लेआउट / संरचना का थोड़ा संशोधित संस्करण पोस्ट करूँगा। मैं खुद इस पैटर्न का बहुत पालन करता हूं। आपने यह भी उल्लेख किया है कि आपको पैकेज से परेशानी थी। बस सुनिश्चित करें कि आपके प्रत्येक उप फ़ोल्डर में एक __init__.py फ़ाइल है। खाली है तो ठीक है।

बॉयलरप्लेट फाइलें

  • ये शायद ही परियोजनाओं के बीच भिन्न होते हैं
  • app.yaml: सभी गैर-स्थैतिक अनुरोधों को main.py पर निर्देशित करें
  • main.py: app को इनिशियलाइज़ करें और इसे सभी रिक्वेस्ट भेजें

प्रोजेक्ट ले-आउट

  • स्टेटिक / *: स्टैटिक फाइल्स; सीधे ऐप इंजन द्वारा सेवा की
  • myapp / *। py: ऐप-विशिष्ट अजगर कोड
    • view.py, model.py, test.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):

मुझे लगता है कि यह लेआउट नए और अपेक्षाकृत छोटे से मध्यम परियोजनाओं के लिए बढ़िया काम करता है। बड़ी परियोजनाओं के लिए मैं सुझाव दूंगा कि वे अपने स्वयं के उप-फ़ोल्डर्स को कुछ इस तरह से देखें:

प्रोजेक्ट ले-आउट

  • स्थिर /: स्थिर फाइलें; सीधे ऐप इंजन द्वारा सेवा की
    • जे एस / *। js
    • छवियों / * gif |। png | जेपीजी
    • सीएसएस / *। सीएसएस
  • myapp /: ऐप संरचना
    • मॉडल / *। py
    • विचारों / *। py
    • परीक्षण / *। py
    • टेम्प्लेट / *। html: टेम्प्लेट

2
एक बार जब आप 20 या 30 विचारों को प्राप्त करते हैं, और एक युगल "विचार" जो सिर्फ पदों को संभालता है और फिर रीडायरेक्ट करता है, तो क्या आप उन्हें अलग-अलग फाइलों में तोड़ देते हैं? शायद myapp / views / view1.py, myapp / views / view2.py में? या कि सिर्फ मेरा जावा / सी # पृष्ठभूमि के माध्यम से दिखा रहा है?
क्रिस मरास्टी-जॉर्ज

1
मैंने अपनी पोस्ट को बड़ी परियोजनाओं को संबोधित करने के लिए संपादित किया। मुझे आशा है कि वह मदद करेंगे। ध्यान रखें कि कुछ मामलों में यह एक निर्णय कॉल होगा।
फूंटेसजर

1
मेरे पास एक समान लेआउट है, लेकिन "myapp" के बजाय "ऐप" का उपयोग करें।
अलेक्जेंडर कोजेविकोव

क्या कोई ऐसे प्रोजेक्ट लेआउट के लिए काम करने का उदाहरण दे सकता है? मुझे कुछ भी उपयुक्त नहीं मिला।
हर्रहर

16

मेरा सामान्य लेआउट कुछ इस तरह दिखता है:

  • app.yaml
  • index.yaml
  • request.py - इसमें मूल WSGI ऐप शामिल है
  • lib
    • __init__.py - सामान्य कार्यक्षमता, जिसमें अनुरोध हैंडलर बेस क्लास शामिल है
  • नियंत्रकों - सभी हैंडलर शामिल हैं। request.yaml इन्हें आयात करता है।
  • टेम्पलेट्स
    • सभी django टेम्पलेट, नियंत्रकों द्वारा उपयोग किए जाते हैं
  • नमूना
    • सभी डेटास्टोर मॉडल कक्षाएं
  • स्थिर
    • स्थिर फाइलें (सीएसएस, चित्र आदि)। App.yaml द्वारा मैप / / स्टेटिक

यदि मैं स्पष्ट नहीं हूं, तो मैं अपने एप्लिकेशन का उदाहरण प्रदान कर सकता हूं। myl, request.py, lib / init .py, और नमूना नियंत्रक जैसे दिखते हैं।


5
हाय निक, कृपया यह करो! मुझे अलग-अलग समाधानों के बीच तुलना करने की आवश्यकता है :) धन्यवाद!
होआंग फाम

2
नमस्ते, मैं कुछ उदाहरण देखना चाहूंगा भले ही यह संभव हो। धन्यवाद।

11

मैंने आज एक Google ऐप इंजन बॉयलरप्लेट को लागू किया और इसे जीथब पर जांचा। यह ऊपर निक जॉनसन द्वारा वर्णित लाइनों के साथ है (जो Google के लिए काम करते थे)।

इस लिंक का पालन करें Gae-boilerplate


1
क्या आप इस उत्तर पर थोड़ा विस्तार कर सकते हैं? आपके जवाब का समर्थन करने के लिए गिटब लिंक सभी अच्छी तरह से और अच्छा है, लेकिन आपको कम से कम इसे थोड़ा परिचय देने की कोशिश करनी चाहिए।
शोग

1
गै-बायलरप्लेट रूट में README.md यह सब समझाता है। github.com/droot/gae-boilerplate/blob/master/README.md
एड

7

मुझे लगता है कि पहला विकल्प सबसे अच्छा अभ्यास माना जाता है। और कोड फोल्डर को अपना पहला पैकेज बनाएं। गुइडो वैन रोसुम द्वारा विकसित रिटवल्ड प्रोजेक्ट एक बहुत ही अच्छा मॉडल है, जिसे सीखना है। इस पर एक नज़र डालें: http://code.google.com/p/rietveld

Django 1.0 के संबंध में, मेरा सुझाव है कि आप django पोर्ट में निर्मित GAE के बजाय Django ट्रंक कोड का उपयोग करना शुरू करें। फिर से, यह देखो कि यह रिटवेल्ड में कैसे किया जाता है।


Django का उपयोग करने का सबसे अच्छा कारण क्या है? मैं WebApp का उपयोग कर रहा हूं, और यह मुझे ठीक काम कर रहा है। इसके अलावा, मुझे उम्मीद है कि Google जल्द ही दोनों के बेहतर एकीकरण की पेशकश करेगा। Django पोर्ट में निर्मित उपयोग करने के लिए क्या नकारात्मक है?
जामटोडे

3

मुझे वेबपी पसंद है इसलिए मैंने इसे Google ऐप इंजन पर टेम्प्लेटिंग फ्रेमवर्क के रूप में अपनाया है।
मेरे पैकेज फ़ोल्डर आमतौर पर इस तरह व्यवस्थित होते हैं:

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

यहाँ एक उदाहरण है।


1

जब मैं कोड लेआउट की बात करता हूं तो मैं पूरी तरह से नवीनतम सर्वोत्तम प्रथाओं, एट cetera पर तारीख तक नहीं हूं, लेकिन जब मैंने अपना पहला GAE आवेदन किया, तो मैंने आपके दूसरे विकल्प के साथ कुछ का उपयोग किया, जहां कोड और टेम्पलेट्स प्रत्येक के बगल में हैं।

इसके दो कारण थे - एक, इसने कोड और टेम्पलेट को पास में रखा, और दूसरी बात, मेरे पास वेबसाइट की निर्देशिका संरचना लेआउट की नकल थी - इसे (मेरे लिए) बनाना थोड़ा आसान भी याद था कि सब कुछ कहाँ था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.