2015-09-13 26 views
6

nềnFlask: Một API RESTful và SocketIO server

tôi đang cố gắng để tạo ra một REST API đơn giản bằng cách sử dụng phần mở rộng Flask-RESTful. API này sẽ hoạt động chủ yếu để quản lý CRUD và xác thực người dùng cho một dịch vụ đơn giản.

Tôi cũng đang cố gắng tạo một vài ổ cắm web bằng cách sử dụng phần mở rộng Flask-SocketIO mà những người dùng này có thể kết nối và xem các cập nhật theo thời gian thực cho một số dữ liệu liên quan đến những người khác sử dụng dịch vụ. Vì vậy, tôi cần biết rằng những người dùng này được xác thực và được ủy quyền để kết nối với một số ổ cắm nhất định.

Vấn đề

Tuy nhiên, tôi đang gặp một chút rắc rối việc thiết lập. Có vẻ như tôi không thể có hai thành phần này (REST API và máy chủ SocketIO) làm việc cùng nhau trên cùng một cá thể Flask. Lý do tôi nói điều này là bởi vì khi tôi chạy sau, hoặc REST API hoặc máy chủ SocketIO sẽ làm việc, nhưng không phải cả hai:

from flask import Flask 
from flask_restful import Api 
from flask.ext.socketio import SocketIO 

app = Flask(__name__) 

api = Api(app) 
socketio = SocketIO(app) 

# some test resources for the API and 
# a test emitter statement for the SocketIO server 
# are added here 

if __name__ == '__main__': 
    app.run(port=5000) 
    socketio.run(app, port=5005) 

Câu hỏi

Là giải pháp điển hình cho loại thiết lập để có hai trường hợp riêng biệt của Flask đi cùng một lúc? Ví dụ, máy chủ SocketIO của tôi có yêu cầu API REST của tôi để kiểm tra xem một người dùng cụ thể có được xác thực/ủy quyền để kết nối với một ổ cắm cụ thể không?

+0

Điều gì xảy ra nếu bạn * chỉ * sử dụng 'socketio.run (ứng dụng, cổng = 5005)' và cố gắng nhấn REST API trên cổng 5005? –

+0

@SeanVieira Vì lý do nào đó, nó hoạt động tốt ... Tôi cho rằng tôi sẽ giữ API và ổ cắm trên cùng một cổng rồi – nmagerko

Trả lời

11

Bạn chỉ muốn chạy socketio.run(app, port=5005) và nhấn REST API trên cổng 5005.

Lý do làm việc này là bởi vì dưới mui xe, Flask-SocketIO đang chạy một máy chủ web evented dựa trên gevent (hoặc với việc phát hành 1,0 , cũng eventlet) - máy chủ này xử lý yêu cầu websocket trực tiếp (sử dụng các trình xử lý bạn đăng ký thông qua trang trí socketio.on) và đang chuyển yêu cầu không phải là websocket tới Flask.

Lý do mã của bạn không làm việc là vì cả hai app.runsocketio.runchặn hoạt động. Cho dù cái nào chạy đầu tiên là looping, chờ đợi cho các kết nối, không bao giờ cho phép thứ hai để bắt đầu. Nếu bạn thực sự cần cần để chạy các kết nối websocket của bạn trên một cổng khác, bạn cần phải sinh ra một trong hai socketio hoặc lệnh gọi run trên một quy trình khác.

+4

Câu trả lời hay, nhưng tôi muốn lưu ý rằng Flask-SocketIO sắp phá vỡ sự phụ thuộc độc quyền vào gevent. Phát triển phát hành 1.0a1 của phần mở rộng có thể sử dụng gevent, eventlet hoặc thậm chí Werkzeug đơn giản (mặc dù sau này chạy mà không cần hỗ trợ WebSocket). – Miguel

+0

Câu trả lời hay nhất. – piyush121

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