2010-03-07 38 views
5

Tôi cần lưu trữ cài đặt cho dự án Google App Engine của mình. Hiện nay tôi có:lưu cài đặt ứng dụng trên Google App Engine

class Settings(db.Model): 
    rate = db.IntegerProperty(default=4) 
    ... 

Và khi tôi muốn sử dụng nó:

Settings.get_or_insert('settings') 

này cảm thấy vụng về như vậy là có một cách tốt hơn (mà không sử dụng Django)?

+0

Cài đặt có thay đổi giữa các lần triển khai phiên bản của ứng dụng không? –

+0

vâng, và có thể được cập nhật trong quá trình triển khai quá – hoju

Trả lời

4

Hãy làm rõ những gì "cảm thấy vụng về" đối với bạn về điều này - điều đó không rõ ràng đối với tôi.

Kho dữ liệu là cách cách duy trì dữ liệu có thể cập nhật trong App Engine (blobstore dành cho các đốm màu lớn, memcache không được đảm bảo liên tục). Nếu bạn không thể thay đổi cài đặt của mình bằng ứng dụng, bạn có thể chỉ cần đặt chúng trong tệp tùy chỉnh của riêng bạn .yaml (hoặc bất kỳ điều gì, nhưng các tập tin cấu hình riêng của App Engine đã được lưu trữ như thế nào ... ;-); chỉ cần nhớ tất cả các tệp như vậy là chỉ đọc từ quan điểm của ứng dụng. YAML thuận tiện cho các ứng dụng App Engine để phân tích cú pháp các tệp .yaml của riêng họ (nhưng "chỉ đọc").

+0

cảm thấy vụng về với tôi bởi vì tôi buộc một mô hình chỉ có một trường hợp duy nhất – hoju

+0

Richard, không có gì sai khi có một singleton được kho dữ liệu trả về. Một điều mà bạn thực sự muốn xem xét là vì lý do hiệu suất, bạn sẽ muốn giữ thực thể này trong memcache, và ghi nó vào kho dữ liệu bất cứ khi nào nó thay đổi. –

+0

@Adam, tôi hoàn toàn đồng ý - memcache không được bảo đảm _stay_ xung quanh, nhưng nó sẽ nhanh hơn nếu nó xảy ra ;-). @ Richard, điểm là, kho dữ liệu của tất cả các bạn có (cho lưu trữ được bảo đảm liên tục). Nếu bạn có nhiều "bit và miếng" khác nhau mà bạn cần phải tồn tại, bạn có thể sử dụng một mô hình vô định hình để lưu trữ bất kỳ một trong số chúng (như một đốm màu), nhưng điều đó không nhất thiết phải thanh lịch hơn. –

0

Trong các dự án của tôi, tôi đưa dữ liệu config vào kho dữ liệu (một bản ghi cho mỗi giá trị config) sử dụng lớp này:

from google.appengine.ext import ndb 

class Settings(ndb.Model): 
    name = ndb.StringProperty() 
    value = ndb.StringProperty() 

    @staticmethod 
    def get(name): 
    NOT_SET_VALUE = "NOT SET" 
    retval = Settings.query(Settings.name == name).get() 
    if not retval: 
     retval = Settings() 
     retval.name = name 
     retval.value = NOT_SET_VALUE 
     retval.put() 
    if retval.value == NOT_SET_VALUE: 
     raise Exception(('Setting %s not found in the database. A placeholder ' + 
     'record has been created. Go to the Developers Console for your app ' + 
     'in App Engine, look up the Settings record with name=%s and enter ' + 
     'its value in that record\'s value field.') % (name, name)) 
    return retval.value 

Ứng dụng của bạn sẽ làm điều này để có được một giá trị:

API_KEY = Settings.get('API_KEY') 

Nếu có một giá trị cho khóa đó trong kho dữ liệu, bạn sẽ nhận được nó. Nếu không có, một bản ghi giữ chỗ sẽ được tạo và một ngoại lệ sẽ được ném ra. Ngoại lệ sẽ nhắc bạn chuyển đến Developers Console và cập nhật bản ghi giữ chỗ.

Tôi thấy điều này có thể đoán được việc đặt các giá trị cấu hình. Nếu bạn không chắc chắn về những giá trị cấu hình cần thiết, chỉ cần chạy mã và nó sẽ cho bạn biết!

Các vấn đề liên quan