Tôi đang cố gắng tạo "ứng dụng mô-đun" trong Flask bằng Bản thiết kế. Sử dụng Flask-SQLAlchemy trong các mô hình Blueprint mà không cần tham chiếu đến ứng dụng
Khi tạo mô hình, tuy nhiên, tôi đang gặp vấn đề phải tham chiếu ứng dụng để nhận được db
-object do Flask-SQLAlchemy cung cấp. Tôi muốn để có thể sử dụng một số bản thiết kế với nhiều hơn một ứng dụng (tương tự như cách ứng dụng Django có thể được sử dụng), vì vậy đây không phải là một giải pháp tốt. *
- Có thể làm một switcharoo, và có Blueprint tạo ra cá thể
db
, sau đó ứng dụng đó sẽ nhập cùng với phần còn lại của kế hoạch chi tiết. Nhưng sau đó, bất kỳ kế hoạch chi tiết nào khác muốn tạo mô hình cần phải nhập từ rằng kế hoạch chi tiết thay vì ứng dụng.
Câu hỏi của tôi là như sau:
- Có cách nào để cho Blueprints xác định mô hình mà không cần bất kỳ nhận thức về ứng dụng họ đang được sử dụng trong sau này - và có một vài Blueprints đến với nhau? Bằng cách này, tôi có nghĩa là phải nhập mô-đun/gói ứng dụng từ Kế hoạch chi tiết của bạn.
- Tôi có sai lầm ngay từ đầu không? Bản thiết kế Blueprint không có nghĩa là độc lập với ứng dụng và có thể phân phối lại được (ứng dụng Django à)?
- Nếu không, thì mẫu nào nên bạn sử dụng để tạo thứ gì đó như thế? Flask mở rộng? Bạn có nên đơn giản là không làm điều đó - và có thể tập trung tất cả các mô hình/lược đồ Ruby on Rails?
Sửa: Tôi đã suy nghĩ về vấn đề này bản thân mình bây giờ, và điều này có thể có liên quan đến SQLAlchemy hơn Flask bởi vì bạn phải có
declarative_base()
mô hình khi tuyên bố. Và đó là phải đến từ đâu đó, dù sao đi nữa!Có lẽ giải pháp tốt nhất là để lược đồ của dự án của bạn được xác định ở một nơi và phát tán nó xung quanh, như Ruby on Rails. Các định nghĩa lớp SQLAlchemy khai báo thực sự giống schema.rb hơn models.py của Django. Tôi tưởng tượng điều này cũng sẽ giúp việc sử dụng di chuyển dễ dàng hơn (từ alembic hoặc sqlalchemy-migrate).
Tôi đã yêu cầu cung cấp một ví dụ, vì vậy chúng ta hãy làm một cái gì đó đơn giản: Giả sử tôi có một kế hoạch chi tiết mô tả "flatpages" - đơn giản, "tĩnh" nội dung lưu trữ trong cơ sở dữ liệu. Nó sử dụng một bảng chỉ với tên viết tắt (cho các URL), một tiêu đề và một phần nội dung.Đây là simple_pages/__init__.py
:
from flask import Blueprint, render_template
from .models import Page
flat_pages = Blueprint('flat_pages', __name__, template_folder='templates')
@flat_pages.route('/<page>')
def show(page):
page_object = Page.query.filter_by(name=page).first()
return render_template('pages/{}.html'.format(page), page=page_object)
Sau đó, nó sẽ được tốt đẹp để cho kế hoạch chi tiết này xác định mô hình riêng của mình (điều này trong simple_page/models.py
):
# TODO Somehow get ahold of a `db` instance without referencing the app
# I might get used in!
class Page(db.Model):
name = db.Column(db.String(255), primary_key=True)
title = db.Column(db.String(255))
content = db.Column(db.String(255))
def __init__(self, name, title, content):
self.name = name
self.title = title
self.content = content
Câu hỏi này có liên quan đến:
Và nhiều thứ khác, nhưng tất cả các câu trả lời dường như dựa vào nhập phiên bản db
của ứng dụng hoặc làm ngược lại. Trang wiki "Large app how to" cũng sử dụng mẫu "nhập ứng dụng của bạn trong kế hoạch chi tiết của bạn".
Vì các bản thiết kế có thể được nối vào ứng dụng nhiều lần, có thể đơn giản là phương pháp tiếp cận sai để có mô hình trong Bản thiết kế?
Bản thiết kế bạn đang tạo là ứng dụng có thể cắm * cần * để xác định các mô hình mà họ sử dụng? Hoặc họ có thể đơn giản là * đưa ra * mô hình từ ứng dụng? Nếu trước đây, bạn có thể đưa ra một ví dụ về một loại kế hoạch chi tiết có thể tái sử dụng mà bạn đang cố gắng tạo ra mà cần phải xác định các mô hình riêng của mình không? –
Tôi đã cung cấp một ví dụ đơn giản, như bạn đã hỏi. Thật khó để nói về "cần" trong bối cảnh này: Nó không "cần" để xác định các mô hình riêng của nó nếu đó là cách cơ bản sai để tiếp cận nó, nhưng tôi đã bị ấn tượng rằng bạn nên "làm như thế nào". Tuy nhiên, tôi có thể hiểu nếu Flask được sử dụng tốt hơn như RoR trong đó giản đồ được xác định trong ứng dụng của bạn và "được cung cấp" cho các plugin khác nhau. Tôi đoán trong trường hợp đó, bạn sẽ sử dụng cấu hình để cung cấp? – vicvicvic
Tại sao [giải pháp này] (http://stackoverflow.com/a/9695045/114833) không hoạt động trong trường hợp của bạn? Nó không tham chiếu ứng dụng trong mô hình hoặc mô-đun kế hoạch chi tiết. –