سؤال

لقد بدأت تشغيل تطبيق في Google App Engine فور طرحه، وذلك للتلاعب بالتكنولوجيا والعمل على مشروع صغير كنت أفكر فيه لفترة طويلة ولكنني لم أتمكن من البدء فيه مطلقًا.النتيجه هي BowlSK.ومع ذلك، مع نموه وإضافة الميزات، أصبح من الصعب حقًا الحفاظ على الأشياء منظمة - ويرجع ذلك أساسًا إلى حقيقة أن هذا هو أول مشروع لي في بايثون، ولم أكن أعرف شيئًا عنه حتى بدأت العمل.

ماذا املك:

  • المستوى الرئيسي يحتوي على:
    • جميع ملفات .py (لم أكن أعرف كيفية تشغيل الحزم)
    • جميع قوالب .html لصفحات المستوى الرئيسي
  • الدلائل الفرعية:
    • مجلدات منفصلة لـ CSS والصور وJS وما إلى ذلك.
    • المجلدات التي تحتوي على قوالب .html لعناوين URL من نوع الدليل الفرعي

مثال:
http://www.bowlsk.com/ يتم تعيينه إلى الصفحة الرئيسية (الحزمة الافتراضية)، والقالب على "index.html"
http://www.bowlsk.com/games/view-series.html?series=7130 يتم تعيينه إلى ViewSeriesPage (مرة أخرى، الحزمة الافتراضية)، القالب في "games/view-series.html"

انها سيئة.كيف أقوم بإعادة الهيكلة؟كان لدي فكرتين:

  • المجلد الرئيسي الذي يحتوي على:appdef، الفهارس، main.py؟

    • مجلد فرعي للتعليمات البرمجية.هل يجب أن تكون هذه الحزمة الأولى الخاصة بي؟
    • مجلد فرعي للقوالب.سوف يتطابق التسلسل الهرمي للمجلد مع التسلسل الهرمي للحزمة
    • المجلدات الفرعية الفردية لـ CSS والصور وJS وما إلى ذلك.
  • المجلد الرئيسي الذي يحتوي على appdef والفهارس وmain.py؟

    • مجلد فرعي للكود + القوالب.بهذه الطريقة أحصل على فئة المعالج بجوار القالب مباشرةً، لأنه في هذه المرحلة، أقوم بإضافة الكثير من الميزات، لذا فإن التعديلات على أحدهما تعني تعديلات على الأخرى.مرة أخرى، هل يجب أن يكون اسم المجلد هذا هو اسم الحزمة الأول لفصولي الدراسية؟أرغب في أن يكون المجلد "src"، ولكن لا أريد أن يكون فصولي "src.WhateverPage"

هل هناك أفضل الممارسات؟مع وجود Django 1.0 في الأفق، هل هناك شيء يمكنني فعله الآن لتحسين قدرتي على التكامل معه عندما يصبح محرك قوالب GAE الرسمي؟أود ببساطة أن أبدأ في تجربة هذه الأشياء، ومعرفة أيها يبدو أفضل، ولكن يبدو أن دعم إعادة البناء في pyDev لا يتعامل مع تحركات الحزم بشكل جيد للغاية، لذلك من المحتمل أن تكون مهمة غير تافهة إعادة تشغيل كل هذا مرة أخرى.

هل كانت مفيدة؟

المحلول

أولاً، أقترح عليك إلقاء نظرة على "التطوير السريع باستخدام Python وDjango وGoogle App Engine"

يصف GvR تخطيط المشروع العام/القياسي في الصفحة 10 من كتابه عرض الشرائح.

سأقوم هنا بنشر نسخة معدلة قليلاً من التخطيط/البنية من تلك الصفحة.أنا أتبع هذا النمط إلى حد كبير بنفسي.لقد ذكرت أيضًا أنك واجهت مشكلة مع الحزم.فقط تأكد من أن كل مجلد من مجلداتك الفرعية يحتوي على ملف __init__.py.لا بأس إذا كانت فارغة.

ملفات نموذجية

  • هذه بالكاد تختلف بين المشاريع
  • التطبيق:قم بتوجيه كافة الطلبات غير الثابتة إلى main.py
  • main.py:تهيئة التطبيق وإرسال كافة الطلبات إليه

تخطيط المشروع

  • ثابتة/*:ملفات ثابتة؛يتم تقديمه مباشرةً بواسطة App Engine
  • myapp/*.py:كود بايثون الخاص بالتطبيق
    • views.py وmodels.py وtests.py و__init__.py والمزيد
  • قوالب/*.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):

أعتقد أن هذا التصميم يعمل بشكل رائع بالنسبة للمشاريع الجديدة والصغيرة إلى المتوسطة نسبيًا.بالنسبة للمشاريع الأكبر، أقترح تقسيم طرق العرض والنماذج للحصول على مجلدات فرعية خاصة بها بشيء مثل:

تخطيط المشروع

  • ثابتة/:ملفات ثابتة؛يتم تقديمه مباشرةً بواسطة App Engine
    • شبيبة/*.js
    • الصور/*.gif|png|jpg
    • المغلق/*.css
  • تطبيقي/:هيكل التطبيق
    • النماذج/*.py
    • المشاهدات/*.py
    • الاختبارات/*.py
    • قوالب/*.html:قوالب

نصائح أخرى

يبدو تخطيطي المعتاد كالتالي:

  • app.yaml
  • Index.yaml
  • request.py - يحتوي على تطبيق WSGI الأساسي
  • ليب
    • __init__.py - وظائف مشتركة، بما في ذلك الفئة الأساسية لمعالج الطلب
  • وحدات التحكم - تحتوي على كافة المعالجات.request.yaml يستورد هذه.
  • قوالب
    • جميع قوالب جانغو المستخدمة من قبل وحدات التحكم
  • نموذج
    • جميع فئات نماذج مخزن البيانات
  • ثابتة
    • الملفات الثابتة (CSS، الصور، الخ).تم التعيين إلى /static بواسطة app.yaml

يمكنني تقديم أمثلة لما هو موجود في app.yaml و request.py وlib/فيه.py، ونماذج وحدات التحكم، إذا لم يكن هذا واضحًا.

لقد قمت بتطبيق نموذج محرك تطبيق Google اليوم وفحصته على جيثب.وهذا على غرار ما وصفه نيك جونسون أعلاه (الذي كان يعمل لدى Google).

اتبع هذا الرابط جاي-النموذجي

أعتقد أن الخيار الأول يعتبر أفضل الممارسات.واجعل مجلد التعليمات البرمجية هو الحزمة الأولى لك.يعد مشروع Rietveld الذي طوره Guido van Rossum نموذجًا جيدًا جدًا للتعلم منه.إلقاء نظرة على ذلك: http://code.google.com/p/rietveld

فيما يتعلق بـ Django 1.0، أقترح عليك البدء في استخدام رمز قناة Django بدلاً من GAE المدمج في منفذ Django.مرة أخرى، ألق نظرة على كيفية القيام بذلك في ريتفيلد.

انا يعجبني webpy لذا فقد اعتمدته كإطار عمل نموذجي على Google App Engine.
عادةً ما يتم تنظيم مجلدات الحزم الخاصة بي على النحو التالي:

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

هنا انه مثال.

لست مطلعًا تمامًا على أحدث أفضل الممارسات، وما إلى ذلك عندما يتعلق الأمر بتخطيط التعليمات البرمجية، ولكن عندما قمت بتطبيق أول تطبيق GAE، استخدمت شيئًا ما بجانب خيارك الثاني، حيث تكون التعليمات البرمجية والقوالب بجوار بعضها البعض.

كان هناك سببان لذلك - الأول، أنه أبقى الكود والقالب في مكان قريب، وثانيًا، كان لدي تخطيط بنية الدليل يحاكي تخطيط موقع الويب - مما يجعل الأمر (بالنسبة لي) أسهل قليلاً أيضًا في تذكر مكان كل شيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top