Код:
#!/usr/bin/env python
# -*- coding: utf8 -*-
from flask import Flask, request, current_app, Response
from pymssql import connect as pymssql_connect
from datetime import *
import os, sys, decimal
app = Flask(__name__)
FORMAT_DATE = "%d.%m.%Y"
FORMAT_TIME = "%H:%M:%S"
FORMAT = FORMAT_DATE+" "+FORMAT_TIME
mbalance_htm = u"""<!DOCTYPE html>
<html>
<head><title>Проверка баланса карт</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, maximum-scale=1" />
</head>
<body>
<form method="get">
<h3>Проверка баланса</h3>
<input size="15" type="text" autofocus="true" name="card" maxlength="7" placeholder="номер карты" value="{}"/>
<input type="submit" value="Баланс"/>
</form>
<div id="balance">
{}
</div>
</body>
</html>"""
def decimal_default(obj):
if isinstance(obj, decimal.Decimal):
return float(obj)
if isinstance(obj, datetime):
return obj.strftime(FORMAT)
return str(obj)
def get_db():
"""Opens a new database connection if there is none yet for the
current application context.
"""
db = getattr(current_app, 'mssql_db', None)
if db is None:
dbcfg = current_app.mssql_config
db = current_app.mssql_db = pymssql_connect(
host="192.168.0.2",
user="user",
password="password",
database='gkArcade',
as_dict=True,
charset='cp1251',
timeout=10,
login_timeout=7
)
db.autocommit(True)
return db
@app.teardown_appcontext
def close_db_connection(exception):
"""Closes the database again at the end of the request."""
db = getattr(current_app, 'mssql_db', None)
if db is not None:
current_app.mssql_db = None
db.close()
def get_info(db, card):
cur = db.cursor()
cur.execute(
"SELECT A.*,"
" L1.[NAME] as LEVEL_NAME,"
" L2.[NAME] as LEVEL2_NAME"
" FROM [gkArcade].[gk].GK_CARDS A"
" LEFT JOIN [gkArcade].[gk].LEVELS L1 ON A.[LEVEL]=L1.[LEVEL]"
" LEFT JOIN [gkArcade].[gk].LEVELS L2 ON A.[LEVEL2]=L2.[LEVEL]"
" WHERE ([Card]=%(card)s)",
{
'card':card,
}
)
account = cur.fetchone()
if account:
card = account['Card']
else:
return False
cur.execute(
" SELECT CS.*, L.NAME AS LEVEL_NAME, S.NAME AS SUB_NAME"
" FROM [gkArcade].[gk].[GK_CARDS_SUBSCRIPTIONS] CS"
" left join [gkArcade].[gk].[GK_SUBSCRIPTIONS] S on CS.SUBSCRIPTION=S.SUBSCRIPTION"
" left join [gkArcade].[gk].LEVELS L on CS.[LEVEL]=L.[LEVEL]"
" WHERE ([CARD] = %(card)s)",
{
'card':card,
}
)
result = cur.fetchall()
if len(result) > 0:
info = ""
else:
info = u'Нет'
for row in result:
info += u'\n + {}: {} , Осталось '.format(row['SUB_NAME'], row['LEVEL_NAME'])
if row['QNT'] != None:
info += u'{:.0f} игр, '.format(row['QNT'])
if row['DAILY_COUNT'] != None:
info += u'из {:.0f}'.format(row['DAILY_COUNT'])
stop = row['DATE_STOP']
start = row['DATE_START']
if start == None:
start = datetime.now()
if stop != None and stop.year == 1900:
delta = stop - datetime(1900, 1, 1, 0, 0)
else:
delta = stop - start
remains = delta - (datetime.now() - start)
remains -= timedelta(microseconds=remains.microseconds)
info += u'времени {}'.format(remains)
account['sub'] = info
return account
@app.route('/', methods=['GET'])
def mbalance():
card = request.args.get('card', request.args.get('c', request.args.get('q', '')))
if len(card.split("=")) > 2:
card = card.split("=")[2]
try:
card = int(card)
except:
card = 0
if card != '':
result = get_info(get_db(), card)
else:
result = False
if result:
card = result['Card']
if result['Level2'] is None:
level = result['LEVEL_NAME']
else:
if result['L2_ExpGames'] is None:
games = u'действителен'
else:
games = u'осталось {} игр'.format(result['L2_ExpGames'])
level = u'{} - {} до {} с переходом на {}'.format(
result['LEVEL2_NAME'],
games,
result['Level2ExpDate'],
result['LEVEL_NAME']
)
balance = u'Баланс: {:.0f} рублей<br/>Тикетов: {:.0f} купонов<br/>Последнее использование:<br/> {}<br/>Тариф: {}<br/>Сыграно игр: {:.0f}<br/>Абонементы: {}'.format(
result['Points'],
result['Coupons'],
result['CardLastUse'].strftime(FORMAT),
level,
result['Tokens'],
result['sub']
)
else:
balance = u'Карта не найдена'
return mbalance_htm.format(card, balance)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80, debug=False)
Безопасность настроена средствами MSSQL