2012-02-14 25 views
22

Tôi hơi bối rối về cách làm điều gì đó mà tôi nghĩ sẽ khá đơn giản. Tôi có một ứng dụng đơn giản được viết bằng cách sử dụng Flask. Nó trông giống như sau:Cách tiếp cận phù hợp để gọi các chức năng sau khi chạy ứng dụng bình là gì?

from flask import Flask 

app = Flask(__name__) 

def _run_on_start(a_string): 
    print "doing something important with %s" % a_string 

@app.route('/') 
def root(): 
    return 'hello world' 

if __name__ == "__main__": 
    if len(sys.argv) < 2: 
     raise Exception("Must provide domain for application execution.") 
    else: 
     DOM = sys.argv[1] 
     _run_on_start("%s" % DOM) 
     app.run(debug=True) 

Những gì tôi đang tìm kiếm là thiết bị đầu cuối của tôi là xuất ra các báo cáo in trong _run_on_start nhưng không của mã debug ứng dụng Flask thông thường khác. Nếu tôi xóa cuộc gọi trước khi app.run, đầu ra là bình thường. Hơn nữa tôi đang tìm đầu ra của _run_on_start để được lặp lại hai lần khi khởi động, mặc dù tôi không biết nếu đó là một số đầu ra lạ hoặc chức năng thực sự được gọi là hai lần.

Tôi giả định đây không phải là cách đúng để thêm cuộc gọi chức năng trước khi bạn gọi app.run. Tôi nhìn vào các tài liệu Flask và tìm thấy đề cập của trang trí khác nhau người ta có thể sử dụng, cho phép bạn thực hiện một chức năng trước/sau khi yêu cầu nhất định nhưng tôi muốn thực hiện cuộc gọi khi máy chủ ứng dụng được chạy.

Hơn nữa, tôi nhận ra rằng nếu tôi gọi mô-đun này từ một mô-đun khác, nghĩa là không phải khi __name__ != "__main__" thì tôi sẽ không nhận được cuộc gọi của tôi tới _run_on_start.

Cách tiếp cận phù hợp ở đây là gì? Trong cả hai trường hợp khi tôi bắt đầu từ CL và từ một mô-đun khác?

+0

Điều này có lẽ sẽ trả lời câu hỏi: http://stackoverflow.com/questions/27465533/run-code-after-flask-application- noredirect = 1 & lq = 1 –

Trả lời

9

Đầu ra trùng lặp từ chức năng của bạn có thể được trình tải lại giải thích. Điều đầu tiên nó làm là bắt đầu chức năng chính trong một chuỗi mới để nó có thể theo dõi các tệp nguồn và khởi động lại luồng khi chúng thay đổi. Tắt tùy chọn này với tùy chọn use_reloader=False.

Nếu bạn muốn để có thể chạy chức năng của bạn khi khởi động máy chủ từ một mô-đun khác nhau, bọc nó trong một hàm, và gọi hàm từ module khác:

def run_server(dom): 
     _run_on_start("%s" % dom) 
     app.run(debug=True, use_reloader=False) 

if __name__ == '__main__': 
    if len(sys.argv) < 2: 
     raise Exception("Must provide domain for application execution.") 
    else: 
     DOM = sys.argv[1] 
     run_server(DOM) 

Các "cách tiếp cận đúng" phụ thuộc vào những gì bạn đang thực sự cố gắng thực hiện ở đây. Máy chủ tích hợp sẵn có nghĩa là chạy ứng dụng của bạn trong một môi trường thử nghiệm cục bộ trước khi triển khai nó vào một máy chủ sản xuất, do đó, vấn đề bắt đầu từ một mô-đun khác không có ý nghĩa gì nhiều.

38

Có lẽ bạn đang tìm kiếm Flask.before_first_request trang trí, như trong:

@app.before_first_request 
def _run_on_start(a_string): 
    print "doing something important with %s" % a_string 
+9

có cách gọi hàm trước khi ứng dụng nhận yêu cầu đầu tiên không? tôi cần phải chạy một chức năng ngay sau khi nginx (ví dụ) bắt đầu? –

+3

Điều này sẽ chỉ được gọi sau khi yêu cầu đầu tiên được thực hiện. Vì vậy, nó không phù hợp trong hầu hết các trường hợp là bạn muốn khởi tạo rất nhiều nhân viên trước khi bắt đầu trả lời. – chefarov

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