add celery

This commit is contained in:
vanzhiganov 2017-09-03 18:46:19 +03:00
parent 80a11afca3
commit b63239009f
8 changed files with 124 additions and 42 deletions

View file

@ -3,18 +3,39 @@
## Requirements
- Ubuntu/Debian Linux
- Postgresql
- PostgreSQL
- Python 2.7
- Wargaming Developers Account
## Install
For postgres installation
https://developer.fedoraproject.org/tech/database/postgresql/about.html
``````
```
pip install -r requirements.txt
```
### Run
Application
```
python app.py
python run_app.py
```
Celery Worker
```
celery worker -A run_celery.celery -l info
```
Celery Beat
```
celery beat -A run_celery.celery -l debug
```

View file

@ -1,4 +1,4 @@
"""empty message
"""New table userwotdetails
Revision ID: b3222bf2cedb
Revises: 5766fed0b2ef
@ -17,10 +17,30 @@ depends_on = None
def upgrade():
# op.add_column('user', sa.Column('token', sa.String(256), nullable=True, ))
op.create_table(
'user_wot_details',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('user', sa.Integer(), nullable=True),
sa.Column('nickname', sa.String(32), unique=True),
sa.Column('client_language', sa.String(length=3)),
sa.Column('last_battle_time', sa.Integer),
sa.Column('account_id', sa.Integer),
sa.Column('created_at', sa.Integer),
sa.Column('updated_at', sa.Integer),
sa.Column('logout_at', sa.Integer),
sa.Column('private', sa.String(32)),
sa.Column('global_rating', sa.String(32)),
sa.Column('clan_id', sa.Integer),
sa.PrimaryKeyConstraint('id'),
sa.ForeignKeyConstraint(['user'], ['user.id']),
sa.UniqueConstraint('nickname')
)
pass
def downgrade():
# op.drop_column('user', 'token')
op.drop_table('user_wot_details')
pass
# op.add_column('user', sa.Column('token', sa.String(256), nullable=True, ))
# op.drop_column('user', 'token')

5
app.py
View file

@ -1,5 +0,0 @@
from wotstats.init import init_app
if __name__ == '__main__':
app = init_app()
app.run(host='0.0.0.0', debug=True)

View file

@ -1,27 +1,24 @@
import os
# from celery import Celery
from flask import Flask, render_template, g, session
from wotstats.database import db, migrate
from wotstats.openid import oid
from wotstats.pending_tasks import celery
from wotstats.views.home import pages_home
from wotstats.views.account import pages_account
from wotstats.views.wallet import pages_wallet
def init_app():
app = Flask(__name__)
app.debug = True
app.config['SECRET_KEY'] = 'super-secret'
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://wot:wot@192.168.1.47/wot'
app.config['OPENID_FS_STORE_PATH'] = 'tmp'
# TODO: rename to WG_APPLICATION_ID
app.config['WG_ID'] = '502910c1c785c3c7ca2e83c9e89bde02'
# app.config['WG_OPENID_URL'] = 'https://eu.wargaming.net/id/openid/'
app.config['WG_OPENID_URL'] = 'https://wargaming.net/id/openid/'
app.config['WG_TOKEN_URL'] = 'https://api.worldoftanks.ru/wot/auth/login/'
app.config.from_pyfile(os.getenv('WOTS_CONFIG', '../config_file.ini'))
# , safe_roots=[]
oid.init_app(app)
db.init_app(app)
migrate.init_app(app, db)
init_celery(app)
# jwt = JWT(app, authenticate, identity)
app.register_blueprint(pages_home)
@ -37,4 +34,18 @@ def init_app():
openid = session['openid']
g.user = User.query.filter_by(openid=openid).first()
return app
return app, celery
def init_celery(app):
celery.conf.update(app.config.get_namespace('CELERY_'))
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
from wotstats import tasks

View file

@ -1 +1,6 @@
from .user import User
from .userwottokens import UserWotTokens
from .userwotdetails import UserWotDetails
from .userwotstats import UserWotStats
from .userwotdata import UserWotData

View file

@ -1,14 +1,17 @@
from sqlalchemy.dialects.postgresql import ARRAY, HSTORE
from wotstats.database import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
# 0 Inaactive, 1 Active, 2 Blocked
# 0 Inactive, 1 Active, 2 Blocked
status = db.Column(db.Integer, default=0, nullable=False)
email = db.Column(db.String(256), unique=True, nullable=False)
password = db.Column(db.String(32), nullable=False)
name = db.Column(db.String(256), unique=True, nullable=False)
openid = db.Column(db.String(256), unique=True, nullable=True)
# WoT Token
token = db.Column(db.String(256), nullable=True)
def __init__(self, email):

View file

@ -6,6 +6,7 @@ from flask import (
from jinja2 import TemplateNotFound
from wotstats.openid import oid
from wotstats.log import log
from wotstats.database import db
from wotstats.models import User
from wotstats.lib import parse_wargaming_openid_url
@ -13,11 +14,12 @@ from wotstats.lib import parse_wargaming_openid_url
pages_account = Blueprint('pages_account', __name__, url_prefix='/account', template_folder='templates')
def __get_player_personal_data():
log.debug(session['openid'])
user_id = parse_wargaming_openid_url(session['openid'])[0]
# current_app.config['WG_ID']
__ = requests.get(
'https://api.worldoftanks.ru/wot/account/info/?application_id={}&account_id={}'.format(
current_app.config['WG_ID'], user_id
current_app.config['WG_APPLICATION_ID'], user_id
)
).json()
return __.get('data', {}).get(user_id)
@ -25,6 +27,11 @@ def __get_player_personal_data():
@pages_account.route('/')
def index():
from wotstats.tasks import hello
# from wotstats.tasks import *
hello.delay()
if not g.user:
return redirect(url_for('pages_home.index'))

View file

@ -8,7 +8,7 @@ from jinja2 import TemplateNotFound
from wotstats.openid import oid
from wotstats.database import db
from wotstats.models import User
from wotstats.models import *
pages_home = Blueprint('pages_home', __name__, template_folder='templates')
@ -81,6 +81,7 @@ def create_profile():
def logout():
session.pop('openid', None)
session.pop('token', None)
session.pop('user', None)
# flash(u'You were signed out')
return redirect(oid.get_next_url())
@ -90,21 +91,37 @@ def token():
print request.args
print request.form
if 'openid' not in session:
if 'openid' not in session or 'user' in session:
return redirect(url_for('pages_home.index'))
# ImmutableMultiDict([('status', u'ok'), ('access_token', u'a4d0a13df7c733102fbf6cd650794c6d047e91aa'), ('nickname', u'CrazyPants1999'), ('account_id', u'69552613'), ('', u'1505047809')])
if request.args.get('status') == 'ok' and request.args.get('access_token'):
token = UserWotTokens.query.filter_by(user=session['user'])
access_token = request.args.get('access_token')
expires_at = request.args.get('expires_at')
if token.count() == 0:
t = UserWotTokens()
t.user = session['user']
t.access_token = access_token
t.expires_at = expires_at
db.session.add(t)
db.session.commit()
else:
token.access_token = access_token
token.expires_at = expires_at
db.session.commit()
session['token'] = {
'access_token': request.args.get('access_token'),
'expires_at': request.args.get('expires_at'),
'access_token': access_token,
'expires_at': expires_at
}
return redirect(oid.get_next_url())
redirect_url = 'http://truesoft.org:5000/token'
# redirect_url = 'http://truesoft.org:5000/token'
response = requests.get('{}?application_id={}&nofollow=1&redirect_uri={}'.format(
current_app.config['WG_TOKEN_URL'],
current_app.config['WG_ID'], redirect_url)).json()
current_app.config['WG_APPLICATION_ID'], current_app.config['WG_REDIRECT_URL'])).json()
if response.get('status') == 'ok':
return redirect(response.get('data', {}).get('location'))
@ -115,18 +132,21 @@ def token():
def create_or_login(resp):
session['openid'] = resp.identity_url
session['token'] = None
session['user'] = None
user = User.query.filter_by(openid=resp.identity_url).first()
if user is not None:
# flash(u'Successfully signed in')
g.user = user
if not session['token']:
return redirect(url_for('pages_home.token'))
return redirect(oid.get_next_url())
if not user:
return redirect(url_for(
'pages_home.create_profile',
next=oid.get_next_url(),
name=resp.fullname or resp.nickname,
email=resp.email))
session['user'] = user.id
# flash(u'Successfully signed in')
g.user = user
if not session['token']:
return redirect(url_for('pages_home.token'))
return redirect(oid.get_next_url())