diff --git a/myapp/__init__.py b/myapp/__init__.py index 92a5bf3..10ebfd1 100644 --- a/myapp/__init__.py +++ b/myapp/__init__.py @@ -26,9 +26,31 @@ formatter = logging.Formatter(app.config['LONG_LOG_FORMAT']) handler.setFormatter(formatter) app.logger.addHandler(handler) +from . import lib, models + +@app.context_processor +def inject_data(): + result = {} + + result['user'] = None + if lib.get_user(): + result['user'] = lib.get_user() + + return result + +@app.teardown_appcontext +def shutdown_session(exception=None): + models.db_session.close_all() + # API from . import ns_api +# Авторизация +from . import ns_login + +# Профиль +from . import ns_profile + # Пользователи from . import ns_user diff --git a/myapp/decorators.py b/myapp/decorators.py new file mode 100644 index 0000000..101532c --- /dev/null +++ b/myapp/decorators.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +__author__ = 'RemiZOffAlex' +__copyright__ = '(c) RemiZOffAlex' +__license__ = 'MIT' +__email__ = 'remizoffalex@mail.ru' +__url__ = 'http://remizoffalex.ru' + +import datetime + +from functools import wraps +from flask import session, redirect + +from . import models + + +def login_required(func): + @wraps(func) + def decorated_function(*args, **kwargs): + if 'logged_in' in session and 'user_id' in session: + user = models.db_session.query( + models.User + ).filter( + models.User.id==session['user_id'] + ).first() + if user: + user.last_activity = datetime.datetime.now() + models.db_session.commit() + return func(*args, **kwargs) + else: + session.pop('logged_in', None) + session.pop('user_id', None) + return redirect('/login') + else: + return redirect('/login') + return decorated_function diff --git a/myapp/lib/__init__.py b/myapp/lib/__init__.py index 74c009c..591684d 100644 --- a/myapp/lib/__init__.py +++ b/myapp/lib/__init__.py @@ -7,6 +7,6 @@ __url__ = 'https://remizoffalex.ru' from .pagination import Pagination, getpage from .passwd import pwgen, get_hash_password from .storage import gettree, gethashtree -from .info import get_user, get_ip +from .info import get_user __all__ = [] diff --git a/myapp/lib/info.py b/myapp/lib/info.py index d4dc207..1377e90 100644 --- a/myapp/lib/info.py +++ b/myapp/lib/info.py @@ -23,14 +23,3 @@ def get_user(): session.pop('user_id', None) return None return result - -def get_ip(): - """ - Получить IP - """ - result = '' - if request.headers.getlist("X-Forwarded-For"): - result = request.headers.get("X-Forwarded-For").split(",")[0] - else: - result = request.remote_addr - return result diff --git a/myapp/lib/passwd.py b/myapp/lib/passwd.py index 8ce9159..a29a1b1 100644 --- a/myapp/lib/passwd.py +++ b/myapp/lib/passwd.py @@ -1,35 +1,32 @@ -#!/usr/bin/env python3 -# -*- coding: UTF-8 -*- - __author__ = 'RemiZOffAlex' __copyright__ = '(c) RemiZOffAlex' __license__ = 'MIT' __email__ = 'remizoffalex@mail.ru' +__url__ = 'https://remizoffalex.ru' +import uuid import random import hashlib -from .. import app - def pwgen(length=15, hex=False): """ Генератор пароля """ - keylist='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + keylist = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' if hex: - keylist='0123456789ABCDEF' - password=[] + keylist = '0123456789ABCDEF' + password = [] while len(password) < length: a_char = random.choice(keylist) password.append(a_char) return ''.join(password) -def get_hash_password(password, salt = None): +def get_hash_password(password, salt=None): """ Получить хеш пароля SHA-512 """ - if salt == None: + if salt is None: salt = uuid.uuid4().hex text = password.encode('utf-8') + salt.encode('utf-8') h = hashlib.sha512() diff --git a/myapp/ns_login/__init__.py b/myapp/ns_login/__init__.py new file mode 100644 index 0000000..98efb65 --- /dev/null +++ b/myapp/ns_login/__init__.py @@ -0,0 +1,18 @@ +__author__ = 'RemiZOffAlex' +__copyright__ = '(c) RemiZOffAlex' +__license__ = 'MIT' +__email__ = 'remizoffalex@mail.ru' +__url__ = 'https://remizoffalex.ru' + +import os +import jinja2 + +from . import views +from .. import app + + +my_loader = jinja2.ChoiceLoader([ + app.jinja_loader, + jinja2.FileSystemLoader(os.path.dirname(os.path.abspath(__file__)) + "/templates"), +]) +app.jinja_loader = my_loader diff --git a/myapp/ns_login/forms.py b/myapp/ns_login/forms.py new file mode 100644 index 0000000..a4b0f81 --- /dev/null +++ b/myapp/ns_login/forms.py @@ -0,0 +1,17 @@ +__author__ = 'RemiZOffAlex' +__copyright__ = '(c) RemiZOffAlex' +__license__ = 'MIT' +__email__ = 'remizoffalex@mail.ru' +__url__ = 'http://remizoffalex.ru' + +from wtforms import ( + validators, + Form, + StringField, + PasswordField +) + + +class LoginForm(Form): + username = StringField('Логин', [validators.Length(min=4, max=25)]) + password = PasswordField('Пароль', [validators.DataRequired()]) diff --git a/myapp/templates/login.html b/myapp/ns_login/templates/login.html similarity index 88% rename from myapp/templates/login.html rename to myapp/ns_login/templates/login.html index 72b843b..9cd9726 100644 --- a/myapp/templates/login.html +++ b/myapp/ns_login/templates/login.html @@ -2,10 +2,9 @@ {% block body %}
Зарегистрирован: {{ user.created.strftime('%Y-%m-%d') }}
+ +{% endblock body %} diff --git a/myapp/ns_profile/views.py b/myapp/ns_profile/views.py new file mode 100644 index 0000000..f67e321 --- /dev/null +++ b/myapp/ns_profile/views.py @@ -0,0 +1,22 @@ +__author__ = 'RemiZOffAlex' +__copyright__ = '(c) RemiZOffAlex' +__license__ = 'MIT' +__email__ = 'remizoffalex@mail.ru' +__url__ = 'http://remizoffalex.ru' + +from flask import render_template + +from .. import app +from ..decorators import login_required + + +@app.route('/profile') +@login_required +def profile(): + """ + Личный профиль пользователя + """ + pagedata = {} + pagedata['title'] = 'Мой профиль - {}'.format(app.config['TITLE']) + body = render_template('profile.html', pagedata=pagedata) + return body diff --git a/myapp/templates/edit.html b/myapp/templates/edit.html index 94ad96c..416b4ad 100644 --- a/myapp/templates/edit.html +++ b/myapp/templates/edit.html @@ -13,14 +13,28 @@