kilo almaya başlayınca vücut kütle endeksini ögreniyorsunuz.
vke = kilo / boy^2
şeklinde bir formülü varmış. boy metre cinsinden olmalı.. bunu ögrendiğimize göre oturduğumuz yerden beynimizde ve parmaklarımızda bir miktar kalori yakalım.
bu formül için bir api yapalım… api GET ile yapılan isteğe json dönüşü yapsın. bunu python – flask kullanarak gerçekleştirelim.
from flask import Flask, request, jsonify
app = Flask(__name__)
# Vücut Kitle Endeksi Hesaplama Fonksiyonu
def hesapla_vke(kilo, boy):
try:
# Boy metre cinsinden olmalı, örneğin: 1.75 m
vke = kilo / (boy ** 2)
return vke
except ZeroDivisionError:
return "Boy 0 olamaz!"
except Exception as e:
return str(e)
# VKE Kategorisini Belirleyen Fonksiyon
def vke_kategorisi(vke):
if vke < 18.5:
return "Zayıf"
elif 18.5 <= vke < 24.9:
return "Normal"
elif 25 <= vke < 29.9:
return "Fazla Kilolu"
else:
return "Obez"
# VKE Hesaplamak
@app.route('/hesapla_vke', methods=['GET'])
def hesapla():
# URL parametreleri ile kilo ve boy alıyoruz
kilo = request.args.get('kilo', type=float)
boy = request.args.get('boy', type=float)
# Kilo ve boy parametrelerinin kontrolü
if kilo is None or boy is None:
return jsonify({"error": "Lütfen 'kilo' ve 'boy' parametrelerini giriniz!"}), 400
# VKE'yi hesaplayalım
vke = hesapla_vke(kilo, boy)
if isinstance(vke, str): # Eğer hata mesajı döndüyse
return jsonify({"error": vke}), 400
# Kategoriyi belirleyelim
kategori = vke_kategorisi(vke)
# Sonucu JSON formatında döndürelim
return jsonify({
"kilo": kilo,
"boy": boy,
"vke": vke,
"kategori": kategori
})
if __name__ == '__main__':
app.run(debug=True, port=5000)
aynı isimli tablo varsa sileceğiz ve veri tabanımızla aynı isimli bir tablo oluşturacağız. örneğimizi basit tutmak adına anlık cpu ve hafıza verilerini tablomuzda tutacağımız için tablomuzda bu veriler için gerekli alanları oluşturacağız…
import sqlite3 as lite
import sys
con = lite.connect('system_usage.db')
with con:
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS system_usage")
cur.execute("CREATE TABLE system_usage(timestamp DATETIME, cpu NUMERIC, mem NUMERIC)")
kodumuz yazık şimdi virtualenv i aktif ederek kodumu çalıştıralım…
(env) fcicek@ferhatcicek:~/system_usage$ python psutil_system.py
MEM % used: 86.5
CPU % used: 2.0
anlık olarak cpu ve hazfıza kullanım bilgileriniz artık alabiliyoruz. bu bilgilerini şimdi de veritabanımıza ekleyelim.
bunun için program tarafımızdan sonlandırılana kadar 60 saniyede bir cpu ve hazfıza kullanım değerini okuyarak sqlite veritabanına ekleyecek basit bir kod yazalım.
import time
import sqlite3
import psutil
dbname='system_usage.db'
ornekleme_zamani = 60
def sistem_bilgisi_oku():
mem = psutil.virtual_memory()[2]
cpu = psutil.cpu_percent(1)
if mem is not None and cpu is not None:
return cpu,mem
def veritabani_ekle (cpu, mem):
conn=sqlite3.connect(dbname)
curs=conn.cursor()
curs.execute("INSERT INTO system_usage values(datetime('now'), (?), (?))", (cpu, mem))
conn.commit()
conn.close()
def main():
while True:
cpu, mem = sistem_bilgisi_oku()
veritabani_ekle (cpu, mem)
time.sleep(ornekleme_zamani)
main()
artık verilerimizi bir veri tabanında turuyoruz. şimdi bunu web üzerinden bağlantı yapacak kullanıcılar için görselleştirelim. bunun için flask frameworkunu kullancağız. virtualenv altına flask ve ilişkili paketleri yükleyelim.
from flask import Flask, render_template, request
app = Flask(__name__)
import sqlite3
def getData():
conn=sqlite3.connect('system_usage.db')
curs=conn.cursor()
for row in curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT 1"):
time = str(row[0])
cpu = row[1]
mem = row[2]
print(str(cpu))
print((str(mem))
conn.close()
return time, cpu, mem
@app.route("/")
def index():
time, cpu, mem = getData()
templateData = {
'time': time,
'cpu': cpu,
'mem': mem
}
return render_template('son_olcum.html', **templateData)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
flask frameworkun tema yapısını kullanacağımız için templates dizinini oluşturup içinde gerekli dosyaları oluşturmamız gerekmektedir. python dosyamızda ilişkilendirilen tema dosyası son_olcum.html veiçerisinde kullanılacak verinin templateData olarak belirtildi.
tarayıcımız ile http://sunucuip:5000 adresine bağlandığımız aşagıdaline benzer bir ekran ile karşılaşmamız gerekecek…
kodumuz biraz daha geliştirmenin zamanı geldi. cpu ve hafıza verilerini veritabanımızda tuttugumuz için bu veriyi bir grafik olarka ekrana yansıtabiliriz. bu işlem sırasında mathplotlib paketinde faydalanacağımız için öncelikle kurulumunu yapalım.
şimdi kodumuza yapacağımız ilave , belirtilen örnekleme sayısınca veri tabanından veri çekip bunu grafiği oluşturup son kullanıcıya ileteceğiz. cpu ve hafiza grafiklerini çizdirmek için app.route metodundan faydalanacağız.
from flask.globals import session
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import io
from flask import Flask, render_template, send_file, make_response, request
app = Flask(__name__)
import sqlite3
def sonKayit():
conn=sqlite3.connect('system_usage.db')
curs=conn.cursor()
for row in curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT 1"):
time = str(row[0])
cpu = row[1]
mem = row[2]
conn.close()
return time, cpu, mem
def sonKayitDizi (orneklemeSayisi):
conn=sqlite3.connect('system_usage.db')
curs=conn.cursor()
curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT "+str(orneklemeSayisi))
data = curs.fetchall()
tarihDizi = []
cpuDizi = []
hafizaDizi = []
for row in reversed(data):
tarihDizi.append(row[0])
cpuDizi.append(row[1])
hafizaDizi.append(row[2])
conn.close()
return tarihDizi, cpuDizi, hafizaDizi
def maksimumKayit():
conn=sqlite3.connect('system_usage.db')
curs=conn.cursor()
for row in curs.execute("select COUNT(cpu) from system_usage"):
maksimumKayitDizi=row[0]
conn.close()
return maksimumKayitDizi
global orneklemeSayisi
orneklemeSayisi = maksimumKayit()
if (orneklemeSayisi > 101):
orneklemeSayisi = 100
@app.route("/")
def index():
time, cpu, mem = sonKayit()
templateData = {'time':time,'cpu':cpu,'mem':mem,'orneklemeSayisi':orneklemeSayisi}
return render_template('index.html', **templateData)
@app.route('/', methods=['POST'])
def post_form():
global orneklemeSayisi
orneklemeSayisi = int (request.form['orneklemeSayisi'])
numMaxSamples = maksimumKayit()
if (orneklemeSayisi > numMaxSamples):
orneklemeSayisi = (numMaxSamples-1)
time, cpu, mem = sonKayit()
templateData = {'time':time,'cpu':cpu,'mem':mem,'orneklemeSayisi':orneklemeSayisi}
return render_template('index.html', **templateData)
@app.route('/plot/cpu')
def cpu_cizim():
times, cpuDizi, hafizaDizi = sonKayitDizi(orneklemeSayisi)
ys = cpuDizi
fig = Figure()
axis = fig.add_subplot(1, 1, 1)
axis.set_title("CPU [%]")
axis.set_xlabel("Örnekleme")
axis.grid(True)
xs = range(orneklemeSayisi)
axis.plot(xs, ys)
canvas = FigureCanvas(fig)
output = io.BytesIO()
canvas.print_png(output)
response = make_response(output.getvalue())
response.mimetype = 'image/png'
return response
@app.route('/plot/mem')
def hafiza_cizim():
times, cpuDizi, hafizaDizi = sonKayitDizi(orneklemeSayisi)
ys = hafizaDizi
fig = Figure()
axis = fig.add_subplot(1, 1, 1)
axis.set_title("MEM [%]")
axis.set_xlabel("Örnekleme")
axis.grid(True)
xs = range(orneklemeSayisi)
axis.plot(xs, ys)
canvas = FigureCanvas(fig)
output = io.BytesIO()
canvas.print_png(output)
response = make_response(output.getvalue())
response.mimetype = 'image/png'
return response
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
subject – email subject header
recipients – list of email addresses
body – plain text message
html – HTML message
sender – email sender address, or MAIL_DEFAULT_SENDER by default
cc – CC list
bcc – BCC list
attachments – list of Attachment instances
reply_to – reply-to address
date – send date
charset – message character set
extra_headers – A dictionary of additional headers for the message
mail_options – A list of ESMTP options to be used in MAIL FROM command
rcpt_options – A list of ESMTP options to be used in RCPT commands
simdi bu bilgileri kullanarak basit kodumuzu yazalım.. gerekli kütüphaneleri import ederim
from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
mail= Mail(app)
smtp konfigürasyonumuzu yapalım.. ben aylık 500 kadar bedava eposta gönderilimize izin veren mailtrap servisini için konfigürasyon yapacağım..
eposta içeriğini, gönderici ve alıcıda tanımlayalım
msg = Message('Test Mesajı', sender = 'ferhatcicek@mailtrap.io', recipients = ['iletisim@ferhatcicek.com'])
msg.body = "Bu bir test mesajıdır"
mail.send(msg)
return "Eposta gönderildi."
artık kodumuz hazır durumda…
#app.py - flask-mail kullanarak eposta gönderimi
from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
mail= Mail(app)
app.config['MAIL_SERVER']='smtp.mailtrap.io'
app.config['MAIL_PORT'] = 2525
app.config['MAIL_USERNAME'] = '81e0d22cd4b15b'
app.config['MAIL_PASSWORD'] = '94355a1553f58b'
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USE_SSL'] = False
mail= Mail(app)
@app.route("/")
def index():
try:
msg = Message('Test Mesajı', sender = 'ferhatcicek@mailtrap.io', recipients = ['iletisim@ferhatcicek.com'])
msg.body = "Bu bir test mesajıdır"
mail.send(msg)
return "Eposta gönderildi."
except Exception as e:
return(str(e))
if __name__ == '__main__':
app.run(debug = True)
flask run -h 0.0.0.0 -p 8080 yazarak kodumu çalışrarak tarayıcımıza http://localhost:8080 yazdığımızda epostamızın iletildiğine ait bilgilendirme mesajını alacağız… mesaj gönderme kısmını bir döngü içine alarak toplu eposta gönderimide yapabilirsiniz…
web tabanlı sunucunuzda güvenlik amacı ile indexlemeyi devre dışı bıraktıysanız ve aktif bir dosya yöneticiside kullanmıyorsanız browsepy anlık çözümler için size yardımcı olacaktır. browsepy python ve flask tabalı. çok gelişmiş özellikleri yo ve görsel açıdanda fazla bir şey sunmadığını belirmeliyim. kurulum için
sqlite ile çalışırken bir ide ihtiyacınız olursa ve progralama diliniz python ise web tabanlı sqlite-web isimli basit bir çözüm mevcut. kurulum için
pip install sqlite-web
ve kullanım için ise
sqlite_web veritabani.db -H 0.0.0.0 -p 8080
yeterli olacaktır. sqlite-web flask tabanlı olduğu ihtiaç duyulan kütüphane sayısı fazla olabilir. mevcut projelerinizi bozmamak adına virtualenv ile çalışılması tavsiye edilmektedir.