Tôi muốn thực hiện lệnh có thể dừng ứng dụng bình bằng cách sử dụng bộ mã dạng bình. Tôi đã tìm kiếm giải pháp một lúc. Vì khung công tác không cung cấp API "app.stop()", tôi tò mò về cách viết mã này. Tôi đang làm việc trên Ubuntu 12.10 và Python 2.7.3.Cách dừng ứng dụng bình mà không sử dụng ctrl-c
Trả lời
Nếu bạn chỉ chạy các máy chủ trên máy tính của bạn, bạn có thể tiếp xúc với một thiết bị đầu cuối để giết các máy chủ (đọc thêm tại Shutdown The Simple Server):
from flask import request
def shutdown_server():
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running with the Werkzeug Server')
func()
@app.route('/shutdown', methods=['POST'])
def shutdown():
shutdown_server()
return 'Server shutting down...'
Đây là cách tiếp cận khác được chứa hơn:
from multiprocessing import Process
server = Process(target=app.run)
server.start()
# ...
server.terminate()
server.join()
Hãy cho tôi biết nếu điều này có ích.
Bạn có biết có cách nào để lấy thuộc tính 'werkzeug.server.shutdown' mà không cần bối cảnh yêu cầu không? – akatkinson
Tôi đã phải thay đổi phương thức định tuyến thành 'GET' để làm cho nó hoạt động. –
Để hoàn thành câu trả lời này thiếu chức năng bạn sẽ gọi bên ngoài ngữ cảnh yêu cầu để tắt máy, điều này sẽ không có gì hơn yêu cầu HTTP tới máy chủ (có thể bắt nguồn từ/đến localhost) – JamesHutchison
Khi những người khác đã chỉ ra, bạn chỉ có thể sử dụng werkzeug.server.shutdown
từ trình xử lý yêu cầu. Cách duy nhất tôi đã tìm thấy để tắt máy chủ tại một thời điểm khác là gửi một yêu cầu cho chính mình. Ví dụ, /kill
xử lý trong đoạn mã này sẽ giết chết các máy chủ dev trừ khi yêu cầu khác đi kèm trong trong lần thứ hai tiếp theo:
import requests
from threading import Timer
import time
LAST_REQUEST_MS = 0
@app.before_request
def update_last_request_ms():
global LAST_REQUEST_MS
LAST_REQUEST_MS = time.time() * 1000
@app.route('/seriouslykill', methods=['POST'])
def seriouslykill():
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running with the Werkzeug Server')
func()
return "Shutting down..."
@app.route('/kill', methods=['POST'])
def kill():
last_ms = LAST_REQUEST_MS
def shutdown():
if LAST_REQUEST_MS <= last_ms: # subsequent requests abort shutdown
requests.post('http://localhost:5000/seriouslykill')
else:
pass
Timer(1.0, shutdown).start() # wait 1 second
return "Shutting down..."
. _very_ hacky. Tôi biết nó đã được một thời gian, nhưng bạn đã bao giờ tìm thấy một cách sạch sẽ làm điều này, mà không cần gửi một yêu cầu cho chính mình? – Juicy
Phương pháp của tôi có thể được tiến hành thông qua thiết bị đầu cuối bash/console
1) chạy và nhận số quá trình
$ ps aux | grep yourAppKeywords
2a) giết chết quá trình
$ kill processNum
2b) giết chết quá trình nếu ở trên không làm việc
$ kill -9 processNum
Tôi gần như chắc chắn rằng câu hỏi không phải là "làm thế nào để giết một quá trình", và vấn đề là làm ctrl + c không giết nó. Btw, tôi sử dụng 'kill -9 \' lsof -i: 5000 -t \ '' cuz không chỉ khác 1 ứng dụng có thể sử dụng cổng và dễ dàng. – erm3nda
Đây là một câu hỏi cũ, nhưng googling đã không cho tôi bất kỳ cái nhìn sâu sắc về cách thức thực hiện điều này.
Vì tôi không đọc chính xác code here! (Doh!) gì nó làm là để nâng cao một RuntimeError
khi không có werkzeug.server.shutdown
trong request.environ
...
Vì vậy, những gì chúng ta có thể làm gì khi không có request
là nâng cao một RuntimeError
def shutdown():
raise RuntimeError("Server going down")
và nắm bắt điều đó khi số app.run()
trả về:
...
try:
app.run(host="0.0.0.0")
except RuntimeError, msg:
if str(msg) == "Server going down":
pass # or whatever you want to do when the server goes down
else:
# appropriate handling/logging of other runtime errors
# and so on
...
Không cần gửi cho bạn yêu cầu.
tôi đã làm nó hơi khác nhau sử dụng đề
from werkzeug.serving import make_server
class ServerThread(threading.Thread):
def __init__(self, app):
threading.Thread.__init__(self)
self.srv = make_server('127.0.0.1', 5000, app)
self.ctx = app.app_context()
self.ctx.push()
def run(self):
log.info('starting server')
self.srv.serve_forever()
def shutdown(self):
self.srv.shutdown()
def start_server():
global server
app = flask.Flask('myapp')
...
server = ServerThread(app)
server.start()
log.info('server started')
def stop_server():
global server
server.shutdown()
tôi sử dụng nó để làm đầu đến cuối bài kiểm tra cho api yên tĩnh, nơi tôi có thể gửi các yêu cầu sử dụng thư viện yêu cầu python.
Tôi không quản lý để có được những thứ khác để làm việc nhưng giải pháp này hoạt động tuyệt vời! Cảm ơn một tấn! Đối với những người khác: nó cũng làm việc với bình yên tĩnh! –
Điều này dường như chặn trên cửa sổ cho đến khi tôi nhấn nó với một yêu cầu khác ... bất kỳ cách nào xung quanh điều đó? – Claudiu
Tôi gặp vấn đề tương tự với @Claudiu, ngoại trừ Linux với python 3.6.2 – micahscopes
- 1. sử dụng cx_freeze trên ứng dụng bình
- 2. Bình: Sử dụng nhiều gói trong một ứng dụng
- 3. Cách dừng quá trình sử dụng "Nút dừng"
- 4. C# đọc đầu vào của người dùng mà không cần dừng ứng dụng
- 5. Cách xử lý thanh toán mà không sử dụng trong mua ứng dụng trong ứng dụng ios?
- 6. Sử dụng java.util.concurrent.Executor dừng tomcat từ dừng
- 7. Giết ứng dụng android khi tạm dừng
- 8. Cấu trúc của các ứng dụng bình
- 9. Xây dựng các ứng dụng iOS bằng cách sử dụng xcodebuild mà không cần mã số
- 10. cách tạo ứng dụng dựa trên mvc mà không sử dụng khung công tác
- 11. Có thể dừng javascript bằng Firebug mà không cần sử dụng điểm ngắt không?
- 12. sử dụng bình phương sqlalchemy mà không có cơ sở khai báo lớp con
- 13. Bình: Cách xử lý ứng dụng/octet-stream
- 14. Tạm dừng ứng dụng Android với Phonegap
- 15. Dừng Ứng dụng VB6 Trả lời
- 16. Regex - Sử dụng/* trong JS mà không nhận được mã của tôi trong bình luận
- 17. Ứng dụng AutoStart không hoạt động bình thường
- 18. Ứng dụng nền mà không cần ui
- 19. Dừng Eclipse khi mở ứng dụng Android
- 20. tiếc là ứng dụng đã dừng
- 21. Cách dừng gỡ lỗi trong ứng dụng Android trong Eclipse
- 22. Dừng ứng dụng chạy trong nền?
- 23. applicationWillTerminate không được gọi khi ứng dụng dừng từ Xcode
- 24. Cần chạy ứng dụng Iphone trên trình mô phỏng mà không cần sử dụng xcode
- 25. Sử dụng libtool mà không cần sử dụng liên kết
- 26. Sử dụng SDL_INIT_JOYSTICK mà không SDL_INIT_VIDEO
- 27. UIImagePickerController không liên tục dừng đáp ứng sau khi chạm vào nút "Sử dụng"
- 28. .NET mà không sử dụng DLL
- 29. Giảm mức sử dụng bộ nhớ trong ứng dụng iOS mà không bị rò rỉ
- 30. "sử dụng không gian tên" cho các bình luận Doxygen
Tại sao bạn cần có thể dừng ứng dụng của mình khỏi tập lệnh? (Công cụ tốt nhất cho công việc sẽ phụ thuộc vào những gì bạn đang cố gắng làm). –
Nghiêm túc, bạn đang cố gắng làm gì ở đây? Nếu bạn đang nói về devserver cho phát triển, nó là hoàn toàn tốt đẹp để ngăn chặn nó như thế. Trong quá trình sản xuất, bạn không triển khai như thế này và bạn có thể dừng yêu cầu bất cứ lúc nào bạn muốn, vì vậy ứng dụng "ngừng chạy". –
@SeanVieira Tôi muốn biết nếu có bất kỳ giải pháp để làm điều này. – vrootic