2012-06-21 36 views
5

Tôi chỉ mới bắt đầu với bình và tôi đã bị đánh hơi. Tôi đang cố gắng viết một blog nhỏ để làm quen với khung làm việc vì vậy tôi đã tạo hai gói, một "auth" và "posts". Tôi đọc qua phần Ứng dụng lớn trong Flask docs.Bình: Sử dụng nhiều gói trong một ứng dụng

Thư mục của tôi trông giống như thế này.

>/root 
>>run.py 

>>/posts 

>>>____init____.py 
>>>views.py 
>>>/templates 
>>>/static 

>>/auth 
>>>____init____.py 
>>>views.py 
>>>/templates 
>>>/static 

các run.py trông như thế này:

from flask import Flask 
from auth import auth_app 
from posts import posts_app 

auth_app.run() 
posts_app.run() 

/posts/__init__.py/auth/__init__.py cái nhìn như thế này:

from flask import Flask 

auth_app = Flask(__name__) 

import auth.views 

và views.py trông như thế này:

from auth import auth_app 

@auth_app.route('/auth/') 
def index(): 
    return "hello auth!" 

Nhưng bất cứ khi nào tôi chạy máy chủ, chỉ có localhost/auth/có sẵn, và mọi thứ khác cho một 404, som tôi giả định rằng các ứng dụng bài viết không được chạy.

Có ai giúp được không?

Trả lời

5

Phương thức auth_app.run() của bạn chặn chương trình của bạn tiếp tục chạy. Đây là lý do tại sao ứng dụng posts_apps không chạy. Toàn bộ quá trình phục vụ các trang sẽ xảy ra trong phương thức run() của Flask. Vì vậy, bạn có thể kết luận rằng bạn không thể chạy hai ứng dụng Flask trong cùng một quá trình.

Nếu bạn muốn chia ứng dụng của bạn thành hai dạng như thế này, cách được khuyến nghị là sử dụng blueprints. Thay vì tạo hai ứng dụng (auth và posts), bạn tạo hai bản thiết kế. Sau đó bạn tạo một ứng dụng như vậy ...

from flask import Flask 
from auth import auth_blueprint 
from posts import post_blueprint 

app = Flask(__name__) 
app.register_blueprint(auth_blueprint) 
app.register_blueprint(post_blueprint) 
app.run() 
+0

Bản thiết kế là một ý tưởng hay! –

+0

Điều gì sẽ xảy ra nếu các bản thiết kế 'auth' và' post' phải sử dụng mô-đun 'models.py' được xác định ở cấp cơ sở, cùng với' run.py'?Sau đó, nó sẽ làm cho tinh thần để tuyên bố chúng như là bản thiết kế, ngay cả khi họ không "hoàn toàn độc lập" từ ứng dụng chính và do đó không thể tái sử dụng trong các ứng dụng khác mà không có cùng 'models.py'? Cảm ơn bạn! – aralar

+1

@ miguel5 Những gì bạn định nghĩa là "độc lập" tùy thuộc vào bạn. Các bản thiết kế Flask giúp cung cấp một cách để tách những thứ mà Flask quan tâm: vị trí của tệp tĩnh và mẫu, URL và cách chúng ánh xạ tới chế độ xem của bạn, v.v. Nếu bạn chỉ muốn sử dụng để giữ các thư mục này khác nhau , nhưng vẫn dựa vào một 'model.py' duy nhất, thì điều đó là tốt. Nếu bạn muốn tách riêng các mô hình của mình thành các cấu trúc dữ liệu khác nhau, bạn cũng có thể làm điều đó. Bản thân Flask không quan tâm đến cách bạn lưu trữ tệp 'models.py' của bạn. –

4

Mặc dù nó có vẻ như mặc dù cách tiếp cận của Mark sử dụng bản thiết kế phù hợp với dự án của bạn tốt, nếu bạn muốn sử dụng các ứng dụng riêng biệt cho từng gói bạn nên xem xét werkzeug.wsgi.DispatcherMiddleware.

Một quy trình không thể chạy một ứng dụng thứ hai sau khi bạn chạy ứng dụng đầu tiên (như trong câu hỏi của bạn), nhưng đó không phải là vấn đề với DispatcherMiddleware. Bạn có thể sử dụng nó để xác định một ứng dụng chính cũng như các ứng dụng khác dựa trên các tiền tố URL.

Ví dụ về tài liệu phân biệt giữa hai ứng dụng - frontend và backend-- được chạy tùy thuộc vào URL mà người dùng yêu cầu.

Nếu bạn muốn tìm hiểu thêm, hãy đọc "How I Structure My Flask Applications" của Matt Wright và xem Overholt, dự án mẫu của mình. Anh quyết định sử dụng hai ứng dụng: một cho trang web chính (giao diện người dùng) và một cho API, và anh tạo ra sự khác biệt giữa hai ứng dụng dựa trên tiền tố URL. Từ mã * mình:

 from werkzeug.serving import run_simple 
    from werkzeug.wsgi import DispatcherMiddleware 
    from overholt import api, frontend 


    application = DispatcherMiddleware(frontend.create_app(), { 
     '/api': api.create_app() 
    }) 


    if __name__ == "__main__": 
     run_simple('0.0.0.0', 5000, application, use_reloader=True, use_debugger=True) 

Bằng cách này, ông đã tạo ra hai ứng dụng trong đó mỗi bộ có định nghĩa của quan điểm, cấu hình, vv và có thể chạy chúng từ quá trình thông dịch Python tương tự.

* Lưu ý rằng run_simple() chỉ có nghĩa là được sử dụng để phát triển --không sản xuất.

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