توی این فکر بودم که برنامه ای بنویسم که هر دو بکند Nodejs و Python را ساپورت نماید. البته راهکارهای مختلفی ممکن است بوجود بیاید ولی این راه حلی که به ذهنم خورد در این مورد را بیشتر پسندیدم.
برای برنامه های تحت وب، استفاده از Nodejs و استفاده از کتابخانه ی Expressjs رو توصیه میکنم به دوستان اون هم به این دلیل که پرفورمنس خوبی ازش دیدم و امکانات و افزونه های زیادی که برای کار با Expressjs وجود داره کار رو برای برنامه نویس خیلی راحت میکنه...
از طرفی خود Nodejs با ویژگی Async / Await که به صورت ذاتی روی خودش داره، جلوی بن بست IO را میگیره که اصطلاحا بهش میکن None Blocking IO هست. پس برای بوجود آوردن یک برنامه ی تحت وب استفاده از Nodejs رو توصیه کردم اما از طرفی پایتون هم امکانات جالبی در حوزه ماشین لرنینگ و علم داده ارائه میده که انصافا جاش خالیه داخل Nodejs...
لذا از امکانات پایتون هم میتونیم در کنار وب اپلکیشنمون استفاده کنیم. اما چطور؟
باید دنبال راهی بود که بتوان از طریق یک کلاینت که فرض کنید همان مرورگر وب هست، به هردو بکند ریکوئست زد و از امکانات هر کدام به طور مجزا استفاده کرد.
این راه حل حتی برای ویندوز اپلکیشن هم مورد استفاده قرار میگیرد.
اگر ما از فریم ورک Electronjs استفاده کنیم، که آموزشش رو در همینجا قرار داده ام، میبینیم که کلاینت ما باز هم یک صفحه ی وب هست که توسط موتور کرومیوم باز شده و فرم ویندوز اپلکیشن ما لود میشود.
حالا که مطمئین شدیم هم در حالت ویندوز اپلکیشن و هم در حالت وب اپلکیشن میتونیم از امکانات مرورگرها استفاده کنیم، باید دنبال ابزاری باشیم تا بتونیم باهاش با بکندهای متفاوت نیز ارتباط بگیریم.
خب حالا یکی از ابزارهای خوب در این حوزه چیه؟
همانطور که ممکن هست حدس زده باشید اون ابزار همان Socket IO هستش که آموزشش را در سایت قرار داده ایم.
برای راه اندازی socket.io در Nodejs که میتونیم از نمونه کدهای زیر استفاده کنیم.
پس از نصب Nodejs میتونیم با دستور زیر کتابخانه های مورد نظرمو رو نصب کنیم.
npm install express
npm install socket.io
const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', (socket) => {
console.log('a user connected');
socket.on('myEvent1', (socket) => {
console.log('event1 occured');
socket.emit("emittedData1" , {title:"i am from nodejs"});
});
});
server.listen(3000, () => {
console.log('listening on *:3000');
});
تا اینجا بکند اول ما روی بستر Nodejs در پورت 3000 راه اندازی شده است.
برای راه اندازی Socket IO در Python از فریم ورک فلسک استفاده میکنیم.
برای این کار ابتدا اقدام به نصب بسته flask-socketio میکنیم.
pip install flask-socketio
سپس فایلی به نام app.py ایجاد میکنیم و کدهای زیر را درون آن مینویسیم.
نکته: فعلا اسم فایل را همان app بگذارید تا در ادامه راه تغییر دادن آن را توضیح دهم.
from flask import Flask, render_template
from flask_socketio import SocketIO , emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app , cors_allowed_origins="*")
@socketio.on('myEvent2')
def myEvent2(json):
print('received json: ' + str(json))
emit("emittedData2",{"title":"i am from python"})
if __name__ == '__main__':
socketio.run(app)
تا اینجا بکند دوم ما روی بستر Python در پورت 5000 راه اندازی شده است.
نکته اول: پورت پیش فرض همان 5000 است.به همین دلیل شما عدد 5000 را در نمونه کد بالا مشاهده نمیکنید.
نکته دوم: با توجه به اینکه برای فرانت اند میخواهیم از فریم ورک ویو جی اس استفاده کنیم و این فریم ورک پیش فرض از پورت 8080 استفاده میکند، لذا حتما عبارت cors_allowed_origins را بایستی استفاده نمایید.
برای اجرا کردن کد بالا، ترمینال برنامه را باز کرده و مینویسیم:
flask run
اگر اسم فایل پایتون را چیزی غیر از app گذاشته اید، یا بر روی پورتی غیر از 5000 میخواهید برنامه را اجرا کنید بایستی این دستور را در ترمینال وارد نمایید.
flask run --app myapp --port 5001
پس از اینکه ویو جی اس را از طریق CLI نصب کردیم و آن را بالا آوردیم با دستور زیر بسته ی socket.io-client را نصب میکنیم.
npm install socket.io-client
<script setup>
const { io } = require("socket.io-client");
const socket1 = io("http://localhost:3000");
const socket2 = io("http://localhost:5000");
socket1.emit("myEvent1")
socket1.on("emittedData1" , function(options){
console.log(options);
});
socket2.emit("myEvent2")
socket2.on("emittedData2" , function(options){
console.log(options);
});
</script>
در قطعه کد فوق، 2 سوکت ایجاد میشوند که یکی به بکند Nodejs و دیگری به بکند Python متصل شده و هر کدام از پیامی را به سمت کلاینت برگردانده و آن پیام در بخش Console مرورگر قابل نمایش است.