2014-12-14 22 views
17

Mục tiêu của tôi là lấy mã tùy ý để chạy sau khi ứng dụng bình của tôi được bắt đầu, đây là vấn đề của tôi. Tôi đã có này (nơi ứng dụng là ứng dụng bình của tôi):Mã chạy sau khi ứng dụng bình đã bắt đầu

def run(): 
    from webapp import app 
    app.run(debug=True, use_reloader=False) 

Tôi tưởng tôi sẽ chỉ làm điều này

def run(): 
    from webapp import app 
    app.run(debug=True, use_reloader=False) 
    some_code() 

nhưng mã không tiếp tục app.run qua() cho đến khi thoát máy chủ, vì vậy some_code() không bao giờ chạy

các giải pháp tôi đang làm việc trên vào lúc này là chạy some_code() trong một thread riêng biệt từ app.run(), tạo một hàm before first request mà bộ này:

app.is_running = True 

Sau đó nhận some_code() để quay một yêu cầu cơ bản đến ứng dụng để mã 'trước khi yêu cầu đầu tiên' chạy. Điều này khá phức tạp và sẽ khó viết tài liệu cho ... Tôi muốn tham khảo một tham số app.is_running đã được viết vào bình, hoặc sử dụng một @ app.after_server_start decorator, nhưng với kiến ​​thức của tôi không phải của những người tồn tại:/

Giúp tôi làm cho mã này tốt hơn?


bài mùn: everytime tôi suy nghĩ về câu hỏi này, nó làm cho tôi muốn cho một @app.after_server_start decorator

+4

Tại sao không chỉ sử dụng '@ app.before_first_request' và * được thực hiện với điều đó *. Tại sao mã cần chạy trước đó? –

+2

Nói cách khác, tại sao nó quan trọng đến mức mã chạy * sau * khởi động máy chủ (mà bạn không thể sử dụng như thế trong mã sản xuất, luôn sử dụng một thùng chứa WSGI thích hợp thay vì không phải là sự mỏng manh cho phát triển- chỉ máy chủ Werkzeug mới bắt đầu bằng 'app.run()') nhưng trước khi một yêu cầu đến? –

+2

Chủ yếu là vì nó có ý nghĩa hơn để chạy mã sau khi máy chủ bắt đầu, nhưng quyền của bạn không thực sự cần chạy sớm hơn – Cyrin

Trả lời

8

Sử dụng Flask-Script để chạy ứng dụng của bạn, sau đó ghi đè lên lớp runserver/phương pháp như thế này

# manage.py 

from flask.ext.script import Manager 

from myapp import app 

manager = Manager(app) 

def crazy_call(): 
    print("crazy_call") 

@manager.command 
def runserver(): 
    app.run() 
    crazy_call() 

if __name__ == "__main__": 
    manager.run() 
+1

Cảm ơn bài đăng của bạn. Khi ứng dụng của chúng tôi chạy qua uwsgi, làm cách nào để chúng tôi tích hợp trình quản lý này? – chefarov

+1

@chefarov trái python lâu rồi. Tôi không biết – CESCO

+0

Nó không hiệu quả với tôi. Tôi đã phải trao đổi các dòng như sau: app.run() và crazy_call(). – jotacor

8

Nếu bạn cần thực hiện một số mã sau khi ứng dụng bình của bạn được bắt đầu nhưng trước khi yêu cầu đầu tiên, thậm chí không được kích hoạt bởi việc thực hiện yêu cầu đầu tiên là @ app.before_first_request có thể xử lý, bạn nên sử dụng Flask_Script, như CE SCO nói, nhưng bạn có thể phân lớp lớp Server và ghi đè lên các cuộc gọi __ __ phương pháp, thay vì ghi đè lệnh runserver với @ manager.command:

from flask import Flask 
from flask_script import Manager, Server 

def custom_call(): 
    #Your code 
    pass 

class CustomServer(Server): 
    def __call__(self, app, *args, **kwargs): 
     custom_call() 
     #Hint: Here you could manipulate app 
     return Server.__call__(self, app, *args, **kwargs) 

app = Flask(__name__) 
manager = Manager(app) 

# Remeber to add the command to your Manager instance 
manager.add_command('runserver', CustomServer()) 

if __name__ == "__main__": 
    manager.run() 

Bằng cách này bạn không ghi đè tùy chọn mặc định của lệnh runserver.

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